[tbb] 34/64: Imported Upstream version 4.1~20130516
Graham Inggs
ginggs at moszumanska.debian.org
Mon Jul 3 12:27:58 UTC 2017
This is an automated email from the git hooks/post-receive script.
ginggs pushed a commit to branch master
in repository tbb.
commit 287f245182a494b286f9563b9ec2e1ae331e7411
Author: Graham Inggs <ginggs at debian.org>
Date: Mon Jul 3 14:13:51 2017 +0200
Imported Upstream version 4.1~20130516
---
CHANGES | 317 +-
Makefile | 2 +-
build/AIX.gcc.inc | 2 +-
build/AIX.inc | 5 +-
build/FreeBSD.gcc.inc | 2 +-
build/FreeBSD.inc | 5 +-
build/Makefile.rml | 13 +-
build/Makefile.tbb | 2 +-
build/Makefile.tbbmalloc | 36 +-
build/Makefile.tbbproxy | 3 +-
build/Makefile.test | 53 +-
build/SunOS.gcc.inc | 2 +-
build/SunOS.inc | 5 +-
build/SunOS.suncc.inc | 3 +-
build/{linux.gcc.inc => android.gcc.inc} | 95 +-
build/android.inc | 77 +
build/{macos.inc => android.linux.inc} | 82 +-
build/android.linux.launcher.sh | 164 +
build/{macos.inc => android.macos.inc} | 91 +-
build/{macos.inc => android.windows.inc} | 90 +-
build/big_iron.inc | 2 +-
build/common.inc | 63 +-
build/common_rules.inc | 2 +-
build/detect.js | 8 +-
build/generate_tbbvars.bat | 5 +-
build/generate_tbbvars.sh | 7 +-
build/index.html | 82 +-
build/linux.gcc.inc | 16 +-
build/linux.icc.inc | 2 +-
build/linux.inc | 12 +-
build/linux.xl.inc | 5 +-
build/macos.clang.inc | 13 +-
build/macos.gcc.inc | 13 +-
build/macos.icc.inc | 2 +-
build/macos.inc | 23 +-
build/{AIX.gcc.inc => mic.icc.inc} | 63 +-
.../count_strings/Makefile => build/mic.linux.inc | 46 +-
build/mic.linux.launcher.sh | 111 +
build/mic.offload.inc | 170 +
build/test_launcher.bat | 27 +-
build/test_launcher.sh | 42 +-
build/version_info_aix.sh | 4 +-
...rsion_info_linux.sh => version_info_android.sh} | 14 +-
build/version_info_linux.sh | 4 +-
build/version_info_macos.sh | 2 +-
build/version_info_sunos.sh | 2 +-
build/version_info_windows.js | 4 +-
build/vsproject/index.html | 4 +-
build/vsproject/makefile.sln | 30 +-
build/vsproject/tbb.vcproj | 1068 +-
build/vsproject/tbbmalloc.vcproj | 1742 ++-
build/vsproject/tbbmalloc_proxy.vcproj | 420 +-
build/windows.cl.inc | 51 +-
build/windows.gcc.inc | 12 +-
build/windows.icl.inc | 24 +-
build/windows.inc | 15 +-
build/xbox360.cl.inc | 2 +-
build/xbox360.inc | 4 +-
doc/Release_Notes.txt | 91 +-
doc/html/a00005.html | 10 +-
doc/html/a00006.html | 14 +-
doc/html/a00007.html | 8 +-
doc/html/a00008.html | 10 +-
doc/html/a00009.html | 10 +-
doc/html/a00010.html | 30 +-
doc/html/a00011.html | 22 +-
doc/html/a00012.html | 26 +-
doc/html/a00013.html | 36 +-
doc/html/a00015.html | 10 +-
doc/html/a00017.html | 24 +-
doc/html/a00018.html | 8 +-
doc/html/a00019.html | 130 +-
doc/html/a00021.html | 12 +-
doc/html/a00022.html | 28 +-
doc/html/a00023.html | 24 +-
doc/html/a00031.html | 42 +-
doc/html/a00035.html | 50 +-
doc/html/a00036.html | 60 +-
doc/html/a00038.html | 78 +-
doc/html/a00044.html | 102 -
doc/html/a00046.html | 105 +
doc/html/{a00049.html => a00051.html} | 72 +-
doc/html/a00053.html | 41 -
doc/html/a00054.html | 38 -
doc/html/a00055.html | 30 +-
doc/html/a00056.html | 46 +
doc/html/a00057.html | 50 +-
doc/html/{a00057.html => a00059.html} | 47 +-
doc/html/a00060.html | 39 -
doc/html/a00061.html | 51 -
doc/html/a00062.html | 27 +-
doc/html/a00063.html | 41 +-
doc/html/a00064.html | 31 +-
doc/html/{a00063.html => a00065.html} | 39 +-
doc/html/a00066.html | 26 +-
doc/html/a00068.html | 32 +-
doc/html/{a00068.html => a00070.html} | 38 +-
doc/html/a00071.html | 54 -
doc/html/a00072.html | 87 -
doc/html/a00073.html | 63 +
doc/html/a00074.html | 128 +-
doc/html/a00075.html | 93 -
doc/html/a00076.html | 132 +-
doc/html/a00077.html | 103 +-
doc/html/a00078.html | 103 +
doc/html/a00079.html | 68 +
doc/html/a00082.html | 53 -
doc/html/a00084.html | 36 +-
doc/html/a00086.html | 17 +-
doc/html/a00088.html | 23 +-
doc/html/a00089.html | 39 -
doc/html/a00090.html | 25 +-
doc/html/a00091.html | 17 +-
doc/html/a00092.html | 12 +-
doc/html/a00093.html | 18 +-
doc/html/a00094.html | 10 +-
doc/html/{a00093.html => a00095.html} | 20 +-
doc/html/a00096.html | 7 +-
doc/html/a00097.html | 33 -
doc/html/a00098.html | 10 +-
doc/html/a00099.html | 7 +-
doc/html/a00100.html | 14 +-
doc/html/a00101.html | 11 +-
doc/html/{a00100.html => a00102.html} | 14 +-
doc/html/a00103.html | 14 +-
doc/html/a00104.html | 39 -
doc/html/a00105.html | 31 +-
doc/html/a00106.html | 38 +-
doc/html/a00107.html | 38 +-
doc/html/a00108.html | 33 +-
doc/html/a00109.html | 25 +-
doc/html/a00110.html | 11 +-
doc/html/a00111.html | 19 +-
doc/html/a00112.html | 15 +-
doc/html/a00113.html | 18 +-
doc/html/a00114.html | 24 +-
doc/html/a00115.html | 17 +-
doc/html/a00116.html | 23 +-
doc/html/a00117.html | 21 +-
doc/html/a00118.html | 16 +-
doc/html/a00119.html | 32 +-
doc/html/{a00118.html => a00120.html} | 18 +-
doc/html/a00121.html | 36 +-
doc/html/a00123.html | 23 +-
doc/html/a00125.html | 16 +-
doc/html/a00126.html | 39 -
doc/html/a00127.html | 23 +-
doc/html/a00128.html | 21 +-
doc/html/{a00127.html => a00129.html} | 24 +-
doc/html/a00130.html | 14 +-
doc/html/{a00155.html => a00132.html} | 5 +-
doc/html/a00133.html | 90 -
doc/html/a00134.html | 88 -
doc/html/a00135.html | 73 +-
doc/html/a00136.html | 91 +
doc/html/{a00135.html => a00137.html} | 20 +-
doc/html/a00138.html | 47 +
doc/html/a00144.html | 51 -
doc/html/{a00142.html => a00145.html} | 21 +-
doc/html/a00146.html | 35 -
doc/html/a00148.html | 35 +-
doc/html/a00150.html | 11 +-
doc/html/a00152.html | 18 +-
doc/html/a00153.html | 33 -
doc/html/a00154.html | 9 +-
doc/html/a00156.html | 7 +-
doc/html/a00157.html | 11 +-
doc/html/a00158.html | 17 +-
doc/html/a00159.html | 18 +-
doc/html/a00160.html | 10 +-
doc/html/{a00157.html => a00161.html} | 17 +-
doc/html/{a00158.html => a00162.html} | 29 +-
doc/html/{a00159.html => a00163.html} | 31 +-
doc/html/{a00160.html => a00164.html} | 14 +-
doc/html/a00165.html | 36 -
doc/html/a00169.html | 10 +-
doc/html/{a00169.html => a00173.html} | 8 +-
doc/html/{a00170.html => a00174.html} | 8 +-
doc/html/a00179.html | 33 -
doc/html/a00183.html | 8 +-
doc/html/{a00183.html => a00188.html} | 11 +-
doc/html/{a00184.html => a00189.html} | 22 +-
doc/html/a00249.html | 64 -
doc/html/a00250.html | 58 -
doc/html/a00250.png | Bin 671 -> 0 bytes
doc/html/a00251.html | 81 -
doc/html/a00251.png | Bin 792 -> 0 bytes
doc/html/a00252.html | 113 -
doc/html/a00253.html | 63 -
doc/html/a00255.html | 56 -
doc/html/a00256.html | 59 -
doc/html/a00257.html | 64 -
doc/html/a00259.html | 224 -
doc/html/a00260.html | 86 -
doc/html/a00261.html | 73 +-
doc/html/{a00249.png => a00261.png} | Bin
doc/html/a00262.html | 68 +-
doc/html/a00262.png | Bin 1270 -> 671 bytes
doc/html/a00263.html | 376 +-
doc/html/a00263.png | Bin 2898 -> 792 bytes
doc/html/a00264.html | 136 +-
doc/html/{a00252.png => a00264.png} | Bin
doc/html/a00265.html | 44 +-
doc/html/a00266.html | 135 +-
doc/html/a00266.png | Bin 472 -> 0 bytes
doc/html/a00267.html | 59 +-
doc/html/a00268.html | 283 +-
doc/html/a00268.png | Bin 731 -> 0 bytes
doc/html/a00269.html | 620 +-
doc/html/a00270.html | 38 +-
doc/html/a00270.png | Bin 1371 -> 0 bytes
doc/html/a00271.html | 201 +-
doc/html/a00272.html | 90 +-
doc/html/a00273.html | 337 +-
doc/html/a00274.html | 169 +-
doc/html/{a00262.png => a00274.png} | Bin
doc/html/a00275.html | 380 +-
doc/html/a00275.png | Bin 720 -> 2898 bytes
doc/html/a00276.html | 587 +-
doc/html/a00277.html | 35 +-
doc/html/a00278.html | 151 +-
doc/html/a00278.png | Bin 777 -> 472 bytes
doc/html/a00279.html | 154 +-
doc/html/a00280.html | 284 +-
doc/html/a00280.png | Bin 387 -> 731 bytes
doc/html/a00281.html | 675 +-
doc/html/a00282.html | 218 +-
doc/html/a00282.png | Bin 433 -> 1371 bytes
doc/html/a00283.html | 53 +-
doc/html/a00284.html | 79 +-
doc/html/{a00272.png => a00284.png} | Bin
doc/html/a00285.html | 320 +-
doc/html/a00286.html | 159 +-
doc/html/a00287.html | 148 +-
doc/html/a00287.png | Bin 1016 -> 720 bytes
doc/html/a00288.html | 544 +-
doc/html/a00289.html | 50 +-
doc/html/a00290.html | 78 +-
doc/html/{a00278.png => a00290.png} | Bin
doc/html/a00291.html | 140 +-
doc/html/{a00279.png => a00291.png} | Bin
doc/html/a00292.html | 119 +-
doc/html/a00292.png | Bin 1209 -> 387 bytes
doc/html/a00293.html | 174 +-
doc/html/a00294.html | 213 +-
doc/html/{a00282.png => a00294.png} | Bin
doc/html/a00295.html | 50 +-
doc/html/a00296.html | 107 +-
doc/html/a00297.html | 65 +-
doc/html/a00298.html | 74 +-
doc/html/{a00286.png => a00298.png} | Bin
doc/html/a00299.html | 175 +-
doc/html/a00299.png | Bin 604 -> 1016 bytes
doc/html/a00300.html | 260 +-
doc/html/a00300.png | Bin 982 -> 0 bytes
doc/html/a00301.html | 126 +-
doc/html/{a00289.png => a00301.png} | Bin
doc/html/a00302.html | 47 +-
doc/html/a00303.html | 37 +-
doc/html/a00304.html | 133 +-
doc/html/{a00292.png => a00304.png} | Bin
doc/html/a00305.html | 44 +-
doc/html/a00306.html | 44 +-
doc/html/a00307.html | 39 +-
doc/html/a00308.html | 178 +-
doc/html/a00309.html | 69 +-
doc/html/a00310.html | 81 +-
doc/html/a00311.html | 148 +-
doc/html/{a00299.png => a00311.png} | Bin
doc/html/a00312.html | 112 +-
doc/html/a00312.png | Bin 2103 -> 982 bytes
doc/html/a00313.html | 145 +-
doc/html/a00314.html | 58 +-
doc/html/a00315.html | 73 +-
doc/html/a00316.html | 50 +-
doc/html/a00317.html | 102 +-
doc/html/a00318.html | 196 +-
doc/html/a00319.html | 46 +-
doc/html/a00320.html | 119 +-
doc/html/a00321.html | 62 +-
doc/html/a00322.html | 97 +-
doc/html/a00323.html | 54 +-
doc/html/a00324.html | 344 +-
doc/html/{a00312.png => a00324.png} | Bin
doc/html/a00325.html | 119 +-
doc/html/{a00313.png => a00325.png} | Bin
doc/html/a00326.html | 48 +-
doc/html/a00327.html | 95 +-
doc/html/a00328.html | 97 +-
doc/html/a00329.html | 102 +-
doc/html/a00330.html | 212 +-
doc/html/a00331.html | 106 +-
doc/html/a00332.html | 72 +-
doc/html/a00333.html | 145 +-
doc/html/{a00321.png => a00333.png} | Bin
doc/html/a00334.html | 131 +-
doc/html/a00335.html | 50 +-
doc/html/a00336.html | 306 +-
doc/html/a00336.png | Bin 3005 -> 0 bytes
doc/html/a00337.html | 617 +-
doc/html/a00338.html | 37 +-
doc/html/a00339.html | 66 +-
doc/html/{a00327.png => a00339.png} | Bin
doc/html/{a00328.html => a00340.html} | 40 +-
doc/html/{a00328.png => a00340.png} | Bin
doc/html/a00341.html | 60 +-
doc/html/a00342.html | 180 +-
doc/html/{a00330.png => a00342.png} | Bin
doc/html/a00343.html | 149 +-
doc/html/a00344.html | 76 +-
doc/html/a00345.html | 143 +-
doc/html/a00346.html | 114 +-
doc/html/a00347.html | 33 +-
doc/html/a00348.html | 102 +-
doc/html/a00348.png | Bin 426 -> 3149 bytes
doc/html/a00349.html | 632 +-
doc/html/{a00337.png => a00349.png} | Bin
doc/html/a00350.html | 293 +-
doc/html/a00351.html | 22 +-
doc/html/a00353.html | 66 +-
doc/html/a00354.html | 63 +-
doc/html/{a00342.html => a00355.html} | 115 +-
doc/html/{a00343.html => a00356.html} | 30 +-
doc/html/{a00344.html => a00357.html} | 12 +-
doc/html/{a00345.html => a00358.html} | 50 +-
doc/html/{a00345.png => a00358.png} | Bin
doc/html/{a00346.html => a00359.html} | 20 +-
doc/html/{a00254.html => a00360.html} | 35 +-
doc/html/{a00348.html => a00361.html} | 20 +-
doc/html/{a00348.png => a00361.png} | Bin
doc/html/{a00349.html => a00362.html} | 26 +-
doc/html/{a00350.html => a00363.html} | 28 +-
doc/html/{a00258.html => a00364.html} | 18 +-
doc/html/{a00352.html => a00365.html} | 10 +-
doc/html/{a00353.html => a00366.html} | 16 +-
doc/html/{a00354.html => a00367.html} | 12 +-
doc/html/{a00372.html => a00385.html} | 95 +-
doc/html/{a00373.html => a00386.html} | 20 +-
doc/html/{a00392.html => a00405.html} | 41 +-
doc/html/a00414.html | 667 -
doc/html/{a00411.html => a00425.html} | 2 +-
doc/html/a00426.html | 364 -
doc/html/a00428.html | 833 +-
doc/html/a00432.html | 219 -
doc/html/a00440.html | 73 -
doc/html/a00441.html | 779 +-
doc/html/{a00427.html => a00442.html} | 30 +-
doc/html/{a00428.html => a00443.html} | 95 +-
doc/html/{a00429.html => a00444.html} | 42 +-
doc/html/{a00430.html => a00445.html} | 6 +-
doc/html/{a00431.html => a00446.html} | 22 +-
doc/html/a00449.html | 127 -
doc/html/a00450.html | 113 -
doc/html/a00451.html | 131 -
doc/html/a00452.html | 153 -
doc/html/a00454.html | 98 -
doc/html/a00455.html | 1219 --
doc/html/a00466.html | 260 -
doc/html/a00473.html | 327 -
doc/html/a00476.html | 371 -
doc/html/a00480.html | 250 -
doc/html/a00484.html | 199 -
doc/html/a00487.html | 928 --
doc/html/a00496.html | 163 -
doc/html/a00499.html | 964 --
doc/html/a00511.html | 1655 ---
doc/html/a00524.html | 269 -
doc/html/a00531.html | 240 -
doc/html/a00533.html | 81 -
doc/html/a00534.html | 83 -
doc/html/a00535.html | 480 -
doc/html/a00544.html | 256 -
doc/html/a00548.html | 92 -
doc/html/a00550.html | 386 -
doc/html/a00556.html | 476 -
doc/html/a00562.html | 341 -
doc/html/a00567.html | 229 -
doc/html/a00571.html | 196 -
doc/html/a00575.html | 500 -
doc/html/a00587.html | 612 -
doc/html/a00603.html | 136 -
doc/html/a00604.html | 166 -
doc/html/a00605.html | 179 -
doc/html/a00606.html | 241 -
doc/html/a00607.html | 137 -
doc/html/a00608.html | 275 -
doc/html/a00611.html | 192 -
doc/html/a00612.html | 216 -
doc/html/a00613.html | 733 -
doc/html/a00623.html | 274 -
doc/html/a00630.html | 117 -
doc/html/a00631.html | 90 -
doc/html/a00633.html | 98 -
doc/html/a00634.html | 225 -
doc/html/a00638.html | 323 -
doc/html/a00639.html | 322 -
doc/html/a00640.html | 782 -
doc/html/a00647.html | 225 -
doc/html/a00648.html | 302 -
doc/html/a00655.html | 298 -
doc/html/a00663.html | 96 -
doc/html/a00665.html | 164 -
doc/html/annotated.html | 215 +-
doc/html/concepts.html | 2 +-
doc/html/deprecated.html | 4 +-
doc/html/files.html | 59 +-
doc/html/functions.html | 26 +-
doc/html/{functions.html => functions_0x61.html} | 37 +-
doc/html/functions_0x62.html | 15 +-
doc/html/functions_0x63.html | 52 +-
doc/html/functions_0x64.html | 22 +-
doc/html/functions_0x65.html | 47 +-
doc/html/functions_0x66.html | 25 +-
doc/html/functions_0x67.html | 19 +-
doc/html/functions_0x69.html | 51 +-
doc/html/functions_0x6c.html | 19 +-
doc/html/functions_0x6d.html | 19 +-
doc/html/functions_0x6e.html | 13 +-
doc/html/functions_0x6f.html | 29 +-
doc/html/functions_0x70.html | 39 +-
doc/html/functions_0x71.html | 11 +-
doc/html/functions_0x72.html | 65 +-
doc/html/functions_0x73.html | 57 +-
doc/html/functions_0x74.html | 43 +-
doc/html/functions_0x75.html | 11 +-
doc/html/functions_0x76.html | 7 +-
doc/html/functions_0x77.html | 10 +-
doc/html/functions_0x7e.html | 55 +-
doc/html/functions_enum.html | 12 +-
doc/html/functions_eval.html | 34 +-
doc/html/functions_func.html | 26 +-
doc/html/functions_func_0x62.html | 12 +-
doc/html/functions_func_0x63.html | 45 +-
doc/html/functions_func_0x64.html | 13 +-
doc/html/functions_func_0x65.html | 18 +-
doc/html/functions_func_0x66.html | 12 +-
doc/html/functions_func_0x67.html | 16 +-
doc/html/functions_func_0x69.html | 46 +-
doc/html/functions_func_0x6c.html | 14 +-
doc/html/functions_func_0x6d.html | 10 +-
doc/html/functions_func_0x6e.html | 8 +-
doc/html/functions_func_0x6f.html | 20 +-
doc/html/functions_func_0x70.html | 32 +-
doc/html/functions_func_0x71.html | 8 +-
doc/html/functions_func_0x72.html | 52 +-
doc/html/functions_func_0x73.html | 46 +-
doc/html/functions_func_0x74.html | 40 +-
doc/html/functions_func_0x75.html | 8 +-
doc/html/functions_func_0x77.html | 7 +-
doc/html/functions_func_0x7e.html | 52 +-
doc/html/functions_rela.html | 12 +-
doc/html/functions_type.html | 32 +-
doc/html/functions_vars.html | 24 +-
doc/html/globals.html | 21 +-
doc/html/globals_func.html | 21 +-
doc/html/hierarchy.html | 253 +-
doc/html/index.html | 2 +-
doc/html/modules.html | 14 +-
doc/html/namespacemembers.html | 36 +-
doc/html/namespacemembers_enum.html | 6 +-
doc/html/namespacemembers_eval.html | 10 +-
doc/html/namespacemembers_func.html | 24 +-
doc/html/namespaces.html | 6 +-
doc/html/pages.html | 2 +-
doc/html/parallel_do_body_req.html | 2 +-
doc/html/parallel_for_body_req.html | 2 +-
doc/html/parallel_reduce_body_req.html | 2 +-
doc/html/parallel_reduce_lambda_req.html | 2 +-
doc/html/parallel_scan_body_req.html | 2 +-
doc/html/parallel_sort_iter_req.html | 2 +-
doc/html/range_req.html | 2 +-
examples/GettingStarted/index.html | 2 +-
examples/GettingStarted/sub_string_finder/Makefile | 23 +-
.../sub_string_finder/Makefile.windows | 2 +-
.../GettingStarted/sub_string_finder/index.html | 2 +-
.../sub_string_finder/sub_string_finder.cpp | 2 +-
.../sub_string_finder_extended.cpp | 14 +-
.../sub_string_finder/sub_string_finder_pretty.cpp | 2 +-
examples/Makefile | 21 +-
examples/common/copy_libraries.bat | 8 +-
examples/common/gui/Makefile.gmake | 15 +-
examples/common/gui/Makefile.win | 2 +-
examples/common/gui/convideo.cpp | 7 +-
examples/common/gui/d2dvideo.cpp | 2 +-
examples/common/gui/ddvideo.cpp | 2 +-
examples/common/gui/dxcheck.bat | 2 +-
examples/common/gui/gdivideo.cpp | 2 +-
examples/common/gui/macvideo.cpp | 4 +-
examples/common/gui/video.h | 6 +-
examples/common/gui/winvideo.h | 2 +-
examples/common/gui/xcode/tbbExample/Info.plist | 2 +-
examples/common/gui/xcode/tbbExample/OpenGLView.h | 49 +-
examples/common/gui/xcode/tbbExample/OpenGLView.m | 97 +-
examples/common/gui/xcode/tbbExample/main.m | 43 +-
.../common/gui/xcode/tbbExample/tbbAppDelegate.h | 48 +-
.../common/gui/xcode/tbbExample/tbbAppDelegate.m | 44 +-
.../gui/xcode/tbbExample/tbbExample-Info.plist | 2 +-
.../gui/xcode/tbbExample/tbbExample-Prefix.pch | 44 +-
examples/common/gui/xvideo.cpp | 2 +-
examples/common/index.html | 41 +-
examples/common/utility/fast_random.h | 2 +-
examples/common/utility/utility.h | 276 +-
.../concurrent_hash_map/count_strings/Makefile | 10 +-
.../count_strings/Makefile.windows | 2 +-
.../count_strings/count_strings.cpp | 8 +-
.../concurrent_hash_map/count_strings/index.html | 2 +-
examples/concurrent_hash_map/index.html | 2 +-
.../concurrent_priority_queue/shortpath/Makefile | 12 +-
.../shortpath/Makefile.windows | 2 +-
.../concurrent_priority_queue/shortpath/index.html | 2 +-
.../shortpath/shortpath.cpp | 16 +-
.../xcode/shortpath.xcodeproj/project.pbxproj | 610 +-
examples/graph/binpack/Makefile | 10 +-
examples/graph/binpack/Makefile.windows | 2 +-
examples/graph/binpack/binpack.cpp | 11 +-
examples/graph/binpack/index.html | 2 +-
.../xcode/binpack.xcodeproj/project.pbxproj | 610 +-
examples/graph/dining_philosophers/Makefile | 10 +-
.../graph/dining_philosophers/Makefile.windows | 2 +-
.../dining_philosophers/dining_philosophers.cpp | 40 +-
examples/graph/dining_philosophers/index.html | 2 +-
examples/graph/index.html | 2 +-
examples/graph/logic_sim/D_latch.h | 2 +-
examples/graph/logic_sim/Makefile | 10 +-
examples/graph/logic_sim/Makefile.windows | 2 +-
examples/graph/logic_sim/basics.h | 36 +-
examples/graph/logic_sim/four_bit_adder.h | 2 +-
examples/graph/logic_sim/index.html | 2 +-
examples/graph/logic_sim/msvs/logic_sim_cl.sln | 104 +-
examples/graph/logic_sim/msvs/logic_sim_icl.sln | 264 +-
examples/graph/logic_sim/msvs/test_all.icproj | 22 +-
examples/graph/logic_sim/msvs/test_all.vcproj | 712 +-
examples/graph/logic_sim/one_bit_adder.h | 2 +-
examples/graph/logic_sim/test_all.cpp | 11 +-
examples/index.html | 17 +-
examples/parallel_do/index.html | 2 +-
examples/parallel_do/parallel_preorder/Graph.cpp | 2 +-
examples/parallel_do/parallel_preorder/Graph.h | 2 +-
examples/parallel_do/parallel_preorder/Makefile | 12 +-
.../parallel_do/parallel_preorder/Makefile.windows | 2 +-
examples/parallel_do/parallel_preorder/Matrix.h | 2 +-
examples/parallel_do/parallel_preorder/index.html | 7 +-
examples/parallel_do/parallel_preorder/main.cpp | 8 +-
.../parallel_preorder/parallel_preorder.cpp | 7 +-
examples/parallel_for/game_of_life/Makefile | 12 +-
.../parallel_for/game_of_life/Makefile.windows | 2 +-
examples/parallel_for/game_of_life/index.html | 2 +-
.../parallel_for/game_of_life/src/AssemblyInfo.cpp | 2 +-
examples/parallel_for/game_of_life/src/Board.h | 2 +-
.../parallel_for/game_of_life/src/Evolution.cpp | 2 +-
examples/parallel_for/game_of_life/src/Evolution.h | 4 +-
examples/parallel_for/game_of_life/src/Form1.h | 2 +-
.../parallel_for/game_of_life/src/Game_of_life.cpp | 2 +-
.../parallel_for/game_of_life/src/Update_state.cpp | 2 +-
examples/parallel_for/index.html | 2 +-
examples/parallel_for/polygon_overlay/Makefile | 2 +-
.../parallel_for/polygon_overlay/Makefile.windows | 2 +-
examples/parallel_for/polygon_overlay/index.html | 2 +-
examples/parallel_for/polygon_overlay/polymain.cpp | 2 +-
examples/parallel_for/polygon_overlay/polymain.h | 2 +-
examples/parallel_for/polygon_overlay/polyover.cpp | 2 +-
examples/parallel_for/polygon_overlay/polyover.h | 2 +-
.../parallel_for/polygon_overlay/pover_global.h | 2 +-
.../parallel_for/polygon_overlay/pover_video.cpp | 7 +-
.../parallel_for/polygon_overlay/pover_video.h | 2 +-
examples/parallel_for/polygon_overlay/rpolygon.h | 2 +-
examples/parallel_for/seismic/Makefile | 17 +-
examples/parallel_for/seismic/Makefile.windows | 2 +-
examples/parallel_for/seismic/index.html | 2 +-
examples/parallel_for/seismic/main.cpp | 28 +-
examples/parallel_for/seismic/seismic_video.cpp | 2 +-
examples/parallel_for/seismic/seismic_video.h | 2 +-
examples/parallel_for/seismic/universe.cpp | 6 +-
examples/parallel_for/seismic/universe.h | 4 +-
examples/parallel_for/tachyon/Makefile | 2 +-
examples/parallel_for/tachyon/Makefile.windows | 2 +-
examples/parallel_for/tachyon/android/.classpath | 8 +
examples/parallel_for/tachyon/android/.cproject | 223 +
examples/parallel_for/tachyon/android/.project | 98 +
.../tachyon/android/AndroidManifest.xml | 26 +
.../parallel_for/tachyon/android/assets/data.dat | 14804 +++++++++++++++++++
.../parallel_for/tachyon/android/jni/Android.mk | 84 +
.../tachyon/android/jni/Application.mk | 23 +-
.../tachyon/android/jni/jni-engine.cpp | 287 +
.../tachyon/android/project.properties | 14 +
.../tachyon/android/res/menu/main_screen_menu.xml | 16 +
.../tachyon/android/res/values/strings.xml | 4 +
.../src/com/intel/tbb/example/tachyon/tachyon.java | 315 +
examples/parallel_for/tachyon/index.html | 9 +-
examples/parallel_for/tachyon/src/api.cpp | 2 +-
examples/parallel_for/tachyon/src/api.h | 2 +-
examples/parallel_for/tachyon/src/apigeom.cpp | 2 +-
examples/parallel_for/tachyon/src/apitrigeom.cpp | 2 +-
examples/parallel_for/tachyon/src/apitrigeom.h | 2 +-
examples/parallel_for/tachyon/src/bndbox.cpp | 4 +-
examples/parallel_for/tachyon/src/bndbox.h | 2 +-
examples/parallel_for/tachyon/src/box.cpp | 2 +-
examples/parallel_for/tachyon/src/box.h | 2 +-
examples/parallel_for/tachyon/src/camera.cpp | 2 +-
examples/parallel_for/tachyon/src/camera.h | 2 +-
examples/parallel_for/tachyon/src/coordsys.cpp | 2 +-
examples/parallel_for/tachyon/src/coordsys.h | 2 +-
examples/parallel_for/tachyon/src/cylinder.cpp | 2 +-
examples/parallel_for/tachyon/src/cylinder.h | 2 +-
examples/parallel_for/tachyon/src/extvol.cpp | 2 +-
examples/parallel_for/tachyon/src/extvol.h | 2 +-
examples/parallel_for/tachyon/src/global.cpp | 2 +-
examples/parallel_for/tachyon/src/global.h | 2 +-
examples/parallel_for/tachyon/src/grid.cpp | 2 +-
examples/parallel_for/tachyon/src/grid.h | 2 +-
examples/parallel_for/tachyon/src/imageio.cpp | 2 +-
examples/parallel_for/tachyon/src/imageio.h | 2 +-
examples/parallel_for/tachyon/src/imap.cpp | 2 +-
examples/parallel_for/tachyon/src/imap.h | 2 +-
examples/parallel_for/tachyon/src/intersect.cpp | 2 +-
examples/parallel_for/tachyon/src/intersect.h | 2 +-
examples/parallel_for/tachyon/src/jpeg.cpp | 2 +-
examples/parallel_for/tachyon/src/jpeg.h | 2 +-
examples/parallel_for/tachyon/src/light.cpp | 2 +-
examples/parallel_for/tachyon/src/light.h | 2 +-
examples/parallel_for/tachyon/src/machine.h | 2 +-
examples/parallel_for/tachyon/src/macros.h | 2 +-
examples/parallel_for/tachyon/src/main.cpp | 2 +-
examples/parallel_for/tachyon/src/objbound.cpp | 2 +-
examples/parallel_for/tachyon/src/objbound.h | 2 +-
examples/parallel_for/tachyon/src/parse.cpp | 2 +-
examples/parallel_for/tachyon/src/parse.h | 2 +-
examples/parallel_for/tachyon/src/plane.cpp | 2 +-
examples/parallel_for/tachyon/src/plane.h | 2 +-
examples/parallel_for/tachyon/src/ppm.cpp | 2 +-
examples/parallel_for/tachyon/src/ppm.h | 2 +-
examples/parallel_for/tachyon/src/pthread.cpp | 4 +-
.../tachyon/src/{pthread.h => pthread_w.h} | 2 +-
examples/parallel_for/tachyon/src/quadric.cpp | 2 +-
examples/parallel_for/tachyon/src/quadric.h | 2 +-
examples/parallel_for/tachyon/src/render.cpp | 2 +-
examples/parallel_for/tachyon/src/render.h | 2 +-
examples/parallel_for/tachyon/src/ring.cpp | 2 +-
examples/parallel_for/tachyon/src/ring.h | 2 +-
examples/parallel_for/tachyon/src/shade.cpp | 2 +-
examples/parallel_for/tachyon/src/shade.h | 2 +-
examples/parallel_for/tachyon/src/sphere.cpp | 2 +-
examples/parallel_for/tachyon/src/sphere.h | 2 +-
.../parallel_for/tachyon/src/tachyon_video.cpp | 2 +-
examples/parallel_for/tachyon/src/tachyon_video.h | 2 +-
examples/parallel_for/tachyon/src/texture.cpp | 2 +-
examples/parallel_for/tachyon/src/texture.h | 2 +-
examples/parallel_for/tachyon/src/tgafile.cpp | 2 +-
examples/parallel_for/tachyon/src/tgafile.h | 2 +-
examples/parallel_for/tachyon/src/trace.h | 2 +-
examples/parallel_for/tachyon/src/trace.serial.cpp | 2 +-
examples/parallel_for/tachyon/src/trace.tbb.cpp | 2 +-
examples/parallel_for/tachyon/src/trace.tbb1d.cpp | 2 +-
examples/parallel_for/tachyon/src/trace_rest.cpp | 2 +-
examples/parallel_for/tachyon/src/triangle.cpp | 2 +-
examples/parallel_for/tachyon/src/triangle.h | 2 +-
examples/parallel_for/tachyon/src/types.h | 2 +-
examples/parallel_for/tachyon/src/ui.cpp | 2 +-
examples/parallel_for/tachyon/src/ui.h | 2 +-
examples/parallel_for/tachyon/src/util.cpp | 2 +-
examples/parallel_for/tachyon/src/util.h | 2 +-
examples/parallel_for/tachyon/src/vector.cpp | 2 +-
examples/parallel_for/tachyon/src/vector.h | 2 +-
examples/parallel_for/tachyon/src/vol.cpp | 2 +-
examples/parallel_for/tachyon/src/vol.h | 2 +-
examples/parallel_reduce/convex_hull/Makefile | 12 +-
.../parallel_reduce/convex_hull/Makefile.windows | 2 +-
examples/parallel_reduce/convex_hull/convex_hull.h | 6 +-
.../convex_hull/convex_hull_bench.cpp | 8 +-
.../convex_hull/convex_hull_sample.cpp | 6 +-
examples/parallel_reduce/convex_hull/index.html | 2 +-
examples/parallel_reduce/index.html | 2 +-
examples/parallel_reduce/primes/Makefile | 23 +-
examples/parallel_reduce/primes/Makefile.windows | 2 +-
examples/parallel_reduce/primes/index.html | 2 +-
examples/parallel_reduce/primes/main.cpp | 20 +-
examples/parallel_reduce/primes/primes.cpp | 6 +-
examples/parallel_reduce/primes/primes.h | 10 +-
examples/pipeline/index.html | 2 +-
examples/pipeline/square/Makefile | 37 +-
examples/pipeline/square/Makefile.windows | 16 +-
examples/pipeline/square/gen_input.cpp | 36 +-
examples/pipeline/square/index.html | 2 +-
examples/pipeline/square/msvs/gen_input.icproj | 11 -
examples/pipeline/square/msvs/gen_input.vcproj | 354 -
examples/pipeline/square/msvs/square.vcproj | 20 +-
examples/pipeline/square/msvs/square_cl.sln | 13 -
examples/pipeline/square/square.cpp | 11 +-
.../square/xcode/square.xcodeproj/project.pbxproj | 137 +-
examples/task/index.html | 2 +-
examples/task/tree_sum/Makefile | 14 +-
examples/task/tree_sum/Makefile.windows | 2 +-
.../task/tree_sum/OptimizedParallelSumTree.cpp | 2 +-
examples/task/tree_sum/SerialSumTree.cpp | 2 +-
examples/task/tree_sum/SimpleParallelSumTree.cpp | 2 +-
examples/task/tree_sum/TreeMaker.h | 2 +-
examples/task/tree_sum/common.h | 2 +-
examples/task/tree_sum/index.html | 2 +-
examples/task/tree_sum/main.cpp | 8 +-
examples/task_group/index.html | 2 +-
examples/task_group/sudoku/Makefile | 23 +-
examples/task_group/sudoku/Makefile.windows | 2 +-
examples/task_group/sudoku/index.html | 2 +-
examples/task_group/sudoku/sudoku.cpp | 38 +-
examples/task_priority/fractal/Makefile | 2 +-
examples/task_priority/fractal/Makefile.windows | 2 +-
examples/task_priority/fractal/fractal.cpp | 2 +-
examples/task_priority/fractal/fractal.h | 2 +-
examples/task_priority/fractal/fractal_video.h | 2 +-
examples/task_priority/fractal/index.html | 2 +-
examples/task_priority/fractal/main.cpp | 8 +-
examples/task_priority/index.html | 2 +-
examples/test_all/fibonacci/Fibonacci.cpp | 2 +-
examples/test_all/fibonacci/Makefile | 10 +-
examples/test_all/fibonacci/Makefile.windows | 4 +-
examples/test_all/fibonacci/index.html | 2 +-
examples/test_all/index.html | 2 +-
include/index.html | 2 +-
include/serial/tbb/parallel_for.h | 60 +-
include/serial/tbb/tbb_annotate.h | 2 +-
include/tbb/aggregator.h | 2 +-
include/tbb/aligned_space.h | 2 +-
include/tbb/atomic.h | 188 +-
include/tbb/blocked_range.h | 2 +-
include/tbb/blocked_range2d.h | 2 +-
include/tbb/blocked_range3d.h | 2 +-
include/tbb/cache_aligned_allocator.h | 10 +-
include/tbb/combinable.h | 2 +-
include/tbb/compat/condition_variable | 2 +-
include/tbb/compat/ppl.h | 2 +-
include/tbb/compat/thread | 2 +-
include/tbb/compat/tuple | 194 +-
include/tbb/concurrent_hash_map.h | 8 +-
include/tbb/concurrent_lru_cache.h | 7 +-
include/tbb/concurrent_priority_queue.h | 2 +-
include/tbb/concurrent_queue.h | 2 +-
include/tbb/concurrent_unordered_map.h | 138 +-
include/tbb/concurrent_unordered_set.h | 125 +-
include/tbb/concurrent_vector.h | 82 +-
include/tbb/critical_section.h | 4 +-
include/tbb/enumerable_thread_specific.h | 248 +-
include/tbb/flow_graph.h | 569 +-
include/tbb/index.html | 2 +-
include/tbb/internal/_aggregator_impl.h | 2 +-
include/tbb/internal/_concurrent_queue_impl.h | 14 +-
include/tbb/internal/_concurrent_unordered_impl.h | 53 +-
include/tbb/internal/_flow_graph_impl.h | 161 +-
.../tbb/internal/_flow_graph_item_buffer_impl.h | 23 +-
include/tbb/internal/_flow_graph_join_impl.h | 482 +-
include/tbb/internal/_flow_graph_node_impl.h | 177 +-
include/tbb/internal/_flow_graph_or_impl.h | 75 +-
.../tbb/internal/_flow_graph_tagged_buffer_impl.h | 27 +-
include/tbb/internal/_flow_graph_types_impl.h | 132 +-
include/tbb/internal/_tbb_windef.h | 6 +-
include/tbb/machine/gcc_armv7.h | 222 +
include/tbb/machine/gcc_generic.h | 31 +-
include/tbb/machine/gcc_ia32_common.h | 97 +
include/tbb/machine/ibm_aix51.h | 4 +-
include/tbb/machine/icc_generic.h | 258 +
include/tbb/machine/linux_common.h | 5 +-
include/tbb/machine/linux_ia32.h | 88 +-
include/tbb/machine/linux_ia64.h | 6 +-
include/tbb/machine/linux_intel64.h | 61 +-
include/tbb/machine/mac_ppc.h | 21 +-
include/tbb/machine/macos_common.h | 26 +-
.../tbb/machine/{linux_common.h => mic_common.h} | 79 +-
include/tbb/machine/msvc_armv7.h | 176 +
include/tbb/machine/msvc_ia32_common.h | 184 +
include/tbb/machine/sunos_sparc.h | 6 +-
include/tbb/machine/windows_api.h | 39 +-
include/tbb/machine/windows_ia32.h | 90 +-
include/tbb/machine/windows_intel64.h | 46 +-
include/tbb/machine/xbox360_ppc.h | 4 +-
include/tbb/memory_pool.h | 22 +-
include/tbb/mutex.h | 4 +-
include/tbb/null_mutex.h | 2 +-
include/tbb/null_rw_mutex.h | 2 +-
include/tbb/parallel_do.h | 2 +-
include/tbb/parallel_for.h | 132 +-
include/tbb/parallel_for_each.h | 2 +-
include/tbb/parallel_invoke.h | 2 +-
include/tbb/parallel_reduce.h | 8 +-
include/tbb/parallel_scan.h | 221 +-
include/tbb/parallel_sort.h | 2 +-
include/tbb/parallel_while.h | 2 +-
include/tbb/partitioner.h | 34 +-
include/tbb/pipeline.h | 19 +-
include/tbb/queuing_mutex.h | 2 +-
include/tbb/queuing_rw_mutex.h | 2 +-
include/tbb/reader_writer_lock.h | 2 +-
include/tbb/recursive_mutex.h | 4 +-
include/tbb/runtime_loader.h | 2 +-
include/tbb/scalable_allocator.h | 24 +-
include/tbb/spin_mutex.h | 23 +-
include/tbb/spin_rw_mutex.h | 2 +-
include/tbb/task.h | 21 +-
include/tbb/task_arena.h | 228 +
include/tbb/task_group.h | 2 +-
include/tbb/task_scheduler_init.h | 18 +-
include/tbb/task_scheduler_observer.h | 108 +-
include/tbb/tbb.h | 2 +-
include/tbb/tbb_allocator.h | 10 +-
include/tbb/tbb_config.h | 292 +-
include/tbb/tbb_exception.h | 31 +-
include/tbb/tbb_machine.h | 187 +-
include/tbb/tbb_profiling.h | 10 +-
include/tbb/tbb_stddef.h | 105 +-
include/tbb/tbb_thread.h | 21 +-
include/tbb/tbbmalloc_proxy.h | 2 +-
include/tbb/tick_count.h | 59 +-
index.html | 8 +-
.../primes/Makefile => jni/Android.mk | 58 +-
build/test_launcher.sh => jni/Application.mk | 30 +-
src/Makefile | 57 +-
src/index.html | 2 +-
src/old/concurrent_queue_v2.cpp | 10 +-
src/old/concurrent_queue_v2.h | 4 +-
src/old/concurrent_vector_v2.cpp | 2 +-
src/old/concurrent_vector_v2.h | 2 +-
src/old/spin_rw_mutex_v2.cpp | 5 +-
src/old/spin_rw_mutex_v2.h | 2 +-
src/old/task_v2.cpp | 2 +-
src/old/test_concurrent_queue_v2.cpp | 19 +-
src/old/test_concurrent_vector_v2.cpp | 2 +-
src/old/test_mutex_v2.cpp | 5 +-
.../test_task_scheduler_observer_v3.cpp} | 3 +-
src/perf/coarse_grained_raii_lru_cache.h | 2 +-
src/perf/cpq_pdes.cpp | 239 +
src/perf/cpq_throughput_test.cpp | 381 +
src/perf/fibonacci_impl_tbb.cpp | 2 +-
src/perf/perf.cpp | 6 +-
src/perf/perf.h | 2 +-
src/perf/perf_sched.cpp | 2 +-
src/perf/run_statistics.sh | 2 +-
src/perf/statistics.cpp | 2 +-
src/perf/statistics.h | 12 +-
src/perf/statistics_xml.h | 2 +-
...onacci_cutoff.cpp => time_fibonacci_cutoff.cpp} | 20 +-
src/perf/time_framework.h | 2 +-
src/perf/time_hash_map.cpp | 11 +-
src/perf/time_hash_map_fill.cpp | 7 +-
src/perf/time_hash_map_fill.html | 2 +-
src/perf/time_locked_work.cpp | 2 +-
src/perf/time_lru_cache_throughput.cpp | 2 +-
src/perf/time_sandbox.h | 4 +-
src/perf/time_vector.cpp | 2 +-
src/rml/client/index.html | 2 +-
src/rml/client/library_assert.h | 5 +-
src/rml/client/omp_dynamic_link.cpp | 2 +-
src/rml/client/omp_dynamic_link.h | 3 +-
src/rml/client/rml_factory.h | 16 +-
src/rml/client/rml_omp.cpp | 12 +-
src/rml/client/rml_tbb.cpp | 12 +-
src/rml/include/index.html | 2 +-
src/rml/include/rml_base.h | 2 +-
src/rml/include/rml_omp.h | 2 +-
src/rml/include/rml_tbb.h | 3 +-
src/rml/index.html | 2 +-
src/rml/perfor/omp_nested.cpp | 2 +-
src/rml/perfor/omp_simple.cpp | 2 +-
src/rml/perfor/tbb_multi_omp.cpp | 2 +-
src/rml/perfor/tbb_simple.cpp | 2 +-
src/rml/perfor/thread_level.h | 2 +-
src/rml/server/index.html | 2 +-
src/rml/server/irml.rc | 4 +-
src/rml/server/job_automaton.h | 2 +-
src/rml/server/lin-rml-export.def | 2 +-
src/rml/server/rml_server.cpp | 4 +-
src/rml/server/thread_monitor.h | 103 +-
src/rml/server/wait_counter.h | 2 +-
src/rml/server/win32-rml-export.def | 2 +-
src/rml/server/win64-rml-export.def | 2 +-
src/rml/test/rml_omp_stub.cpp | 13 +-
src/rml/test/test_job_automaton.cpp | 11 +-
src/rml/test/test_rml_mixed.cpp | 26 +-
src/rml/test/test_rml_omp.cpp | 12 +-
src/rml/test/test_rml_omp_c_linkage.c | 2 +-
src/rml/test/test_rml_tbb.cpp | 26 +-
src/rml/test/test_server.h | 23 +-
src/rml/test/test_thread_monitor.cpp | 10 +-
src/tbb/arena.cpp | 394 +-
src/tbb/arena.h | 62 +-
src/tbb/cache_aligned_allocator.cpp | 13 +-
src/tbb/cilk-tbb-interop.h | 2 +-
src/tbb/concurrent_hash_map.cpp | 2 +-
src/tbb/concurrent_monitor.cpp | 2 +-
src/tbb/concurrent_monitor.h | 2 +-
src/tbb/concurrent_queue.cpp | 14 +-
src/tbb/concurrent_vector.cpp | 3 +-
src/tbb/condition_variable.cpp | 12 +-
src/tbb/critical_section.cpp | 2 +-
src/tbb/custom_scheduler.h | 187 +-
src/tbb/dynamic_link.cpp | 775 +-
src/tbb/dynamic_link.h | 70 +-
src/tbb/governor.cpp | 55 +-
src/tbb/governor.h | 18 +-
src/tbb/ia32-masm/atomic_support.asm | 2 +-
src/tbb/ia32-masm/lock_byte.asm | 2 +-
src/tbb/ia64-gas/atomic_support.s | 2 +-
src/tbb/ia64-gas/ia64_misc.s | 2 +-
src/tbb/ia64-gas/lock_byte.s | 2 +-
src/tbb/ia64-gas/log2.s | 2 +-
src/tbb/ia64-gas/pause.s | 2 +-
src/tbb/ibm_aix51/atomic_support.c | 2 +-
src/tbb/index.html | 2 +-
src/tbb/intel64-masm/atomic_support.asm | 2 +-
src/tbb/intel64-masm/intel64_misc.asm | 2 +-
src/tbb/intrusive_list.h | 28 +-
src/tbb/itt_notify.cpp | 2 +-
src/tbb/itt_notify.h | 2 +-
src/tbb/lin32-tbb-export.def | 2 +-
src/tbb/lin32-tbb-export.lst | 16 +-
src/tbb/lin64-tbb-export.def | 2 +-
src/tbb/lin64-tbb-export.lst | 14 +-
src/tbb/lin64ipf-tbb-export.def | 2 +-
src/tbb/lin64ipf-tbb-export.lst | 14 +-
src/tbb/mac32-tbb-export.def | 38 +-
src/tbb/mac32-tbb-export.lst | 56 +-
src/tbb/mac64-tbb-export.def | 38 +-
src/tbb/mac64-tbb-export.lst | 54 +-
src/tbb/mailbox.h | 9 +-
src/tbb/market.cpp | 50 +-
src/tbb/market.h | 18 +-
src/tbb/mutex.cpp | 4 +-
src/tbb/observer_proxy.cpp | 441 +-
src/tbb/observer_proxy.h | 150 +-
src/tbb/pipeline.cpp | 5 +-
src/tbb/private_server.cpp | 40 +-
src/tbb/queuing_mutex.cpp | 2 +-
src/tbb/queuing_rw_mutex.cpp | 2 +-
src/tbb/reader_writer_lock.cpp | 2 +-
src/tbb/recursive_mutex.cpp | 4 +-
src/tbb/scheduler.cpp | 361 +-
src/tbb/scheduler.h | 225 +-
src/tbb/scheduler_common.h | 95 +-
src/tbb/scheduler_utility.h | 4 +-
src/tbb/semaphore.cpp | 25 +-
src/tbb/semaphore.h | 20 +-
src/tbb/spin_mutex.cpp | 8 +-
src/tbb/spin_rw_mutex.cpp | 5 +-
src/tbb/task.cpp | 8 +-
src/tbb/task_group_context.cpp | 10 +-
src/tbb/task_stream.h | 18 +-
src/tbb/tbb_assert_impl.h | 2 +-
src/tbb/tbb_main.cpp | 9 +-
src/tbb/tbb_main.h | 4 +-
src/tbb/tbb_misc.cpp | 21 +-
src/tbb/tbb_misc.h | 63 +-
src/tbb/tbb_misc_ex.cpp | 68 +-
src/tbb/tbb_resource.rc | 4 +-
src/tbb/tbb_statistics.cpp | 2 +-
src/tbb/tbb_statistics.h | 4 +-
src/tbb/tbb_thread.cpp | 33 +-
src/tbb/tbb_version.h | 2 +-
src/tbb/tls.h | 17 +-
src/tbb/tools_api/disable_warnings.h | 2 +-
src/tbb/tools_api/internal/ittnotify.h | 2 +-
src/tbb/tools_api/ittnotify.h | 4 +-
src/tbb/tools_api/ittnotify_config.h | 2 +-
src/tbb/tools_api/ittnotify_static.c | 2 +-
src/tbb/tools_api/ittnotify_static.h | 2 +-
src/tbb/tools_api/ittnotify_types.h | 2 +-
src/tbb/tools_api/legacy/ittnotify.h | 2 +-
src/tbb/tools_api/prototype/ittnotify.h | 2 +-
src/tbb/win32-tbb-export.def | 7 +-
src/tbb/win32-tbb-export.lst | 56 +-
src/tbb/win64-gcc-tbb-export.def | 2 +-
src/tbb/win64-gcc-tbb-export.lst | 55 +-
src/tbb/win64-tbb-export.def | 38 +-
src/tbb/win64-tbb-export.lst | 56 +-
.../{win32-tbb-export.lst => winrt-tbb-export.lst} | 377 +-
src/tbb/xbox360-tbb-export.def | 2 +-
src/tbbmalloc/Customize.h | 38 +-
src/tbbmalloc/MapMemory.h | 8 +-
src/tbbmalloc/Statistics.h | 2 +-
src/tbbmalloc/TypeDefinitions.h | 27 +-
src/tbbmalloc/backend.cpp | 367 +-
src/tbbmalloc/backref.cpp | 22 +-
src/tbbmalloc/frontend.cpp | 536 +-
src/tbbmalloc/large_objects.cpp | 520 +-
src/tbbmalloc/lin32-proxy-export.def | 9 +-
src/tbbmalloc/lin32-tbbmalloc-export.def | 4 +-
src/tbbmalloc/lin64-proxy-export.def | 9 +-
src/tbbmalloc/lin64-tbbmalloc-export.def | 4 +-
src/tbbmalloc/lin64ipf-proxy-export.def | 9 +-
src/tbbmalloc/lin64ipf-tbbmalloc-export.def | 4 +-
src/tbbmalloc/mac32-tbbmalloc-export.def | 39 +-
src/tbbmalloc/mac64-tbbmalloc-export.def | 39 +-
src/tbbmalloc/proxy.cpp | 44 +-
src/tbbmalloc/proxy.h | 8 +-
src/tbbmalloc/tbb_function_replacement.cpp | 36 +-
src/tbbmalloc/tbb_function_replacement.h | 2 +-
src/tbbmalloc/tbbmalloc.cpp | 41 +-
src/tbbmalloc/tbbmalloc.rc | 4 +-
src/tbbmalloc/tbbmalloc_internal.h | 526 +-
src/tbbmalloc/tbbmalloc_internal_api.h | 2 +-
src/tbbmalloc/win32-gcc-tbbmalloc-export.def | 3 +-
src/tbbmalloc/win32-tbbmalloc-export.def | 3 +-
src/tbbmalloc/win64-gcc-tbbmalloc-export.def | 3 +-
src/tbbmalloc/win64-tbbmalloc-export.def | 3 +-
src/tbbmalloc/xbox360-tbbmalloc-export.def | 2 +-
src/tbbproxy/tbbproxy-windows.asm | 2 +-
src/tbbproxy/tbbproxy.cpp | 8 +-
src/test/harness.h | 81 +-
src/test/harness_allocator.h | 3 +-
src/test/harness_assert.h | 2 +-
src/test/harness_bad_expr.h | 2 +-
src/test/harness_barrier.h | 59 +-
src/test/harness_checktype.h | 106 +
src/test/harness_concurrency_tracker.h | 2 +-
src/test/harness_cpu.h | 4 +-
src/test/harness_defs.h | 104 +-
src/test/harness_dynamic_libs.h | 37 +-
src/test/harness_eh.h | 140 +-
src/test/harness_graph.h | 138 +-
src/test/harness_inject_scheduler.h | 3 +-
src/test/harness_iterator.h | 2 +-
src/test/harness_m128.h | 12 +-
src/test/harness_memory.h | 4 +-
.../square/gen_input.cpp => src/test/harness_mic.h | 38 +-
src/test/harness_report.h | 2 +-
src/test/harness_task.h | 2 +-
src/test/harness_tbb_independence.h | 2 +-
src/test/harness_test_cases_framework.h | 4 +-
src/test/test_ScalableAllocator.cpp | 53 +-
src/test/test_ScalableAllocator_STL.cpp | 2 +-
src/test/test_aggregator.cpp | 2 +-
src/test/test_aligned_space.cpp | 2 +-
src/test/test_allocator.h | 2 +-
src/test/test_allocator_STL.h | 6 +-
src/test/test_assembly.cpp | 18 +-
src/test/test_atomic.cpp | 620 +-
src/test/test_blocked_range.cpp | 2 +-
src/test/test_blocked_range2d.cpp | 2 +-
src/test/test_blocked_range3d.cpp | 2 +-
src/test/test_broadcast_node.cpp | 9 +-
src/test/test_buffer_node.cpp | 2 +-
src/test/test_cache_aligned_allocator.cpp | 2 +-
src/test/test_cache_aligned_allocator_STL.cpp | 2 +-
src/test/test_cilk_common.h | 2 +-
src/test/test_cilk_dynamic_load.cpp | 4 +-
src/test/test_cilk_interop.cpp | 2 +-
src/test/test_combinable.cpp | 2 +-
src/test/test_concurrent_hash_map.cpp | 4 +-
src/test/test_concurrent_lru_cache.cpp | 86 +-
src/test/test_concurrent_monitor.cpp | 2 +-
src/test/test_concurrent_priority_queue.cpp | 3 +-
src/test/test_concurrent_queue.cpp | 42 +-
src/test/test_concurrent_queue.h | 2 +-
src/test/test_concurrent_unordered.cpp | 360 +-
src/test/test_concurrent_vector.cpp | 62 +-
src/test/test_condition_variable.h | 21 +-
src/test/test_continue_node.cpp | 19 +-
src/test/test_critical_section.cpp | 2 +-
src/test/test_eh_algorithms.cpp | 407 +-
src/test/test_eh_flow_graph.cpp | 1941 ++-
src/test/test_eh_tasks.cpp | 32 +-
src/test/test_enumerable_thread_specific.cpp | 23 +-
src/test/test_examples_common_utility.cpp | 597 +
src/test/test_fast_random.cpp | 37 +-
src/test/test_flow_graph.cpp | 3 +-
src/test/test_fp.cpp | 68 +-
src/test/test_function_node.cpp | 73 +-
src/test/test_halt.cpp | 3 +-
src/test/test_handle_perror.cpp | 6 +-
src/test/test_hw_concurrency.cpp | 19 +-
src/test/test_inits_loop.cpp | 2 +-
src/test/test_intrusive_list.cpp | 2 +-
src/test/test_ittnotify.cpp | 4 +-
src/test/test_join_node.cpp | 400 +-
src/test/test_lambda.cpp | 2 +-
src/test/test_limiter_node.cpp | 14 +-
src/test/test_malloc_atexit.cpp | 37 +-
src/test/test_malloc_compliance.cpp | 44 +-
src/test/test_malloc_init_shutdown.cpp | 2 +-
src/test/test_malloc_lib_unload.cpp | 39 +-
src/test/test_malloc_overload.cpp | 151 +-
src/test/test_malloc_pools.cpp | 5 +-
src/test/test_malloc_pure_c.c | 20 +-
src/test/test_malloc_regression.cpp | 2 +-
src/test/test_malloc_used_by_lib.cpp | 11 +-
src/test/test_malloc_whitebox.cpp | 152 +-
src/test/test_model_plugin.cpp | 221 +-
src/test/test_multifunction_node.cpp | 107 +-
src/test/test_mutex.cpp | 5 +-
src/test/test_mutex_native_threads.cpp | 4 +-
src/test/test_openmp.cpp | 4 +-
src/test/test_or_node.cpp | 58 +-
src/test/test_overwrite_node.cpp | 2 +-
src/test/test_parallel_do.cpp | 18 +-
src/test/test_parallel_for.cpp | 130 +-
src/test/test_parallel_for_each.cpp | 2 +-
src/test/test_parallel_invoke.cpp | 2 +-
src/test/test_parallel_pipeline.cpp | 14 +-
src/test/test_parallel_reduce.cpp | 3 +-
src/test/test_parallel_scan.cpp | 2 +-
src/test/test_parallel_sort.cpp | 3 +-
src/test/test_parallel_while.cpp | 2 +-
src/test/test_pipeline.cpp | 4 +-
src/test/test_pipeline_with_tbf.cpp | 2 +-
src/test/test_priority_queue_node.cpp | 2 +-
src/test/test_queue_node.cpp | 2 +-
src/test/test_reader_writer_lock.cpp | 53 +-
src/test/test_runtime_loader.cpp | 26 +-
src/test/test_rwm_upgrade_downgrade.cpp | 2 +-
src/test/test_semaphore.cpp | 51 +-
src/test/test_sequencer_node.cpp | 2 +-
src/test/test_source_node.cpp | 14 +-
src/test/test_split_node.cpp | 81 +-
src/test/test_static_assert.cpp | 96 +
src/test/test_std_thread.cpp | 12 +-
src/test/test_task.cpp | 2 +-
src/test/test_task_arena.cpp | 315 +
src/test/test_task_assertions.cpp | 2 +-
src/test/test_task_auto_init.cpp | 2 +-
src/test/test_task_enqueue.cpp | 41 +-
src/test/test_task_group.cpp | 62 +-
src/test/test_task_leaks.cpp | 2 +-
src/test/test_task_priority.cpp | 13 +-
src/test/test_task_scheduler_init.cpp | 2 +-
src/test/test_task_scheduler_observer.cpp | 407 +-
src/test/test_task_steal_limit.cpp | 10 +-
src/test/test_tbb_condition_variable.cpp | 2 +-
src/test/test_tbb_fork.cpp | 203 +
src/test/test_tbb_header.cpp | 31 +-
src/test/test_tbb_thread.cpp | 2 +-
src/test/test_tbb_version.cpp | 51 +-
src/test/test_thread.h | 26 +-
src/test/test_tick_count.cpp | 24 +-
src/test/test_tuple.cpp | 80 +-
src/test/test_write_once_node.cpp | 2 +-
src/test/test_yield.cpp | 2 +-
1132 files changed, 49453 insertions(+), 40333 deletions(-)
diff --git a/CHANGES b/CHANGES
index 8fbdbe9..f4aad76 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,14 +1,159 @@
-TBB 4.0 Update 5
+------------------------------------------------------------------------
+The list of most significant changes made over time in
+Intel(R) Threading Bulding Blocks (Intel(R) TBB).
+------------------------------------------------------------------------
+
+Intel TBB 4.1 Update 3
+TBB_INTERFACE_VERSION == 6103
+
+Changes (w.r.t. Intel TBB 4.1 Update 2):
+
+- Binary files for Android* applications were added to the Linux* OS
+ package.
+- Binary files for Windows Store* applications were added to the
+ Windows* OS package.
+- Exact exception propagation (exception_ptr) support on Linux OS is
+ now turned on by default for GCC 4.4 and higher.
+- Stopped implicit use of large memory pages by tbbmalloc (Linux-only).
+ Now use of large pages must be explicitly enabled with
+ scalable_allocation_mode() function or TBB_MALLOC_USE_HUGE_PAGES
+ environment variable.
+
+Community Preview Features:
+
+- Extended class task_arena constructor and method initialize() to
+ allow some concurrency to be reserved strictly for application
+ threads.
+- New methods terminate() and is_active() were added to class
+ task_arena.
+
+Bugs fixed:
+
+- Fixed initialization of hashing helper constant in the hash
+ containers.
+- Fixed possible stalls in concurrent invocations of
+ task_arena::execute() when no worker thread is available to make
+ progress.
+- Fixed incorrect calculation of hardware concurrency in the presence
+ of inactive processor groups, particularly on systems running
+ Windows* 8 and Windows* Server 2012.
+
+Open-source contributions integrated:
+
+- The fix for the GUI examples on OS X* systems by Raf Schietekat.
+- Moved some power-of-2 calculations to functions to improve readability
+ by Raf Schietekat.
+- C++11/Clang support improvements by arcata.
+- ARM* platform isolation layer by Steve Capper, Leif Lindholm, Leo Lara
+ (ARM).
+
+------------------------------------------------------------------------
+Intel TBB 4.1 Update 2
+TBB_INTERFACE_VERSION == 6102
+
+Changes (w.r.t. Intel TBB 4.1 Update 1):
+
+- Objects up to 128 MB are now cached by the tbbmalloc. Previously
+ the threshold was 8MB. Objects larger than 128 MB are still
+ processed by direct OS calls.
+- concurrent_unordered_multiset and concurrent_unordered_multimap
+ have been added, based on Microsoft* PPL prototype.
+- Ability to value-initialize a tbb::atomic<T> variable on construction
+ in C++11, with const expressions properly supported.
+
+Community Preview Features:
+
+- Added a possibility to wait until all worker threads terminate.
+ This is necessary before calling fork() from an application.
+
+Bugs fixed:
+
+- Fixed data race in tbbmalloc that might lead to memory leaks
+ for large object allocations.
+- Fixed task_arena::enqueue() to use task_group_context of target arena.
+- Improved implementation of 64 bit atomics on ia32.
+
+------------------------------------------------------------------------
+Intel TBB 4.1 Update 1
+TBB_INTERFACE_VERSION == 6101
+
+Changes (w.r.t. Intel TBB 4.1):
+
+- concurrent_vector class now supports initialization/assignment
+ via C++11 initializer list feature (std::initializer_list<T>)
+- Added implementation of the platform isolation layer based on
+ Intel compiler atomic built-ins; it is supposed to work on
+ any platform supported by compiler version 12.1 and newer.
+- Using GetNativeSystemInfo() instead of GetSystemInfo() to support
+ more than 32 processors for 32-bit applications under WOW64.
+- The following form of parallel_for:
+ parallel_for(first, last, [step,] f[, context]) now accepts an
+ optional partitioner parameter after the function f.
+
+Backward-incompatible API changes:
-Changes (w.r.t. TBB 4.0 Update 4):
+- The library no longer injects tuple in to namespace std.
+ In previous releases, tuple was injected into namespace std by
+ flow_graph.h when std::tuple was not available. In this release,
+ flow_graph.h now uses tbb::flow::tuple. On platforms where
+ std::tuple is available, tbb::flow::tuple is typedef'ed to
+ std::tuple. On all other platforms, tbb::flow::tuple provides
+ a subset of the functionality defined by std::tuple. Users of
+ flow_graph.h may need to change their uses of std::tuple to
+ tbb::flow::tuple to ensure compatibility with non-C++11 compliant
+ compilers.
+
+Bugs fixed:
+
+- Fixed local observer to be able to override propagated CPU state and
+ to provide correct value of task_arena::current_slot() in callbacks.
+
+------------------------------------------------------------------------
+Intel TBB 4.1
+TBB_INTERFACE_VERSION == 6100
+
+Changes (w.r.t. Intel TBB 4.0 Update 5):
+
+- _WIN32_WINNT must be set to 0x0501 or greater in order to use TBB
+ on Microsoft* Windows*.
+- parallel_deterministic_reduce template function is fully supported.
+- TBB headers can be used with C++0x/C++11 mode (-std=c++0x) of GCC
+ and Intel(R) Compiler.
+- C++11 std::make_exception_ptr is used where available, instead of
+ std::copy_exception from earlier C++0x implementations.
+- Improvements in the TBB allocator to reduce extra memory consumption.
+- Partial refactoring of the task scheduler data structures.
+- TBB examples allow more flexible specification of the thread number,
+ including arithmetic and geometric progression.
+
+Bugs fixed:
+
+- On Linux & OS X*, pre-built TBB binaries do not yet support exact
+ exception propagation via C++11 exception_ptr. To prevent run time
+ errors, by default TBB headers disable exact exception propagation
+ even if the C++ implementation provides exception_ptr.
+
+Community Preview Features:
+
+- Added: class task_arena, for work submission by multiple application
+ threads with thread-independent control of concurrency level.
+- Added: task_scheduler_observer can be created as local to a master
+ thread, to observe threads that work on behalf of that master.
+ Local observers may have new on_scheduler_leaving() callback.
+
+------------------------------------------------------------------------
+Intel TBB 4.0 Update 5
+TBB_INTERFACE_VERSION == 6005
+
+Changes (w.r.t. Intel TBB 4.0 Update 4):
- Parallel pipeline optimization (directly storing small objects in the
interstage data buffers) limited to trivially-copyable types for
C++11 and a short list of types for earlier compilers.
- _VARIADIC_MAX switch is honored for TBB tuple implementation
and flow::graph nodes based on tuple.
-- Support of Cocoa framework was added to the GUI examples on Mac OS* X
- systems
+- Support of Cocoa framework was added to the GUI examples on OS X*
+ systems.
Bugs fixed:
@@ -20,9 +165,10 @@ Bugs fixed:
units that include flow_graph.h on VC 10.
------------------------------------------------------------------------
-TBB 4.0 Update 4
+Intel TBB 4.0 Update 4
+TBB_INTERFACE_VERSION == 6004
-Changes (w.r.t. TBB 4.0 Update 3):
+Changes (w.r.t. Intel TBB 4.0 Update 3):
- The TBB memory allocator transparently supports large pages on Linux.
- A new flow_graph example, logic_sim, was added.
@@ -51,14 +197,15 @@ Bugs fixed:
Open-source contributions integrated:
- Multiple improvements by Raf Schietekat.
-- Basic support for Clang on Mac OS X* by Blas Rodriguez Somoza.
+- Basic support for Clang on OS X* by Blas Rodriguez Somoza.
- Fixes for warnings and corner-case bugs by Blas Rodriguez Somoza
and Edward Lam.
------------------------------------------------------------------------
-TBB 4.0 Update 3
+Intel TBB 4.0 Update 3
+TBB_INTERFACE_VERSION == 6003
-Changes (w.r.t. TBB 4.0 Update 2):
+Changes (w.r.t. Intel TBB 4.0 Update 2):
- Modifications to the low-level API for memory pools:
added support for aligned allocations;
@@ -95,9 +242,10 @@ Bugs fixed:
64 cores split by Windows into several processor groups.
------------------------------------------------------------------------
-TBB 4.0 Update 2 commercial-aligned release
+Intel TBB 4.0 Update 2 commercial-aligned release
+TBB_INTERFACE_VERSION == 6002
-Changes (w.r.t. TBB 4.0 Update 1 commercial-aligned release):
+Changes (w.r.t. Intel TBB 4.0 Update 1 commercial-aligned release):
- concurrent_bounded_queue now has an abort() operation that releases
threads involved in pending push or pop operations. The released
@@ -114,17 +262,19 @@ Bugs fixed:
early, especially in presense of affinitized tasks.
------------------------------------------------------------------------
-TBB 4.0 Update 1 commercial-aligned release
+Intel TBB 4.0 Update 1 commercial-aligned release
+TBB_INTERFACE_VERSION == 6000 (forgotten to increment)
-Changes (w.r.t. TBB 4.0 commercial-aligned release):
+Changes (w.r.t. Intel TBB 4.0 commercial-aligned release):
- Memory leaks fixed in binpack example.
- Improvements and fixes in the TBB allocator.
------------------------------------------------------------------------
-TBB 4.0 commercial-aligned release
+Intel TBB 4.0 commercial-aligned release
+TBB_INTERFACE_VERSION == 6000
-Changes (w.r.t. TBB 3.0 Update 8 commercial-aligned release):
+Changes (w.r.t. Intel TBB 3.0 Update 8 commercial-aligned release):
- concurrent_priority_queue is now a fully supported feature.
Capacity control methods were removed.
@@ -155,9 +305,10 @@ Community Preview Features:
and collective deallocation.
------------------------------------------------------------------------
-TBB 3.0 Update 8 commercial-aligned release
+Intel TBB 3.0 Update 8 commercial-aligned release
+TBB_INTERFACE_VERSION == 5008
-Changes (w.r.t. TBB 3.0 Update 7 commercial-aligned release):
+Changes (w.r.t. Intel TBB 3.0 Update 7 commercial-aligned release):
- Task priorities become an official feature of TBB,
not community preview as before.
@@ -185,9 +336,10 @@ Community Preview Features:
- parallel_deterministic_reduce template function was added.
------------------------------------------------------------------------
-TBB 3.0 Update 7 commercial-aligned release
+Intel TBB 3.0 Update 7 commercial-aligned release
+TBB_INTERFACE_VERSION == 5006 (forgotten to increment)
-Changes (w.r.t. TBB 3.0 Update 6 commercial-aligned release):
+Changes (w.r.t. Intel TBB 3.0 Update 6 commercial-aligned release):
- Added implementation of the platform isolation layer based on
GCC atomic built-ins; it is supposed to work on any platform
@@ -200,9 +352,10 @@ Community Preview Features:
------------------------------------------------------------------------
-TBB 3.0 Update 6 commercial-aligned release
+Intel TBB 3.0 Update 6 commercial-aligned release
+TBB_INTERFACE_VERSION == 5006
-Changes (w.r.t. TBB 3.0 Update 5 commercial-aligned release):
+Changes (w.r.t. Intel TBB 3.0 Update 5 commercial-aligned release):
- Added Community Preview feature: task and task group priority, and
Fractal example demonstrating it.
@@ -233,9 +386,10 @@ Bugs fixed:
items to successors
------------------------------------------------------------------------
-TBB 3.0 Update 5 commercial-aligned release
+Intel TBB 3.0 Update 5 commercial-aligned release
+TBB_INTERFACE_VERSION == 5005
-Changes (w.r.t. TBB 3.0 Update 4 commercial-aligned release):
+Changes (w.r.t. Intel TBB 3.0 Update 4 commercial-aligned release):
- Added Community Preview feature: graph.
- Added automatic propagation of master thread FPU settings to
@@ -256,9 +410,10 @@ Open-source contributions integrated:
- Patch for calls to internal::atomic_do_once() by Andrey Semashev.
------------------------------------------------------------------------
-TBB 3.0 Update 4 commercial-aligned release
+Intel TBB 3.0 Update 4 commercial-aligned release
+TBB_INTERFACE_VERSION == 5004
-Changes (w.r.t. TBB 3.0 Update 3 commercial-aligned release):
+Changes (w.r.t. Intel TBB 3.0 Update 3 commercial-aligned release):
- Added Community Preview feature: concurrent_priority_queue.
- Fixed library loading to avoid possibility for remote code execution,
@@ -281,9 +436,10 @@ Bugs fixed:
http://connect.microsoft.com/VisualStudio/feedback/details/554339.
------------------------------------------------------------------------
-TBB 3.0 Update 3 commercial-aligned release
+Intel TBB 3.0 Update 3 commercial-aligned release
+TBB_INTERFACE_VERSION == 5003
-Changes (w.r.t. TBB 3.0 Update 2 commercial-aligned release):
+Changes (w.r.t. Intel TBB 3.0 Update 2 commercial-aligned release):
- cache_aligned_allocator class reworked to use scalable_aligned_malloc.
- Improved performance of count() and equal_range() methods
@@ -291,7 +447,7 @@ Changes (w.r.t. TBB 3.0 Update 2 commercial-aligned release):
- Improved implementation of 64-bit atomic loads and stores on 32-bit
platforms, including compilation with VC 7.1.
- Added implementation of atomic operations on top of OSAtomic API
- provided by Mac OS* X.
+ provided by OS X*.
- Removed gratuitous try/catch blocks surrounding thread function calls
in tbb_thread.
- Xcode* projects were added for sudoku and game_of_life examples.
@@ -311,9 +467,10 @@ Open-source contributions integrated:
- Various improvements by Raf Schietekat.
------------------------------------------------------------------------
-TBB 3.0 Update 2 commercial-aligned release
+Intel TBB 3.0 Update 2 commercial-aligned release
+TBB_INTERFACE_VERSION == 5002
-Changes (w.r.t. TBB 3.0 Update 1 commercial-aligned release):
+Changes (w.r.t. Intel TBB 3.0 Update 1 commercial-aligned release):
- Destructor of tbb::task_group class throws missing_wait exception
if there are tasks running when it is invoked.
@@ -330,9 +487,10 @@ Bugs fixed:
Mac OS* X 10.6.4 (1711).
------------------------------------------------------------------------
-TBB 3.0 Update 1 commercial-aligned release
+Intel TBB 3.0 Update 1 commercial-aligned release
+TBB_INTERFACE_VERSION == 5000 (forgotten to increment)
-Changes (w.r.t. TBB 3.0 commercial-aligned release):
+Changes (w.r.t. Intel TBB 3.0 commercial-aligned release):
- Decreased memory fragmentation by allocations bigger than 8K.
- Lazily allocate worker threads, to avoid creating unnecessary stacks.
@@ -355,9 +513,10 @@ Bugs fixed:
- Return type of postfix form of operator++ for hash map's iterators.
------------------------------------------------------------------------
-TBB 3.0 commercial-aligned release
+Intel TBB 3.0 commercial-aligned release
+TBB_INTERFACE_VERSION == 5000
-Changes (w.r.t. TBB 2.2 Update 3 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.2 Update 3 commercial-aligned release):
- All open-source-release changes down to TBB 2.2 U3 below
were incorporated into this release.
@@ -390,7 +549,7 @@ Bugs fixed:
------------------------------------------------------------------------
20100310 open-source release
-Changes (w.r.t. TBB 2.2 Update 3 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.2 Update 3 commercial-aligned release):
- Version macros changed in anticipation of a future release.
- Directory structure aligned with Intel(R) C++ Compiler;
@@ -437,9 +596,10 @@ Open-source contributions integrated:
an internal class used in the implementation of concurrent_queue.
------------------------------------------------------------------------
-TBB 2.2 Update 3 commercial-aligned release
+Intel TBB 2.2 Update 3 commercial-aligned release
+TBB_INTERFACE_VERSION == 4003
-Changes (w.r.t. TBB 2.2 Update 2 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.2 Update 2 commercial-aligned release):
- PDF documentation updated.
@@ -452,9 +612,10 @@ Bugs fixed:
- construct() methods of allocator classes now use global operator new.
------------------------------------------------------------------------
-TBB 2.2 Update 2 commercial-aligned release
+Intel TBB 2.2 Update 2 commercial-aligned release
+TBB_INTERFACE_VERSION == 4002
-Changes (w.r.t. TBB 2.2 Update 1 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.2 Update 1 commercial-aligned release):
- parallel_invoke and parallel_for_each now take function objects
by const reference, not by value.
@@ -486,9 +647,10 @@ Bugs fixed:
- crash in concurrent_queue<char> (1616).
------------------------------------------------------------------------
-TBB 2.2 Update 1 commercial-aligned release
+Intel TBB 2.2 Update 1 commercial-aligned release
+TBB_INTERFACE_VERSION == 4001
-Changes (w.r.t. TBB 2.2 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.2 commercial-aligned release):
- Incorporates all changes from open-source releases below.
- Documentation was updated.
@@ -522,7 +684,7 @@ Changes (w.r.t. TBB 2.2 commercial-aligned release):
------------------------------------------------------------------------
20090809 open-source release
-Changes (w.r.t. TBB 2.2 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.2 commercial-aligned release):
- Fixed known exception safety issues in concurrent_vector.
- Better concurrency of simultaneous grow requests in concurrent_vector.
@@ -532,9 +694,10 @@ Changes (w.r.t. TBB 2.2 commercial-aligned release):
- A few other small changes in code and documentation.
------------------------------------------------------------------------
-TBB 2.2 commercial-aligned release
+Intel TBB 2.2 commercial-aligned release
+TBB_INTERFACE_VERSION == 4000
-Changes (w.r.t. TBB 2.1 U4 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.1 U4 commercial-aligned release):
- Incorporates all changes from open-source releases below.
- Architecture folders renamed from em64t to intel64 and from itanium
@@ -581,9 +744,10 @@ Changes affecting backward compatibility:
iterators; old semantics is deprecated.
------------------------------------------------------------------------
-TBB 2.1 Update 4 commercial-aligned release
+Intel TBB 2.1 Update 4 commercial-aligned release
+TBB_INTERFACE_VERSION == 3016
-Changes (w.r.t. TBB 2.1 U3 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.1 U3 commercial-aligned release):
- Added tests for aligned memory allocations and malloc replacement.
- Several improvements for better bundling with Intel(R) C++ Compiler.
@@ -626,9 +790,10 @@ Bugs fixed:
- The same list as in TBB 2.1 Update 4 right above.
------------------------------------------------------------------------
-TBB 2.1 Update 3 commercial-aligned release
+Intel TBB 2.1 Update 3 commercial-aligned release
+TBB_INTERFACE_VERSION == 3015
-Changes (w.r.t. TBB 2.1 U2 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.1 U2 commercial-aligned release):
- Added support for aligned allocations to the TBB memory allocator.
- Added a special library to use with LD_PRELOAD on Linux* in order to
@@ -650,9 +815,10 @@ Bugs fixed:
with different vector instances.
------------------------------------------------------------------------
-TBB 2.1 Update 2 commercial-aligned release
+Intel TBB 2.1 Update 2 commercial-aligned release
+TBB_INTERFACE_VERSION == 3014
-Changes (w.r.t. TBB 2.1 U1 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.1 U1 commercial-aligned release):
- Incorporates all open-source-release changes down to TBB 2.1 U1,
except for:
@@ -723,12 +889,14 @@ Changes (w.r.t. previous open-source release):
and documents.
------------------------------------------------------------------------
-TBB 2.1 Update 1 commercial-aligned release
+Intel TBB 2.1 Update 1 commercial-aligned release
+TBB_INTERFACE_VERSION == 3013
-Changes (w.r.t. TBB 2.1 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.1 commercial-aligned release):
- Fixed small memory leak in the memory allocator.
-- Incorporates all open-source-release changes since TBB 2.1, except for:
+- Incorporates all open-source-release changes since TBB 2.1,
+ except for:
- 20080825 changes for parallel_do;
------------------------------------------------------------------------
@@ -785,9 +953,10 @@ Changes (w.r.t. previous open-source release):
- A few more improvements to the code.
------------------------------------------------------------------------
-TBB 2.1 commercial-aligned release
+Intel TBB 2.1 commercial-aligned release
+TBB_INTERFACE_VERSION == 3011
-Changes (w.r.t. TBB 2.0 U3 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.0 U3 commercial-aligned release):
- All open-source-release changes down to, and including, TBB 2.0 below,
were incorporated into this release.
@@ -845,12 +1014,12 @@ Bugs fixed:
- 112 - fix for soname support.
------------------------------------------------------------------------
-TBB 2.0 U3 commercial-aligned release (package 017, April 20, 2008)
+Intel TBB 2.0 U3 commercial-aligned release (package 017, April 20, 2008)
Corresponds to commercial 019 (for Linux*, 020; for Mac OS* X, 018)
packages.
-Changes (w.r.t. TBB 2.0 U2 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.0 U2 commercial-aligned release):
- Does not contain open-source-release changes below; this release is
only a minor update of TBB 2.0 U2.
@@ -950,12 +1119,12 @@ Changes (w.r.t. previous open-source release):
- Various improvements to code, tests, examples and Makefiles.
------------------------------------------------------------------------
-TBB 2.0 U2 commercial-aligned release (package 017, February 14, 2008)
+Intel TBB 2.0 U2 commercial-aligned release (package 017, February 14, 2008)
Corresponds to commercial 017 (for Linux*, 018; for Mac OS* X, 016)
packages.
-Changes (w.r.t. TBB 2.0 U1 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.0 U1 commercial-aligned release):
- Does not contain open-source-release changes below; this release is
only a minor update of TBB 2.0 U1.
@@ -1089,21 +1258,21 @@ Changes (w.r.t. previous open-source release):
------------------------------------------------------------------------
20070927 open-source release
-Changes (w.r.t. TBB 2.0 U1 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.0 U1 commercial-aligned release):
- Minor update to TBB 2.0 U1 below.
- Begin introduction of new concurrent_vector interfaces not released
with TBB 2.0 U1.
------------------------------------------------------------------------
-TBB 2.0 U1 commercial-aligned release (package 014, October 1, 2007)
+Intel TBB 2.0 U1 commercial-aligned release (package 014, October 1, 2007)
Corresponds to commercial 014 (for Linux*, 016) packages.
-Changes (w.r.t. TBB 2.0 commercial-aligned release):
+Changes (w.r.t. Intel TBB 2.0 commercial-aligned release):
-- All open-source-release changes down to, and including, TBB 2.0 below,
- were incorporated into this release.
+- All open-source-release changes down to, and including, TBB 2.0
+ below, were incorporated into this release.
- Made a number of changes to the officially supported OS list:
Added Linux* OSs:
Asianux* 3, Debian* 4.0, Fedora Core* 6, Fedora* 7,
@@ -1155,40 +1324,40 @@ Changes:
- Changes to eliminate spurious build warnings.
------------------------------------------------------------------------
-TBB 2.0 commercial-aligned release (package 010, July 19, 2007)
+Intel TBB 2.0 commercial-aligned release (package 010, July 19, 2007)
Corresponds to commercial 010 (for Linux*, 012) packages.
- TBB open-source debut release.
------------------------------------------------------------------------
-TBB 1.1 commercial release (April 10, 2007)
+Intel TBB 1.1 commercial release (April 10, 2007)
-Changes (w.r.t. TBB 1.0 commercial release):
+Changes (w.r.t. Intel TBB 1.0 commercial release):
- auto_partitioner which offered an automatic alternative to specifying
a grain size parameter to estimate the best granularity for tasks.
- The release was added to the Intel(R) C++ Compiler 10.0 Pro.
------------------------------------------------------------------------
-TBB 1.0 Update 2 commercial release
+Intel TBB 1.0 Update 2 commercial release
-Changes (w.r.t. TBB 1.0 Update 1 commercial release):
+Changes (w.r.t. Intel TBB 1.0 Update 1 commercial release):
- Mac OS* X 64-bit support added.
- Source packages for commercial releases introduced.
------------------------------------------------------------------------
-TBB 1.0 Update 1 commercial-aligned release
+Intel TBB 1.0 Update 1 commercial-aligned release
-Changes (w.r.t. TBB 1.0 commercial release):
+Changes (w.r.t. Intel TBB 1.0 commercial release):
- Fix for critical package issue on Mac OS* X.
------------------------------------------------------------------------
-TBB 1.0 commercial release (August 29, 2006)
+Intel TBB 1.0 commercial release (August 29, 2006)
-Changes (w.r.t. TBB 1.0 beta commercial release):
+Changes (w.r.t. Intel TBB 1.0 beta commercial release):
- New namespace (and compatibility headers for old namespace).
Namespaces are tbb and tbb::internal and all classes are in the
@@ -1207,7 +1376,7 @@ Changes (w.r.t. TBB 1.0 beta commercial release):
- Added push_back() interface to concurrent_vector().
------------------------------------------------------------------------
-TBB 1.0 beta commercial release
+Intel TBB 1.0 beta commercial release
Initial release.
diff --git a/Makefile b/Makefile
index b35d19f..8616ffc 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/AIX.gcc.inc b/build/AIX.gcc.inc
index 252f3af..a5f610c 100644
--- a/build/AIX.gcc.inc
+++ b/build/AIX.gcc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/AIX.inc b/build/AIX.inc
index 3a80f20..7255de8 100644
--- a/build/AIX.inc
+++ b/build/AIX.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -69,7 +69,8 @@ LINK_TBB.LIB = $(TBB.LIB)
MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
MALLOC.LIB = $(MALLOC.DLL)
+LINK_MALLOC.LIB = $(MALLOC.LIB)
TBB_NOSTRICT=1
-TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh
+TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs)
diff --git a/build/FreeBSD.gcc.inc b/build/FreeBSD.gcc.inc
index 8905476..da461ee 100644
--- a/build/FreeBSD.gcc.inc
+++ b/build/FreeBSD.gcc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/FreeBSD.inc b/build/FreeBSD.inc
index 9b3c21f..2c1c66d 100644
--- a/build/FreeBSD.inc
+++ b/build/FreeBSD.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -77,7 +77,8 @@ LINK_TBB.LIB = $(TBB.LIB)
MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
MALLOC.LIB = $(MALLOC.DLL)
+LINK_MALLOC.LIB = $(MALLOC.LIB)
TBB_NOSTRICT=1
-TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh
+TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs)
diff --git a/build/Makefile.rml b/build/Makefile.rml
index 809b013..1f7ddba 100644
--- a/build/Makefile.rml
+++ b/build/Makefile.rml
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -49,8 +49,8 @@ include $(tbb_root)/build/common_rules.inc
RML_SERVER.OBJ = rml_server.$(OBJ)
# Object files that RML clients need
-RML_TBB_CLIENT.OBJ = rml_tbb.$(OBJ) dynamic_link_rml.$(OBJ)
-RML_OMP_CLIENT.OBJ = rml_omp.$(OBJ) omp_dynamic_link.$(OBJ)
+RML_TBB_CLIENT.OBJ ?= rml_tbb.$(OBJ) dynamic_link_rml.$(OBJ)
+RML_OMP_CLIENT.OBJ ?= rml_omp.$(OBJ) omp_dynamic_link.$(OBJ)
RML.OBJ = $(RML_SERVER.OBJ) $(RML_TBB_CLIENT.OBJ) $(RML_OMP_CLIENT.OBJ)
ifeq (windows,$(tbb_os))
@@ -61,11 +61,12 @@ RML_ASM.OBJ = $(if $(findstring ia64,$(arch)),$(TBB_ASM.OBJ))
endif
RML_TBB_DEP= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) concurrent_vector_rml.$(OBJ) semaphore_rml.$(OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ)
-TBB_DEP_NON_RML_TEST= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) $(RML_ASM.OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ)
-TBB_DEP_RML_TEST= $(RML_ASM.OBJ)
+TBB_DEP_NON_RML_TEST?= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) $(RML_ASM.OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ)
ifeq ($(cfg),debug)
RML_TBB_DEP+= spin_mutex_rml.$(OBJ)
-TBB_DEP_RML_TEST+= tbb_misc_rml.$(OBJ)
+TBB_DEP_RML_TEST?= $(RML_ASM.OBJ) tbb_misc_rml.$(OBJ)
+else
+TBB_DEP_RML_TEST?= $(RML_ASM.OBJ)
endif
LIBS += $(LIBDL)
diff --git a/build/Makefile.tbb b/build/Makefile.tbb
index fded71b..e384504 100644
--- a/build/Makefile.tbb
+++ b/build/Makefile.tbb
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/Makefile.tbbmalloc b/build/Makefile.tbbmalloc
index 48cbdb0..49d6a97 100644
--- a/build/Makefile.tbbmalloc
+++ b/build/Makefile.tbbmalloc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -95,7 +95,7 @@ endif
ifneq (,$(MALLOCPROXY.DLL))
$(MALLOCPROXY.DLL): BUILDING_LIBRARY = $(MALLOCPROXY.DLL)
$(MALLOCPROXY.DLL): $(PROXY.OBJ) $(MALLOCPROXY_NO_VERSION.DLL) $(MALLOC.DLL) $(MALLOC.RES)
- $(LIB_LINK_CMD) $(LIB_OUTPUT_KEY)$(MALLOCPROXY.DLL) $(PROXY.OBJ) $(MALLOC.RES) $(LIB_LINK_LIBS) $(LINK_MALLOC.LIB) $(PROXY_LINK_FLAGS)
+ $(LIB_LINK_CMD) $(LIB_OUTPUT_KEY)$(MALLOCPROXY.DLL) $(PROXY.OBJ) $(MALLOC.RES) $(LIB_LINK_LIBS) $(LINK_MALLOC_LIB) $(PROXY_LINK_FLAGS)
endif
ifneq (,$(MALLOC_NO_VERSION.DLL))
@@ -135,13 +135,22 @@ MALLOC_MAIN_TESTS = test_ScalableAllocator.$(TEST_EXT) \
test_malloc_pools.$(TEST_EXT)
MALLOC_OVERLOAD_TESTS = test_malloc_overload.$(TEST_EXT) test_malloc_overload_proxy.$(TEST_EXT) test_malloc_atexit.$(TEST_EXT)
-MALLOC_LIB = $(call cross_suffix,$(MALLOC.LIB))
-MALLOC_PROXY_LIB = $(call cross_suffix,$(MALLOCPROXY.LIB))
+MALLOC_LIB ?= $(call cross_suffix,$(MALLOC.LIB))
+MALLOC_PROXY_LIB ?= $(call cross_suffix,$(MALLOCPROXY.LIB))
+LINK_MALLOC_LIB ?= $(call cross_suffix,$(LINK_MALLOC.LIB))
+LINK_MALLOC_PROXY_LIB ?= $(call cross_suffix,$(LINK_MALLOCPROXY.LIB))
ifeq (windows.gcc,$(tbb_os).$(compiler))
test_malloc_overload.$(TEST_EXT): LIBS += $(MALLOC_PROXY_LIB)
endif
+# on Ubuntu 11.10 linker called with --as-needed, so dependence on libtbbmalloc_proxy
+# is not created, and malloc overload via linking with -ltbbmalloc_proxy is not working.
+# Overcome with --no-as-needed.
+ifeq (linux.gcc,$(tbb_os).$(compiler))
+test_malloc_atexit.$(TEST_EXT): MALLOC_PROXY_LIB := -Wl,--no-as-needed $(MALLOC_PROXY_LIB)
+endif
+
test_malloc_overload.$(TEST_EXT): test_malloc_overload.cpp
$(CPLUS) $(OUTPUT_KEY)$@ $(subst /MT,/MD,$(M_CPLUS_FLAGS)) $(M_INCLUDES) $< $(LIBDL) $(LIBS) $(LINK_FLAGS)
test_malloc_overload_proxy.$(TEST_EXT): test_malloc_overload.cpp $(MALLOC_PROXY_LIB)
@@ -157,23 +166,24 @@ test_malloc_lib_unload.$(TEST_EXT): test_malloc_lib_unload.cpp test_malloc_lib_u
test_malloc_used_by_lib.$(TEST_EXT): test_malloc_used_by_lib.cpp test_malloc_used_by_lib.$(DLL)
$(CPLUS) $(OUTPUT_KEY)$@ $(M_CPLUS_FLAGS) $(M_INCLUDES) $< $(LIBS) $(LIBDL) $(LINK_FLAGS)
-test_malloc_used_by_lib.$(DLL): test_malloc_used_by_lib.cpp
- $(CPLUS) $(OUTPUT_KEY)$@ $(subst /MT,/LD,$(M_CPLUS_FLAGS)) $(PIC_KEY) $(M_INCLUDES) $(DEFINE_KEY)_USRDLL $< $(MALLOC_LIB) $(LINK_FLAGS) $(DYLIB_KEY)
+test_malloc_used_by_lib.$(DLL): test_malloc_used_by_lib.cpp $(MALLOC_LIB)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(subst /MT,/LD,$(M_CPLUS_FLAGS)) $(PIC_KEY) $(M_INCLUDES) $(DEFINE_KEY)_USRDLL $< $(LINK_MALLOC_LIB) $(LINK_FLAGS) $(DYLIB_KEY)
$(MALLOC_MAIN_TESTS): %.$(TEST_EXT): %.$(OBJ) $(MALLOC_LIB)
- $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(MALLOC_LIB) $(LIBS) $(LINK_FLAGS)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LINK_MALLOC_LIB) $(LIBS) $(LINK_FLAGS)
MALLOC_C_TESTS = test_malloc_pure_c.$(TEST_EXT)
$(MALLOC_C_TESTS): %.$(TEST_EXT): %.$(OBJ) $(MALLOC_LIB)
- $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $^ $(LIBS) $(LINK_FLAGS)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $^ $(LINK_MALLOC_LIB) $(LIBS) $(LINK_FLAGS)
# Rules for generating a test DLL
%_dll.$(DLL): %_dll.$(OBJ)
- $(LIB_LINK_CMD) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $(PIC_KEY) $< $(LIBS) $(LINK_FLAGS) $(DYLIB_KEY)
+ $(LIB_LINK_CMD) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $(PIC_KEY) $< $(LIBS) $(LIBDL) $(LINK_FLAGS) $(DYLIB_KEY)
+.PRECIOUS: %_dll.$(OBJ)
-test_malloc_atexit.$(TEST_EXT): test_malloc_atexit.$(OBJ) test_malloc_atexit_dll.$(DLL)
- $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(MALLOC_PROXY_LIB) $(MALLOC_LIB) test_malloc_atexit_dll.$(LIBEXT) $(LIBS) $(LINK_FLAGS)
+test_malloc_atexit.$(TEST_EXT): test_malloc_atexit.$(OBJ) test_malloc_atexit_dll.$(DLL) $(MALLOC_LIB)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(MALLOC_PROXY_LIB) $(LINK_MALLOC_LIB) test_malloc_atexit_dll.$(LIBEXT) $(LIBS) $(LINK_FLAGS)
MALLOC_TESTS = $(MALLOC_MAIN_TESTS) $(MALLOC_C_TESTS) test_malloc_whitebox.$(TEST_EXT) test_malloc_used_by_lib.$(TEST_EXT)
ifneq (,$(MALLOCPROXY.DLL))
@@ -187,13 +197,13 @@ malloc_test_no_depends: $(TEST_PREREQUISITE) $(MALLOC_TESTS)
$(run_cmd) ./test_malloc_pools.$(TEST_EXT) $(args) 1:4
ifneq (,$(MALLOCPROXY.DLL))
$(run_cmd) ./test_malloc_atexit.$(TEST_EXT) $(args)
- $(run_cmd) ./test_malloc_lib_unload.$(TEST_EXT) $(args)
+ $(run_cmd) $(TEST_LAUNCHER) test_malloc_lib_unload.$(TEST_EXT) $(args)
$(run_cmd) $(TEST_LAUNCHER) -l $(call cross_suffix,$(MALLOCPROXY.DLL)) test_malloc_overload.$(TEST_EXT) $(args)
$(run_cmd) $(TEST_LAUNCHER) test_malloc_overload_proxy.$(TEST_EXT) $(args)
endif
$(run_cmd) ./test_malloc_used_by_lib.$(TEST_EXT)
$(run_cmd) ./test_malloc_whitebox.$(TEST_EXT) $(args) 1:4
- $(run_cmd) $(TEST_LAUNCHER) test_malloc_compliance.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) $(TEST_LAUNCHER) -u test_malloc_compliance.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_ScalableAllocator.$(TEST_EXT) $(args)
$(run_cmd) ./test_ScalableAllocator_STL.$(TEST_EXT) $(args)
$(run_cmd) ./test_malloc_regression.$(TEST_EXT) $(args)
diff --git a/build/Makefile.tbbproxy b/build/Makefile.tbbproxy
index eb60d2f..c8ae845 100644
--- a/build/Makefile.tbbproxy
+++ b/build/Makefile.tbbproxy
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -58,6 +58,7 @@ PROXY.OBJ := $(PROXY_CPLUS.OBJ) $(PROXY_ASM.OBJ)
# Not using default libs prevents link issues caused by different CRT versions in tbbproxy and in an app.
$(PROXY.OBJ): CPLUS_FLAGS += $(DEFINE_KEY)ARCH_$(arch) $(DEFINE_KEY)OS_$(tbb_os) $(NOINTRINSIC_KEY) $(NODEFAULTLIB_KEY)
+$(PROXY_CPLUS.OBJ): CPLUS_FLAGS+=$(if $(filter windows.%cl,$(tbb_os).$(compiler)),/Fdtbbproxy$(DEBUG_SUFFIX).pdb)
$(PROXY_CPLUS.OBJ): %.$(OBJ): %.cpp
$(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(INCLUDES) $<
diff --git a/build/Makefile.test b/build/Makefile.test
index 4266466..4d60149 100644
--- a/build/Makefile.test
+++ b/build/Makefile.test
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -67,7 +67,6 @@ test_model_plugin.$(TEST_EXT): CPLUS_FLAGS := $(CPLUS_FLAGS:$(USE_PROXY_FLAG)=)
test_model_plugin.$(TEST_EXT): test_model_plugin.$(OBJ) test_model_plugin_dll.$(DLL)
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LIBDL) $(LIBS) $(LINK_FLAGS)
-
# tbb_misc.$(OBJ) has to be specified here (instead of harness_inject_scheduler.h) because it carries dependency on version_string.ver
SCHEDULER_DEPENDENCIES = $(TBB_ASM.OBJ) tbb_misc.$(OBJ)
@@ -87,34 +86,41 @@ $(SCHEDULER_DIRECTLY_INCLUDED): %.$(TEST_EXT) : %.$(OBJ) $(SCHEDULER_DEPENDENCIE
# Tests that use some features of C++11
TEST_TBB_CPP11 = test_lambda.$(TEST_EXT) test_cache_aligned_allocator_STL.$(TEST_EXT)
+ifneq (0,$(cpp0x))
$(TEST_TBB_CPP11:%.$(TEST_EXT)=%.$(OBJ)): %.$(OBJ): %.cpp
$(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(CPP11_FLAGS) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $<
$(TEST_TBB_CPP11): %.$(TEST_EXT): %.$(OBJ) $(TBB.LIB) $(if $(use_proxy),$(LINK_TBB.LIB))
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $(CPP11_FLAGS) $< $(LINK_TBB.LIB) $(LIBS) $(AUX_LIBS) $(LINK_FLAGS)
+endif
+
+# test_tbb_header detects "multiple definition" linker error using the test that covers the whole library
+TWICE_LINKED_TESTS = test_tbb_header.$(TEST_EXT) \
+ test_concurrent_unordered.$(TEST_EXT)
-test_tbb_header2.$(OBJ): test_tbb_header.cpp
- $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $(DEFINE_KEY)__TBB_TEST_SECONDARY=1 $< $(OUTPUTOBJ_KEY)$@
+%_secondary.$(OBJ): CPLUS_FLAGS+=$(DEFINE_KEY)__TBB_TEST_SECONDARY=1
+%_secondary.$(OBJ): %.cpp
+ $(CPLUS) $(OUTPUTOBJ_KEY)$@ $(COMPILE_ONLY) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $<
-# Detecting "multiple definition" linker error using the test that covers the whole library
-test_tbb_header.$(TEST_EXT): test_tbb_header.$(OBJ) test_tbb_header2.$(OBJ) $(TBB.LIB)
- $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) test_tbb_header.$(OBJ) test_tbb_header2.$(OBJ) $(LINK_TBB.LIB) $(LIBS) $(LINK_FLAGS)
+$(TWICE_LINKED_TESTS): %.$(TEST_EXT): %.$(OBJ) %_secondary.$(OBJ) $(TBB.LIB)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $*.$(OBJ) $*_secondary.$(OBJ) $(LINK_TBB.LIB) $(LIBS) $(AUX_LIBS) $(LINK_FLAGS)
# Checks that TBB atomics work correctly in position independent code
test_atomic_pic.$(TEST_EXT): test_atomic.cpp
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $(PIC_KEY) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $(DEFINE_KEY)__TBB_TEST_PIC=1 $< $(LINK_TBB.LIB) $(LIBS) $(AUX_LIBS) $(LINK_FLAGS)
-#Test of generic gcc port
-%_gcc_builtins.$(TEST_EXT): CPLUS_FLAGS+=$(DEFINE_KEY)__TBB_TEST_GCC_BUILTINS=1
-%_gcc_builtins.$(TEST_EXT): %.cpp
+#Test of generic gcc port and icc intrinsics port
+%_compiler_builtins.$(TEST_EXT): CPLUS_FLAGS+=$(DEFINE_KEY)__TBB_TEST_BUILTINS=1
+%_compiler_builtins.$(TEST_EXT): %.cpp
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $< $(LIBS) $(AUX_LIBS) $(LINK_FLAGS)
# The main list of TBB tests
TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
- test_assembly_gcc_builtins.$(TEST_EXT) \
+ test_tbb_fork.$(TEST_EXT) \
+ test_assembly_compiler_builtins.$(TEST_EXT) \
test_aligned_space.$(TEST_EXT) \
test_atomic.$(TEST_EXT) \
test_atomic_pic.$(TEST_EXT) \
- test_atomic_gcc_builtins.$(TEST_EXT) \
+ test_atomic_compiler_builtins.$(TEST_EXT) \
test_blocked_range.$(TEST_EXT) \
test_blocked_range2d.$(TEST_EXT) \
test_blocked_range3d.$(TEST_EXT) \
@@ -157,6 +163,7 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_tbb_header.$(TEST_EXT) \
test_combinable.$(TEST_EXT) \
test_task_auto_init.$(TEST_EXT) \
+ test_task_arena.$(TEST_EXT) \
test_concurrent_monitor.$(TEST_EXT) \
test_semaphore.$(TEST_EXT) \
test_critical_section.$(TEST_EXT) \
@@ -169,6 +176,7 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_task_steal_limit.$(TEST_EXT) \
test_hw_concurrency.$(TEST_EXT) \
test_fp.$(TEST_EXT) \
+ test_tuple.$(TEST_EXT) \
test_flow_graph.$(TEST_EXT) \
test_broadcast_node.$(TEST_EXT) \
test_continue_node.$(TEST_EXT) \
@@ -185,6 +193,10 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_or_node.$(TEST_EXT) \
test_multifunction_node.$(TEST_EXT) \
test_split_node.$(TEST_EXT) \
+ test_static_assert.$(TEST_EXT) \
+ test_aggregator.$(TEST_EXT) \
+ test_concurrent_lru_cache.$(TEST_EXT) \
+ test_examples_common_utility.$(TEST_EXT) \
test_tbb_version.$(TEST_EXT) # insert new files right above
TEST_TBB_PLAIN.EXE += $(TEST_TBB_CPP11)
@@ -223,14 +235,13 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(SCHEDULER_DIRECTLY_INCLUDED) $(TEST_TBB_P
$(run_cmd) ./test_tbb_version.$(TEST_EXT) $(args)
# Checking TBB version first to make sure the following testing has anything in it
$(run_cmd) ./test_assembly.$(TEST_EXT) $(args)
- $(run_cmd) ./test_assembly_gcc_builtins.$(TEST_EXT) $(args)
$(run_cmd) ./test_atomic.$(TEST_EXT) $(args)
$(run_cmd) ./test_atomic_pic.$(TEST_EXT) $(args)
- $(run_cmd) ./test_atomic_gcc_builtins.$(TEST_EXT) $(args)
# Yes, 4:8 is intended on the next line.
$(run_cmd) ./test_yield.$(TEST_EXT) $(args) 4:8
$(run_cmd) ./test_handle_perror.$(TEST_EXT) $(args)
$(run_cmd) ./test_task_auto_init.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_task_arena.$(TEST_EXT) $(args)
$(run_cmd) ./test_task_scheduler_init.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_task_scheduler_observer.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_task.$(TEST_EXT) $(args) 1:4
@@ -282,6 +293,7 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(SCHEDULER_DIRECTLY_INCLUDED) $(TEST_TBB_P
$(run_cmd) ./test_semaphore.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_reader_writer_lock.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_tbb_condition_variable.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_tbb_fork.$(TEST_EXT)
$(run_cmd) ./test_intrusive_list.$(TEST_EXT) $(args)
$(run_cmd) ./test_concurrent_priority_queue.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_task_priority.$(TEST_EXT) $(args)
@@ -289,6 +301,7 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(SCHEDULER_DIRECTLY_INCLUDED) $(TEST_TBB_P
$(run_cmd) ./test_task_steal_limit.$(TEST_EXT) $(args)
$(run_cmd) ./test_hw_concurrency.$(TEST_EXT) $(args)
$(run_cmd) ./test_fp.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_tuple.$(TEST_EXT) $(args)
$(run_cmd) ./test_flow_graph.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_broadcast_node.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_continue_node.$(TEST_EXT) $(args) 1:4
@@ -305,10 +318,16 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(SCHEDULER_DIRECTLY_INCLUDED) $(TEST_TBB_P
$(run_cmd) ./test_or_node.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_multifunction_node.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_split_node.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_examples_common_utility.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_atomic_compiler_builtins.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_assembly_compiler_builtins.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_static_assert.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_aggregator.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_concurrent_lru_cache.$(TEST_EXT) $(args)
-CPLUS_FLAGS_DEPRECATED = $(DEFINE_KEY)TBB_DEPRECATED=1 $(subst $(WARNING_KEY),,$(CPLUS_FLAGS)) $(WARNING_SUPPRESS)
+CPLUS_FLAGS_DEPRECATED = $(DEFINE_KEY)TBB_DEPRECATED=1 $(subst $(WARNING_KEY),,$(CPLUS_FLAGS)) $(WARNING_SUPPRESS) $(INCLUDE_KEY)$(tbb_root)/src/test
-TEST_TBB_OLD.OBJ = test_concurrent_vector_v2.$(OBJ) test_concurrent_queue_v2.$(OBJ) test_mutex_v2.$(OBJ)
+TEST_TBB_OLD.OBJ = test_concurrent_vector_v2.$(OBJ) test_concurrent_queue_v2.$(OBJ) test_mutex_v2.$(OBJ) test_task_scheduler_observer_v3.$(OBJ)
TEST_TBB_DEPRECATED.OBJ = test_concurrent_queue_deprecated.$(OBJ) \
test_concurrent_vector_deprecated.$(OBJ) \
@@ -320,6 +339,7 @@ $(TEST_TBB_OLD.OBJ): %.$(OBJ): %.cpp
%_deprecated.$(OBJ): %.cpp
$(CPLUS) $(COMPILE_ONLY) $(OUTPUTOBJ_KEY)$@ $(CPLUS_FLAGS_DEPRECATED) $(CXX_ONLY_FLAGS) $(INCLUDES) $<
+.PRECIOUS: %_deprecated.$(OBJ)
TEST_TBB_OLD.EXE = $(subst .$(OBJ),.$(TEST_EXT),$(TEST_TBB_OLD.OBJ) $(TEST_TBB_DEPRECATED.OBJ))
@@ -332,6 +352,7 @@ test_tbb_old: $(TEST_PREREQUISITE) $(TEST_TBB_OLD.EXE)
$(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 1
$(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 2
$(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 4
+ $(run_cmd) ./test_task_scheduler_observer_v3.$(TEST_EXT) $(args) 1:4
else
test_tbb_old:
@echo Legacy tests skipped
diff --git a/build/SunOS.gcc.inc b/build/SunOS.gcc.inc
index 4508447..27ff9e4 100644
--- a/build/SunOS.gcc.inc
+++ b/build/SunOS.gcc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/SunOS.inc b/build/SunOS.inc
index 4b4e854..4f8cfae 100644
--- a/build/SunOS.inc
+++ b/build/SunOS.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -84,9 +84,10 @@ LINK_TBB.LIB = $(TBB.LIB)
MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
MALLOC.LIB = $(MALLOC.DLL)
+LINK_MALLOC.LIB = $(MALLOC.LIB)
MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
TBB_NOSTRICT=1
-TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh
+TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs)
diff --git a/build/SunOS.suncc.inc b/build/SunOS.suncc.inc
index 46add22..8f4ed7a 100644
--- a/build/SunOS.suncc.inc
+++ b/build/SunOS.suncc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -48,6 +48,7 @@ LINK_FLAGS += -M$(tbb_root)/build/suncc.map.pause
LIBS = -lpthread -lrt -R .
C_FLAGS = $(CPLUS_FLAGS)
+#TODO: the $(stdlib) instead of hard-wiring STLPort
ifeq ($(cfg), release)
CPLUS_FLAGS = -mt -xO2 -library=stlport4 -DUSE_PTHREAD $(WARNING_SUPPRESS)
endif
diff --git a/build/linux.gcc.inc b/build/android.gcc.inc
similarity index 62%
copy from build/linux.gcc.inc
copy to build/android.gcc.inc
index 8e455a8..682ae2e 100644
--- a/build/linux.gcc.inc
+++ b/build/android.gcc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -24,6 +24,7 @@
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.
+
COMPILE_ONLY = -c -MMD
PREPROC_ONLY = -E -x c++
INCLUDE_KEY = -I
@@ -33,7 +34,7 @@ OUTPUTOBJ_KEY = -o #
PIC_KEY = -fPIC
WARNING_AS_ERROR_KEY = -Werror
WARNING_KEY = -Wall
-TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor $(if $(findstring cc4., $(runtime)),-Wextra)
+TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor -Wextra
WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor
DYLIB_KEY = -shared
@@ -42,78 +43,81 @@ LIBDL = -ldl
TBB_NOSTRICT = 1
-CPLUS = g++
-CONLY = gcc
+CPLUS = $(tbb_tool_prefix)g++
+CONLY = $(tbb_tool_prefix)gcc
+
+# -soname is necessary for proper linkage to TBB prebuilt libraries when building application with Android SDK
LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY)
-LIBS += -lpthread -lrt
+
LINK_FLAGS = -Wl,-rpath-link=.
C_FLAGS = $(CPLUS_FLAGS)
-# gcc 4.4 and higher support -std=c++0x
-ifneq (,$(shell gcc -dumpversion | egrep "^(4\.[4-9]|[5-9])"))
- CPP11_FLAGS = -std=c++0x -D_TBB_CPP0X
-endif
-# gcc 4.2 and higher support OpenMP
-ifneq (,$(shell gcc -dumpversion | egrep "^(4\.[2-9]|[5-9])"))
- OPENMP_FLAG = -fopenmp
+# gcc 4.4 and higher support C++11
+ifneq (,$(shell $(CPLUS) -dumpversion | egrep "^(4\.[4-9]|[5-9])"))
+ # On Android/gcc 4.4.3, -std=c++0x causes ::int64_t and ::uint64_t to be undefined.
+ CPP11_FLAGS = -std=gnu++0x $(DEFINE_KEY)_TBB_CPP0X
endif
-ITT_NOTIFY = -DDO_ITT_NOTIFY
ifeq ($(cfg), release)
- CPLUS_FLAGS = $(ITT_NOTIFY) -g -O2 -DUSE_PTHREAD
+ CPLUS_FLAGS = -O2
endif
ifeq ($(cfg), debug)
- CPLUS_FLAGS = -DTBB_USE_DEBUG $(ITT_NOTIFY) -g -O0 -DUSE_PTHREAD
+ CPLUS_FLAGS = -g -O0 $(DEFINE_KEY)TBB_USE_DEBUG
endif
-ifneq (00,$(lambdas)$(cpp0x))
- CXX_ONLY_FLAGS += $(CPP11_FLAGS)
+CPLUS_FLAGS += $(DEFINE_KEY)USE_PTHREAD $(DEFINE_KEY)_GLIBCXX_HAVE_FENV_H
+
+ifneq (,$(findstring $(arch),ia32 intel64))
+ CPLUS_FLAGS += $(DEFINE_KEY)DO_ITT_NOTIFY
endif
-TBB_ASM.OBJ=
-MALLOC_ASM.OBJ=
+ifneq (0, $(dlopen_workaround))
+ CPLUS_FLAGS += $(DEFINE_KEY)__TBB_USE_DLOPEN_REENTRANCY_WORKAROUND=1
+ CPLUS_FLAGS += $(DEFINE_KEY)__TBB_USE_DLOPEN_MAIN_PROGRAM_WORKAROUND=1
+else
+ CPLUS_FLAGS += $(DEFINE_KEY)__TBB_USE_DLOPEN_REENTRANCY_WORKAROUND=0
+ CPLUS_FLAGS += $(DEFINE_KEY)__TBB_USE_DLOPEN_MAIN_PROGRAM_WORKAROUND=0
+endif
-ifeq (ia64,$(arch))
- ITT_NOTIFY =
-# Position-independent code (PIC) is a must on IA-64, even for regular (not shared) executables
- CPLUS_FLAGS += $(PIC_KEY)
+ifeq (0, $(dynamic_load))
+ CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DYNAMIC_LOAD_ENABLED=0
endif
-ifeq (intel64,$(arch))
- CPLUS_FLAGS += -m64
- LIB_LINK_FLAGS += -m64
+
+# Paths to the NDK prebuilt tools and libraries
+CPLUS_FLAGS += --sysroot=$(SYSROOT)
+LIB_LINK_FLAGS += --sysroot=$(SYSROOT)
+LIBS = -L$(CPLUS_LIB_PATH) -lgnustl_shared
+
+# This causes CPP11_FLAGS to be issued twice for test_lambda.cpp
+# TODO: Fix this in general for all platforms once the correct strategy is determined.
+ifneq (00,$(lambdas)$(cpp0x))
+ CXX_ONLY_FLAGS += $(CPP11_FLAGS)
endif
ifeq (ia32,$(arch))
- CPLUS_FLAGS += -m32 -march=pentium4
+ # TODO: Determine best setting of -march and add to CPLUS_FLAGS
+ CPLUS_FLAGS += -m32
LIB_LINK_FLAGS += -m32
endif
-ifeq (ppc64,$(arch))
+# Currently, no intel64 support for Android, but if added later, these flags may suffice
+ifeq (intel64,$(arch))
CPLUS_FLAGS += -m64
LIB_LINK_FLAGS += -m64
endif
-ifeq (ppc32,$(arch))
- CPLUS_FLAGS += -m32
- LIB_LINK_FLAGS += -m32
-endif
-
-ifeq (bgp,$(arch))
- CPLUS = mpicxx
- CONLY = mpicc
-endif
-
-# for some gcc versions on Solaris, -m64 may imply V9, but perhaps not everywhere (TODO: verify)
-ifeq (sparc,$(arch))
- CPLUS_FLAGS += -mcpu=v9 -m64
- LIB_LINK_FLAGS += -mcpu=v9 -m64
+ifeq (arm,$(findstring arm,$(arch)))
+ CPLUS_FLAGS += -march=armv7-a $(DEFINE_KEY)TBB_USE_GCC_BUILTINS=1 $(DEFINE_KEY)__TBB_64BIT_ATOMICS=0
endif
#------------------------------------------------------------------------------
# Setting assembler data.
#------------------------------------------------------------------------------
-ASM = as
+TBB_ASM.OBJ=
+MALLOC_ASM.OBJ=
+
+ASM = $(tbb_tool_prefix)as
ifeq (intel64,$(arch))
ASM_FLAGS += --64
endif
@@ -125,11 +129,6 @@ ifeq ($(cfg),debug)
endif
ASSEMBLY_SOURCE=$(arch)-gas
-ifeq (ia64,$(arch))
- ASM_FLAGS += -xexplicit
- TBB_ASM.OBJ += atomic_support.o lock_byte.o log2.o pause.o ia64_misc.o
- MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o log2.o
-endif
#------------------------------------------------------------------------------
# End of setting assembler data.
#------------------------------------------------------------------------------
diff --git a/build/android.inc b/build/android.inc
new file mode 100644
index 0000000..45650fe
--- /dev/null
+++ b/build/android.inc
@@ -0,0 +1,77 @@
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+#
+# This file is part of Threading Building Blocks.
+#
+# Threading Building Blocks is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# Threading Building Blocks is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Threading Building Blocks; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction. Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License. This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+#
+# Extra gmake command-line parameters for use with Android:
+#
+# dlopen_workaround: Some OS versions need workaround for dlopen to avoid recursive calls.
+#
+
+####### Detections and Commands ###############################################
+
+ifeq (android,$(findstring android,$(tbb_os)))
+ $(error TBB only supports cross-compilation for Android. Specify "target=android" instead.)
+endif
+
+ifneq ("command line","$(origin arch)")
+ ifeq (icc,$(compiler))
+ export COMPILER_VERSION := ICC: $(shell icc -V </dev/null 2>&1 | grep 'Version')
+ ifneq (,$(findstring IA-32, $(COMPILER_VERSION)))
+ export arch:=ia32
+ else
+ $(error "No support for Android in $(COMPILER_VERSION)")
+ endif
+
+ else
+ ifdef ANDROID_SERIAL
+ uname_m:=$(shell adb shell uname -m)
+ ifeq (i686,$(uname_m))
+ export arch:=ia32
+ else
+ export arch:=$(uname_m)
+ endif
+ else
+ ifndef arch
+ $(error "No target architecture specified and \'ANDROID_SERIAL\' environment variable specifying target device not set")
+ endif
+ endif
+ endif
+endif
+
+ifneq (ia32,$(arch))
+ ifneq (arm,$(findstring arm,$(arch)))
+ $(error "Unsupported architecture for Android target build: arch=$(arch).\nPlease ensure target device is connected via \'adb\' and \'ANDROID_SERIAL\' is set to target device.")
+ endif
+endif
+
+
+# Many OS versions (Android 4.0.[0-3] for example) need workaround for dlopen to avoid non-recursive loader lock hang
+export dlopen_workaround = 1
+
+# Android platform only supported from TBB 4.1 forward
+NO_LEGACY_TESTS = 1
+
+
diff --git a/build/macos.inc b/build/android.linux.inc
similarity index 56%
copy from build/macos.inc
copy to build/android.linux.inc
index 31a80f0..887b541 100644
--- a/build/macos.inc
+++ b/build/android.linux.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -26,73 +26,53 @@
####### Detections and Commands ###############################################
-ifeq (icc,$(compiler))
- export COMPILER_VERSION := ICC: $(shell icc -V </dev/null 2>&1 | grep 'Version')
- ifneq (,$(findstring IA-32, $(COMPILER_VERSION)))
- export arch:=ia32
- endif
- ifneq (,$(findstring Intel(R) 64, $(COMPILER_VERSION)))
- export arch:=intel64
- endif
- ifeq (,$(arch))
- $(warning "Unknown Intel compiler")
- endif
+# Must set def_prefix according to target architecture detected above
+ifeq (ia32,$(arch))
+ def_prefix = lin32
endif
-
-ifndef arch
- ifeq ($(shell /usr/sbin/sysctl -n hw.machine),Power Macintosh)
- ifeq ($(shell /usr/sbin/sysctl -n hw.optional.64bitops),1)
- export arch:=ppc64
- else
- export arch:=ppc32
- endif
- else
- ifeq ($(shell /usr/sbin/sysctl -n hw.optional.x86_64 2>/dev/null),1)
- export arch:=intel64
- else
- export arch:=ia32
- endif
- endif
+ifeq (arm,$(findstring arm,$(arch)))
+ def_prefix = lin32
endif
-
-ifndef runtime
- gcc_version = $(shell gcc -dumpversion)
- os_version:=$(shell /usr/bin/sw_vers -productVersion)
- export runtime:=cc$(gcc_version)_os$(os_version)
+ifeq (64,$(findstring 64,$(arch)))
+ def_prefix = lin64
endif
-native_compiler := gcc
-export compiler ?= gcc
-debugger ?= gdb
+gcc_version = $(shell $(tbb_tool_prefix)g++ -dumpversion)
-CMD=$(SHELL) -c
-CWD=$(shell pwd)
-RM?=rm -f
-RD?=rmdir
-MD?=mkdir -p
-NUL= /dev/null
-SLASH=/
-MAKE_VERSIONS=sh $(tbb_root)/build/version_info_macos.sh $(CPLUS) $(CPLUS_FLAGS) $(INCLUDES) >version_string.ver
-MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh
+ifdef ANDROID_NDK_ROOT
+ $(warning "NDK version $(ANDROID_NDK_ROOT)")
+ ndk_version:= $(lastword $(subst -, ,$(ANDROID_NDK_ROOT)))
+else
+ $(warning "NDK version not set in environment, using \'unknown\' instead.")
+ ndk_version:=unknown
+endif
-####### Build settings ########################################################
+export runtime:=$(target)_cc$(gcc_version)_NDK$(ndk_version)_version_$(target_os_version)
-OBJ=o
-DLL=dylib
-LIBEXT=dylib
+AR = $(tbb_tool_prefix)ar
+MAKE_VERSIONS=sh $(tbb_root)/build/version_info_android.sh $(CPLUS) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) >version_string.ver
-def_prefix = $(if $(findstring 64,$(arch)),mac64,mac32)
+####### Build settings ########################################################
+# No SONAME_SUFFIX for Android allowed in library names
TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst
TBB.DEF = $(TBB.LST:.lst=.def)
TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
TBB.LIB = $(TBB.DLL)
+TBB_NO_VERSION.DLL=
LINK_TBB.LIB = $(TBB.LIB)
MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
MALLOC.LIB = $(MALLOC.DLL)
+MALLOC_NO_VERSION.DLL=
+LINK_MALLOC.LIB = $(MALLOC.LIB)
-TBB_NOSTRICT=1
+MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def
+MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
+MALLOCPROXY_NO_VERSION.DLL=
+MALLOCPROXY.LIB = $(MALLOCPROXY.DLL)
+LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB)
-TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh
+TEST_LAUNCHER=
+run_cmd ?= -sh $(tbb_root)/build/android.linux.launcher.sh $(largs)
diff --git a/build/android.linux.launcher.sh b/build/android.linux.launcher.sh
new file mode 100644
index 0000000..cb23f7b
--- /dev/null
+++ b/build/android.linux.launcher.sh
@@ -0,0 +1,164 @@
+#!/bin/sh
+#
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+#
+# This file is part of Threading Building Blocks.
+#
+# Threading Building Blocks is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# Threading Building Blocks is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Threading Building Blocks; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction. Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License. This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+# Usage:
+# android.linux.launcher.sh [-v] [-u] [-l <library>] <executable> <arg1> <arg2> <argN>
+# where: -l <library> specfies the library name to be assigned to LD_PRELOAD
+# where: -v enables verbose output when running the test (where supported)
+# where: -u is ignored on Android
+#
+# Libs and executable necessary for testing should be present in the current directory before running.
+# ANDROID_SERIAL must be set to the connected Android target device name for file transfer and test runs.
+# ANDROID_TEST_DIRECTORY may be set to the directory used for testing on the Android target device; otherwise,
+# the default directory used is "/data/local/tmp/$(basename $PWD)".
+# Note: Do not remove the redirections to '/dev/null' in the script, otherwise the nightly test system will fail.
+
+do_cleanup()
+{
+ adb pull $targetdir/events.txt events.txt > /dev/null 2>&1
+ # Remove target directory on the device
+ adb shell "rm -r ${targetdir}; mkdir -p ${targetdir}" > /dev/null 2>&1
+}
+
+do_trap_cleanup()
+{
+ do_cleanup
+ exit -1
+}
+
+# Process the optional arguments if present
+if [ "x$1" = "x-v" ]; then {
+ verb="$1"
+ shift 1
+}; fi
+
+if [ "x$1" = "x-u" ]; then {
+ shift 1
+}; fi
+
+if [ "x$1" = "x-l" ]; then {
+ ldpreload="$2"
+ shift 2
+}; fi
+
+# Collect the executable name
+exename=$(basename $1)
+shift
+
+# Prepare the target directory on the device
+currentdir=$(basename $PWD)
+targetdir=${ANDROID_TEST_DIRECTORY:-/data/local/tmp/$currentdir}
+do_cleanup
+trap do_trap_cleanup INT # if someone hits control-c, cleanup the device
+
+# Collect the list of files to transfer to the target device, starting with executable itself.
+fnamelist="$exename"
+
+# Add the C++ standard library from the NDK, which is required for all tests on Android.
+if [ ! -z "${LIB_GNU_STL_ANDROID}" ]; then
+ fnamelist="$fnamelist ${LIB_GNU_STL_ANDROID}/libgnustl_shared.so"
+else
+ fnamelist="$fnamelist libgnustl_shared.so"
+fi
+
+# Find the TBB libraries and add them to the list.
+# Add TBB libraries from the current directory that contains libtbb* files
+
+files="$(/bin/ls libtbb* 2> /dev/null)"
+if [ ! -z "$files" ]; then fnamelist="$fnamelist $files"; fi
+
+mallocfiles="$(/bin/ls libtbbmalloc* 2> /dev/null)"
+if [ ! -z "$mallocfiles" ]; then {
+ #TODO: any better workaround instead calling echo
+ #(without echo there is error: /system/bin/sh: libtbbmalloc_proxy.so: not found)
+ ldpreload="$ldpreload $(echo $mallocfiles)"
+}; fi
+
+if [ ! -z "$ldpreload" ]; then ldpreload="export LD_PRELOAD=$ldpreload;"; fi
+
+# Add any libraries built for specific tests.
+exeroot=${exename%\.*}
+files="$(/bin/ls ${exeroot}*.so ${exeroot}*.so.* 2> /dev/null)"
+if [ ! -z "$files" ]; then {
+ fnamelist="$fnamelist $files"
+}; fi
+
+# TODO: Add extra libraries from the Intel(R) Compiler for certain tests
+# found=$(echo $exename | egrep 'test_malloc_atexit\|test_malloc_lib_unload' 2> /dev/null)
+# if [ ! -z $found ] ; then
+# fnamelist="$fnamelist ${compiler_path_lib}/libimf.so \
+# ${compiler_path_lib}/libsvml.so \
+# ${compiler_path_lib}/libintlc.so.5"
+# fi
+
+# Transfer collected executable and library files to the target device.
+transfers_ok=1
+for fullname in $fnamelist; do {
+ if [ -r $fullname ]; then {
+ # Transfer the executable and libraries to top-level target directory
+ adb push $fullname ${targetdir}/$(basename $fullname) > /dev/null 2>&1
+ }; else {
+ echo "Error: required file ${currentdir}/${fullname} for test $exename not available for transfer."
+ transfers_ok=0
+ }; fi
+}; done
+
+if [ "${transfers_ok}" = "0" ]; then {
+ do_cleanup
+ exit -1
+}; fi
+
+# Transfer input files used by example codes by scanning the executable argument list.
+for fullname in "$@"; do {
+ if [ -r $fullname ]; then {
+ directory=$(dirname $fullname)
+ filename=$(basename $fullname)
+ # strip leading "." from fullname if present
+ if [ "$directory" = "\." ]; then {
+ directory=""
+ fullname=$filename
+ }; fi
+ # Create the target directory to hold input file if necessary
+ if [ ! -z $directory ]; then {
+ adb shell "mkdir $directory" > /dev/null 2>&1
+ }; fi
+ # Transfer the input file to corresponding directory on target device
+ adb push $fullname ${targetdir}/$fullname > /dev/null 2>&1
+ }; fi
+}; done
+
+# The return_code file is the best way found to return the status of the test execution when using adb shell.
+(adb shell "cd $targetdir; $ldpreload export LD_LIBRARY_PATH=.; ./$exename $verb $*; echo \$? > return_code") | sed -e "s/\\r$//"
+
+# Capture the return code string and remove the trailing \r from the return_code file contents
+exitcode=`(adb shell "cat $targetdir/return_code 2> /dev/null") | sed -e "s/\\r$//"`
+
+do_cleanup
+
+# Return the exit code of the test.
+exit $exitcode
diff --git a/build/macos.inc b/build/android.macos.inc
similarity index 56%
copy from build/macos.inc
copy to build/android.macos.inc
index 31a80f0..51169a6 100644
--- a/build/macos.inc
+++ b/build/android.macos.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -26,73 +26,62 @@
####### Detections and Commands ###############################################
-ifeq (icc,$(compiler))
- export COMPILER_VERSION := ICC: $(shell icc -V </dev/null 2>&1 | grep 'Version')
- ifneq (,$(findstring IA-32, $(COMPILER_VERSION)))
- export arch:=ia32
- endif
- ifneq (,$(findstring Intel(R) 64, $(COMPILER_VERSION)))
- export arch:=intel64
- endif
- ifeq (,$(arch))
- $(warning "Unknown Intel compiler")
- endif
+# Must set def_prefix according to target architecture detected above
+ifeq (ia32,$(arch))
+ def_prefix = lin32
endif
-
-ifndef arch
- ifeq ($(shell /usr/sbin/sysctl -n hw.machine),Power Macintosh)
- ifeq ($(shell /usr/sbin/sysctl -n hw.optional.64bitops),1)
- export arch:=ppc64
- else
- export arch:=ppc32
- endif
- else
- ifeq ($(shell /usr/sbin/sysctl -n hw.optional.x86_64 2>/dev/null),1)
- export arch:=intel64
- else
- export arch:=ia32
- endif
- endif
+ifeq (arm,$(findstring arm,$(arch)))
+ def_prefix = lin32
endif
-
-ifndef runtime
- gcc_version = $(shell gcc -dumpversion)
- os_version:=$(shell /usr/bin/sw_vers -productVersion)
- export runtime:=cc$(gcc_version)_os$(os_version)
+ifeq (64,$(findstring 64,$(arch)))
+ def_prefix = lin64
endif
-native_compiler := gcc
-export compiler ?= gcc
-debugger ?= gdb
+gcc_version = $(shell $(tbb_tool_prefix)g++ -dumpversion)
-CMD=$(SHELL) -c
-CWD=$(shell pwd)
-RM?=rm -f
-RD?=rmdir
-MD?=mkdir -p
-NUL= /dev/null
-SLASH=/
-MAKE_VERSIONS=sh $(tbb_root)/build/version_info_macos.sh $(CPLUS) $(CPLUS_FLAGS) $(INCLUDES) >version_string.ver
-MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh
+ifdef ANDROID_NDK_ROOT
+ $(warning "NDK version $(ANDROID_NDK_ROOT)")
+ ndk_version:= $(lastword $(subst -, ,$(ANDROID_NDK_ROOT)))
+else
+ $(warning "NDK version not set in environment, using \'unknown\' instead.")
+ ndk_version:=unknown
+endif
-####### Build settings ########################################################
+export runtime:=$(target)_cc$(gcc_version)_NDK$(ndk_version)_version_$(target_os_version)
-OBJ=o
-DLL=dylib
-LIBEXT=dylib
+AR = $(tbb_tool_prefix)ar
+MAKE_VERSIONS=sh $(tbb_root)/build/version_info_android.sh $(CPLUS) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) >version_string.ver
-def_prefix = $(if $(findstring 64,$(arch)),mac64,mac32)
+####### Build settings ########################################################
+# No SONAME_SUFFIX for Android allowed in library names
TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst
TBB.DEF = $(TBB.LST:.lst=.def)
TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
TBB.LIB = $(TBB.DLL)
+TBB_NO_VERSION.DLL=
LINK_TBB.LIB = $(TBB.LIB)
MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
MALLOC.LIB = $(MALLOC.DLL)
+MALLOC_NO_VERSION.DLL=
+LINK_MALLOC.LIB = $(MALLOC.LIB)
+
+MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def
+MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
+MALLOCPROXY_NO_VERSION.DLL=
+MALLOCPROXY.LIB = $(MALLOCPROXY.DLL)
+LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB)
-TBB_NOSTRICT=1
+TBB.RES =
+MALLOC.RES =
+RML.RES =
+TBB.MANIFEST =
+MALLOC.MANIFEST =
+RML.MANIFEST =
+OBJ = o
+DLL = so
-TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh
+TEST_LAUNCHER=
+run_cmd ?= -sh $(tbb_root)/build/android.linux.launcher.sh $(largs)
diff --git a/build/macos.inc b/build/android.windows.inc
similarity index 56%
copy from build/macos.inc
copy to build/android.windows.inc
index 31a80f0..a282f5c 100644
--- a/build/macos.inc
+++ b/build/android.windows.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -26,73 +26,61 @@
####### Detections and Commands ###############################################
-ifeq (icc,$(compiler))
- export COMPILER_VERSION := ICC: $(shell icc -V </dev/null 2>&1 | grep 'Version')
- ifneq (,$(findstring IA-32, $(COMPILER_VERSION)))
- export arch:=ia32
- endif
- ifneq (,$(findstring Intel(R) 64, $(COMPILER_VERSION)))
- export arch:=intel64
- endif
- ifeq (,$(arch))
- $(warning "Unknown Intel compiler")
- endif
+# Must set def_prefix according to target architecture detected above
+ifeq (ia32,$(arch))
+ def_prefix = lin32
endif
-
-ifndef arch
- ifeq ($(shell /usr/sbin/sysctl -n hw.machine),Power Macintosh)
- ifeq ($(shell /usr/sbin/sysctl -n hw.optional.64bitops),1)
- export arch:=ppc64
- else
- export arch:=ppc32
- endif
- else
- ifeq ($(shell /usr/sbin/sysctl -n hw.optional.x86_64 2>/dev/null),1)
- export arch:=intel64
- else
- export arch:=ia32
- endif
- endif
+ifeq (arm,$(findstring arm,$(arch)))
+ def_prefix = lin32
endif
-
-ifndef runtime
- gcc_version = $(shell gcc -dumpversion)
- os_version:=$(shell /usr/bin/sw_vers -productVersion)
- export runtime:=cc$(gcc_version)_os$(os_version)
+ifeq (64,$(findstring 64,$(arch)))
+ def_prefix = lin64
endif
-native_compiler := gcc
-export compiler ?= gcc
-debugger ?= gdb
+gcc_version = $(shell $(tbb_tool_prefix)g++ -dumpversion)
-CMD=$(SHELL) -c
-CWD=$(shell pwd)
-RM?=rm -f
-RD?=rmdir
-MD?=mkdir -p
-NUL= /dev/null
-SLASH=/
-MAKE_VERSIONS=sh $(tbb_root)/build/version_info_macos.sh $(CPLUS) $(CPLUS_FLAGS) $(INCLUDES) >version_string.ver
-MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh
+ifdef ANDROID_NDK_ROOT
+ $(warning "NDK version $(ANDROID_NDK_ROOT)")
+ ndk_version:= $(lastword $(subst -, ,$(ANDROID_NDK_ROOT)))
+else
+ $(warning "NDK version not set in environment, using \'unknown\' instead.")
+ ndk_version:=unknown
+endif
-####### Build settings ########################################################
+export runtime:=$(target)_cc$(gcc_version)_NDK$(ndk_version)_version_$(target_os_version)
-OBJ=o
-DLL=dylib
-LIBEXT=dylib
+AR = $(tbb_tool_prefix)ar
+MAKE_VERSIONS = cmd /C cscript /nologo /E:jscript $(subst \,/,$(tbb_root))/build/version_info_windows.js $(CONLY) $(arch) $(subst \,/,"$(CPLUS) $(CPLUS_FLAGS)") > version_string.ver
-def_prefix = $(if $(findstring 64,$(arch)),mac64,mac32)
+####### Build settings ########################################################
+# No SONAME_SUFFIX for Android allowed in library names
TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst
TBB.DEF = $(TBB.LST:.lst=.def)
TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
TBB.LIB = $(TBB.DLL)
+TBB_NO_VERSION.DLL=
LINK_TBB.LIB = $(TBB.LIB)
MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
MALLOC.LIB = $(MALLOC.DLL)
+MALLOC_NO_VERSION.DLL=
+LINK_MALLOC.LIB = $(MALLOC.LIB)
+
+MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def
+MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
+MALLOCPROXY_NO_VERSION.DLL=
+MALLOCPROXY.LIB = $(MALLOCPROXY.DLL)
-TBB_NOSTRICT=1
+TBB.RES =
+MALLOC.RES =
+RML.RES =
+TBB.MANIFEST =
+MALLOC.MANIFEST =
+RML.MANIFEST =
+OBJ = o
+DLL = so
-TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh
+TEST_LAUNCHER=
+run_cmd ?= -sh $(tbb_root)/build/android.linux.launcher.sh $(largs)
diff --git a/build/big_iron.inc b/build/big_iron.inc
index c76f116..5ab706f 100644
--- a/build/big_iron.inc
+++ b/build/big_iron.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/common.inc b/build/common.inc
index b1b3034..0a2d812 100644
--- a/build/common.inc
+++ b/build/common.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -51,11 +51,11 @@ ifeq ($(tbb_cpf),1)
export CPF_SUFFIX ?=_preview
endif
-ifeq ($(wildcard $(tbb_root)/build/$(tbb_os).inc),)
+ifeq (,$(wildcard $(tbb_root)/build/$(tbb_os).inc))
$(error "$(tbb_os)" is not supported. Add build/$(tbb_os).inc file with os-specific settings )
endif
-# detect arch and runtime versions, provide common os-specific definitions
+# detect arch and runtime versions, provide common host-specific definitions
include $(tbb_root)/build/$(tbb_os).inc
ifeq ($(arch),)
@@ -64,16 +64,24 @@ endif
ifeq ($(runtime),)
$(error Runtime version not detected)
endif
-ifeq ($(wildcard $(tbb_root)/build/$(tbb_os).$(compiler).inc),)
- $(error Compiler "$(compiler)" is not supported on $(tbb_os). Add build/$(tbb_os).$(compiler).inc file with compiler-specific settings )
-endif
+# process target-dependent compilation and testing configurations
ifdef target
- ifeq ($(wildcard $(tbb_root)/build/$(target).inc),)
- $(error "$(target)" is not supported. Add build/$(target).inc file)
+ # optionally process target-dependent options for compilation and testing
+ ifneq (,$(wildcard $(tbb_root)/build/$(target).inc))
+ include $(tbb_root)/build/$(target).inc
+ endif
+
+ # optionally process host-dependent environment for target-dependent compilation and testing
+ ifneq (,$(wildcard $(tbb_root)/build/$(target).$(tbb_os).inc))
+ include $(tbb_root)/build/$(target).$(tbb_os).inc
endif
- include $(tbb_root)/build/$(target).inc
-endif
+
+ # insure at least one target-dependent configuration file was found for compilation and testing
+ ifeq (,$(wildcard $(tbb_root)/build/$(target).inc)$(wildcard $(tbb_root)/build/$(target).$(tbb_os).inc))
+ $(error "$(target)" is not supported. Add build/$(target).inc or build/$(target).$(tbb_os).inc file)
+ endif
+endif #target
# Support for running debug tests to release library and vice versa
flip_cfg=$(subst _flipcfg,_release,$(subst _release,_debug,$(subst _debug,_flipcfg,$(1))))
@@ -82,23 +90,41 @@ cross_cfg = $(if $(crosstest),$(call flip_cfg,$(1)),$(1))
ifdef BUILDING_PHASE
# Setting default configuration to release
cfg?=release
- # No lambas or other C++0x extensions by default for compilers that implement them as experimental features
+ # No lambdas or other C++0x extensions by default for compilers that implement them as experimental features
# TODO: it should become unnecessary when all relevant tests are "moved" to the TEST_TBB_CPP11 set
lambdas ?= 0
cpp0x ?= 0
- # include compiler-specific build configurations
- -include $(tbb_root)/build/$(tbb_os).$(compiler).inc
- ifdef extra_inc
- -include $(tbb_root)/build/$(extra_inc)
+
+ ifndef target
+ target:=$(tbb_os)
+ endif
+ # process host/target compiler-dependent build configuration
+ ifeq (,$(wildcard $(tbb_root)/build/$(target).$(compiler).inc))
+ $(error "$(compiler)" is not supported on $(target). Add build/$(target).$(compiler).inc file with compiler-specific settings. )
endif
+ include $(tbb_root)/build/$(target).$(compiler).inc
endif
+
ifneq ($(BUILDING_PHASE),1)
# definitions for top-level Makefiles
origin_build_dir:=$(origin tbb_build_dir)
tbb_build_dir?=$(tbb_root)$(SLASH)build
- tbb_build_prefix?=$(tbb_os)_$(arch)_$(compiler)_$(runtime)
+ tbb_build_prefix?=$(tbb_os)_$(arch)_$(compiler)_$(runtime)$(CPF_SUFFIX)
work_dir=$(tbb_build_dir)$(SLASH)$(tbb_build_prefix)
- ifneq ($(BUILDING_PHASE),0)
+endif # BUILDING_PHASE != 1
+
+ifdef offload
+ extra_inc=$(offload).offload.inc
+endif
+ifdef extra_inc
+ ifneq (,$(wildcard $(tbb_root)/build/$(extra_inc)))
+ include $(tbb_root)/build/$(extra_inc)
+ else
+ $(error specified build file: "build/$(extra_inc)" is not found. )
+ endif
+endif
+
+ifndef BUILDING_PHASE
work_dir:=$(work_dir)
# assign new value for tbb_root if path is not absolute (the filter keeps only /* paths)
ifeq ($(filter /% $(SLASH)%, $(subst :, ,$(tbb_root)) ),)
@@ -109,8 +135,7 @@ ifneq ($(BUILDING_PHASE),1)
endif
endif
export tbb_root
- endif # BUILDING_PHASE != 0
-endif # BUILDING_PHASE != 1
+ endif # !BUILDING_PHASE
.DELETE_ON_ERROR: # Make will delete target if error occurred when building it.
diff --git a/build/common_rules.inc b/build/common_rules.inc
index 6aa20f2..340c6c7 100644
--- a/build/common_rules.inc
+++ b/build/common_rules.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/detect.js b/build/detect.js
index 894422b..1f85edb 100644
--- a/build/detect.js
+++ b/build/detect.js
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
@@ -80,14 +80,14 @@ function doWork() {
if ( WScript.Arguments(0) == "/arch" ) {
//detect target architecture
var intel64=/AMD64|EM64T|x64/mgi;
- var ia64=/IA-64|Itanium/mgi;
var ia32=/[80|\s]x86/mgi;
+ var arm=/ARM/mgi;
if ( clVersion.match(intel64) ) {
WScript.Echo( "intel64" );
- } else if ( clVersion.match(ia64) ) {
- WScript.Echo( "ia64" );
} else if ( clVersion.match(ia32) ) {
WScript.Echo( "ia32" );
+ } else if ( clVersion.match(arm) ) {
+ WScript.Echo( "armv7" );
} else {
WScript.Echo( "unknown" );
}
diff --git a/build/generate_tbbvars.bat b/build/generate_tbbvars.bat
index d64adef..d4e869c 100644
--- a/build/generate_tbbvars.bat
+++ b/build/generate_tbbvars.bat
@@ -1,6 +1,6 @@
@echo off
REM
-REM Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+REM Copyright 2005-2013 Intel Corporation. All Rights Reserved.
REM
REM This file is part of Threading Building Blocks.
REM
@@ -70,5 +70,8 @@ echo setenv PATH "%bin_dir%;$PATH">>tbbvars.csh
if not x%UNIXMODE%==x echo setenv LD_LIBRARY_PATH "%bin_dir%;$LD_LIBRARY_PATH">>tbbvars.csh
:skipcsh
+REM Workaround for copying Android* specific libgnustl_shared.so library to work folder
+if not x%LIB_GNU_STL_ANDROID%==x copy /Y "%LIB_GNU_STL_ANDROID%"\libgnustl_shared.so
+
endlocal
exit
diff --git a/build/generate_tbbvars.sh b/build/generate_tbbvars.sh
index dad0319..227619f 100644
--- a/build/generate_tbbvars.sh
+++ b/build/generate_tbbvars.sh
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -74,3 +74,8 @@ else #
endif #
${TBB_CUSTOM_VARS_CSH} #
EOF
+
+# Workaround for copying Android* specific libgnustl_shared.so library to "."
+if [ ! -z "${LIB_GNU_STL_ANDROID}" ]; then
+ cp ${LIB_GNU_STL_ANDROID}/libgnustl_shared.so .
+fi
diff --git a/build/index.html b/build/index.html
index 2565e59..97e9120 100644
--- a/build/index.html
+++ b/build/index.html
@@ -2,10 +2,10 @@
<BODY>
<H2>Overview</H2>
-This directory contains the internal Makefile infrastructure for Threading Building Blocks.
+This directory contains the internal Makefile infrastructure for Intel® Threading Building Blocks (Intel® TBB).
<P>
-See below for how to <A HREF=#build>build</A> TBB and how to <A HREF=#port>port</A> TBB
+See below for how to <A HREF=#build>build</A> Intel TBB and how to <A HREF=#port>port</A> Intel TBB
to a new platform, operating system or architecture.
</P>
@@ -13,13 +13,13 @@ to a new platform, operating system or architecture.
The files here are not intended to be used directly. See below for usage.
<DL>
<DT><A HREF="Makefile.tbb">Makefile.tbb</A>
-<DD>Main Makefile to build the TBB library.
+<DD>Main Makefile to build the Intel TBB library.
Invoked via 'make tbb' from <A HREF=../Makefile>top-level Makefile</A>.
<DT><A HREF="Makefile.tbbmalloc">Makefile.tbbmalloc</A>
-<DD>Main Makefile to build the TBB scalable memory allocator library as well as its tests.
+<DD>Main Makefile to build the Intel TBB scalable memory allocator library as well as its tests.
Invoked via 'make tbbmalloc' from <A HREF=../Makefile>top-level Makefile</A>.
<DT><A HREF="Makefile.test">Makefile.test</A>
-<DD>Main Makefile to build and run the tests for the TBB library.
+<DD>Main Makefile to build and run the tests for the Intel TBB library.
Invoked via 'make test' from <A HREF=../Makefile>top-level Makefile</A>.
<DT><A HREF="common.inc">common.inc</A>
<DD>Main common included Makefile that includes OS-specific and compiler-specific Makefiles.
@@ -28,30 +28,30 @@ The files here are not intended to be used directly. See below for usage.
<DT><os>.<compiler>.inc
<DD>Compiler-specific Makefile for a particular <os> / <compiler> combination.
<DT>*.sh
-<DD>Infrastructure utilities for Linux*, Mac OS* X, and UNIX*-related systems.
+<DD>Infrastructure utilities for Linux* OS, OS X*, and UNIX*-related operating systems.
<DT>*.js, *.bat
-<DD>Infrastructure utilities for Windows* systems.
+<DD>Infrastructure utilities for Windows* OS.
</DL>
<A NAME=build><H2>To Build</H2></A>
<P>
-To port TBB to a new platform, operating system or architecture, see the <A HREF=#port>porting directions</A> below.
+To port Intel TBB to a new platform, operating system or architecture, see the <A HREF=#port>porting directions</A> below.
</P>
<H3>Software prerequisites:</H3>
<OL>
<LI>C++ compiler for the platform, operating system and architecture of interest.
Either the native compiler for your system, or, optionally, the appropriate Intel® C++ compiler, may be used.
-<LI>GNU make utility. On Windows*, if a UNIX* emulator is used to run GNU make,
- it should be able to run Windows* utilities and commands. On Linux*, Mac OS* X, etc.,
+<LI>GNU make utility. On Windows OS, if a UNIX* emulator is used to run GNU make,
+ it should be able to run Windows OS utilities and commands. On Linux OS, OS X, etc.,
shell commands issued by GNU make should execute in a Bourne or BASH compatible shell.
</OL>
<P>
-TBB libraries can be built by performing the following steps.
+Intel TBB libraries can be built by performing the following steps.
On systems that support only one ABI (e.g., 32-bit), these steps build the libraries for that ABI.
On systems that support both 64-bit and 32-bit libraries, these steps build the 64-bit libraries
-(Linux*, Mac OS* X, and related systems) or whichever ABI is selected in the development environment (Windows* systems).
+(Linux OS, OS X, and related systems) or whichever ABI is selected in the development environment (Windows OS).
</P>
<OL>
<LI>Change to the <A HREF=../index.html>top-level directory</A> of the installed software.
@@ -61,8 +61,8 @@ On systems that support both 64-bit and 32-bit libraries, these steps build the
</OL>
<P>
-To build TBB libraries for other than the default ABI (e.g., to build 32-bit libraries on Linux*, Mac OS* X,
-or related systems that support both 64-bit and 32-bit libraries), perform the following steps.
+To build Intel TBB libraries for other than the default ABI (e.g., to build 32-bit libraries on Linux OS, OS X,
+or related systems that support both 64-bit and 32-bit libraries), perform the following steps:
</P>
<OL>
<LI>Change to the <A HREF=../index.html>top-level directory</A> of the installed software.
@@ -71,11 +71,11 @@ or related systems that support both 64-bit and 32-bit libraries), perform the f
<LI>Invoke GNU make as follows, 'gmake arch=ia32'.
</OL>
-<P>The default make target will build the release and debug versions of the TBB library.</P>
+<P>The default make target will build the release and debug versions of the Intel TBB library.</P>
<P>Other targets are available in the top-level Makefile. You might find the following targets useful:
<UL>
-<LI>'make test' will build and run TBB <A HREF=../src/test>unit-tests</A>;
-<LI>'make examples' will build and run TBB <A HREF=../examples/index.html>examples</A>;
+<LI>'make test' will build and run Intel TBB <A HREF=../src/test>unit-tests</A>;
+<LI>'make examples' will build and run Intel TBB <A HREF=../examples/index.html>examples</A>;
<LI>'make all' will do all of the above.
</UL>
See also the list of other targets below.
@@ -84,9 +84,9 @@ See also the list of other targets below.
<P>
By default, the libraries will be built in sub-directories within the build/ directory.
The sub-directories are named according to the operating system, architecture, compiler and software environment used
-(the sub-directory names also distinguish release vs. debug libraries). On Linux*, the software environment comprises
-the GCC, libc and kernel version used. On Mac OS* X, the software environment comprises the GCC and OS version used.
-On Windows, the software environment comprises the Microsoft* Visual Studio* version used.
+(the sub-directory names also distinguish release vs. debug libraries). On Linux OS, the software environment comprises
+the GCC, libc and kernel version used. On OS X, the software environment comprises the GCC and OS version used.
+On Windows OS, the software environment comprises the Microsoft* Visual Studio* version used.
See below for how to change the default build directory.
</P>
@@ -108,21 +108,31 @@ To perform different build and/or test operations, use the following steps.
<DT><TT>cd src;make debug</TT>
<DD>Build and test debug libraries only.
<DT><TT>make tbb</TT>
- <DD>Make TBB release and debug libraries.
+ <DD>Make Intel TBB release and debug libraries.
<DT><TT>make tbbmalloc</TT>
- <DD>Make TBB scalable memory allocator libraries.
+ <DD>Make Intel TBB scalable memory allocator libraries.
<DT><TT>make test</TT>
<DD>Compile and run unit-tests
<DT><TT>make examples</TT>
<DD>Build libraries and run all examples, like doing 'make debug clean release' from
<A HREF=../examples/Makefile>the general example Makefile</A>.
- <DT><TT>make compiler=<B>{</B>icl, icc<B>}</B> <B>[</B>(above options or targets)<B>]</B></TT>
- <DD>Build and run as above, but use Intel® compilers instead of default, native compilers
- (e.g., icl instead of cl.exe on Windows* systems, or icc instead of g++ on Linux* or Mac OS* X systems).
+ <DT><TT>make compiler=<B>{</B>icl, icc, gcc, clang<B>}</B> <B>[</B>(above options or targets)<B>]</B></TT>
+ <DD>Build and run as above, but use specified compilers instead of default, native compilers
+ <LI><TT><B> {</B>icl, icc<B>}</B> </TT> - to use Intel® compilers (<TT>icl</TT> on Windows OS, <TT>icc</TT> on Linux OS or OS X). </LI>
+ <LI><TT>gcc</TT> - to use g++ (e.g. MinGW on Windows OS)</LI>
+ <LI><TT>clang</TT> - to use Clang compiler</LI>
+ <DT><TT>make compiler=clang stdlib=libc++ </B> <B>[</B>(above options or targets)<B>]</B></TT>
+ <DD>Build and run as above, but use <TT>libc++</TT> as a standard c++ library for clang.
+ <DT><TT>make target_ui=win8ui [target_ui_mode=production]</B> <B>[</B>(above options or targets)<B>]</B></TT>
+ <DD>Build and run as above, but use API that is compliant with Windows Store* applications.
+ <TT>target_ui_mode=production</TT> is used to produce binaries that are compliant with Windows Store* application container.
+ In later case they won't with Intel TBB unit tests but work only with Windows Store* applications.
+ <DT><TT>ndk-build target=android</B> <B>[</B>(above options or targets)<B>]</B></TT>
+ <DD>Build and run as above, but build libraries for Android* OS by Android NDK that should be installed. Makefiles were tested with revision 8.
<DT><TT>make arch=<B>{</B>ia32, intel64, ia64<B>}</B> <B>[</B>(above options or targets)<B>]</B></TT>
<DD>Build and run as above, but build libraries for the selected ABI.
Might be useful for cross-compilation; ensure proper environment is set before running this command.
- <DT><TT>make tbb_root=<B>{</B>(TBB directory)<B>}</B> <B>[</B>(above options or targets)<B>]</B></TT>
+ <DT><TT>make tbb_root=<B>{</B>(Intel TBB directory)<B>}</B> <B>[</B>(above options or targets)<B>]</B></TT>
<DD>Build and run as above; for use when invoking 'make' from a directory other than
the <A HREF=../index.html>top-level directory</A>.
<DT><TT>make tbb_build_dir=<B>{</B>(build directory)<B>}</B> <B>[</B>(above options or targets)<B>]</B></TT>
@@ -143,11 +153,11 @@ To perform different build and/or test operations, use the following steps.
<A NAME=port><H2>To Port</H2></A>
<P>
-This section provides information on how to port TBB to a new platform, operating system or architecture.
+This section provides information on how to port Intel TBB to a new platform, operating system or architecture.
A subset or a superset of these steps may be required for porting to a given platform.
</P>
-<H4>To port the TBB source code:</H4>
+<H4>To port the Intel TBB source code:</H4>
<OL>
<LI>If porting to a new architecture, create a file that describes the architecture-specific details for that architecture.
<UL>
@@ -166,7 +176,7 @@ A subset or a superset of these steps may be required for porting to a given pla
for an example of a minimal implementation.
<LI>More complex implementation examples can also be found in the
<A HREF=../include/tbb/machine>include/tbb/machine</A> directory
- that implement all the individual variants of synchronization operations that TBB uses.
+ that implement all the individual variants of synchronization operations that Intel TBB uses.
Such implementations are more verbose but may achieve better performance on a given architecture.
<LI>In a given implementation, any synchronization operation that is not defined is implemented, by default,
in terms of 4-byte or 8-byte compare-and-swap. More operations can thus be added incrementally to increase
@@ -180,8 +190,8 @@ A subset or a superset of these steps may be required for porting to a given pla
<os>_<architecture>.h file in the <A HREF=../include/tbb/machine>include/tbb/machine</A> directory.
</UL>
<LI>Add an implementation of DetectNumberOfWorkers() in <A HREF=../src/tbb/tbb_misc.h>src/tbb/tbb_misc.h</A>,
- if needed, that returns the number of cores found on the system. This is used to determine the default
- number of threads for the TBB task scheduler.
+ that returns the number of cores found on the system in case it is not supported by the current implementation.
+ This is used to determine the default number of threads for the Intel TBB task scheduler.
<LI>Either properly define FillDynamicLinks for use in
<A HREF=../src/tbb/cache_aligned_allocator.cpp>src/tbb/cache_aligned_allocator.cpp</A>,
or hardcode the allocator to be used.
@@ -201,9 +211,9 @@ See the Makefile infrastructure files for examples.
<LI>To add a new operating system, add the appropriate test to <A HREF=common.inc>common.inc</A>,
and create the needed <os>.inc and <os>.<compiler>.inc files (see below).
</UL>
-<LI>The <os>.inc file makes OS-specific settings for a particular <os>.
+<LI>The <os>.inc file makes OS-specific settings for a particular operating systems.
<UL>
- <LI>For example, <A HREF=linux.inc>linux.inc</A> makes settings specific to Linux* systems.
+ <LI>For example, <A HREF=linux.inc>linux.inc</A> makes settings specific to Linux operating systems.
<LI>This file performs OS-dependent tests to determine the specific platform and/or architecture,
and sets other platform-dependent values.
<LI>Add a new <os>.inc file for each new operating system added.
@@ -211,8 +221,8 @@ See the Makefile infrastructure files for examples.
<LI>The <os>.<compiler>.inc file makes compiler-specific settings for a particular
<os> / <compiler> combination.
<UL>
- <LI>For example, <A HREF=linux.gcc.inc>linux.gcc.inc</A> makes specific settings for using GCC on Linux* systems,
- and <A HREF=linux.icc.inc>linux.icc.inc</A> makes specific settings for using the Intel® C++ compiler on Linux* systems.
+ <LI>For example, <A HREF=linux.gcc.inc>linux.gcc.inc</A> makes specific settings for using GCC on Linux OS,
+ and <A HREF=linux.icc.inc>linux.icc.inc</A> makes specific settings for using the Intel® C++ compiler on Linux OS.
<LI>This file sets particular compiler, assembler and linker options required when using a particular
<os> / <compiler> combination.
<LI>Add a new <os>.<compiler>.inc file for each new <os> / <compiler> combination added.
@@ -222,7 +232,7 @@ See the Makefile infrastructure files for examples.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<P></P>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel and Itanium are registered trademarks or trademarks of Intel Corporation or its
subsidiaries in the United States and other countries.
diff --git a/build/linux.gcc.inc b/build/linux.gcc.inc
index 8e455a8..2e4a038 100644
--- a/build/linux.gcc.inc
+++ b/build/linux.gcc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -58,7 +58,11 @@ ifneq (,$(shell gcc -dumpversion | egrep "^(4\.[2-9]|[5-9])"))
OPENMP_FLAG = -fopenmp
endif
-ITT_NOTIFY = -DDO_ITT_NOTIFY
+# gcc 4.4 is particularly zealous about strict aliasing rules; suppress it for library builds
+ifneq (,$(shell gcc -dumpversion | egrep "^4\.4"))
+ WARNING_SUPPRESS += -Wno-strict-aliasing
+endif
+
ifeq ($(cfg), release)
CPLUS_FLAGS = $(ITT_NOTIFY) -g -O2 -DUSE_PTHREAD
endif
@@ -74,17 +78,18 @@ TBB_ASM.OBJ=
MALLOC_ASM.OBJ=
ifeq (ia64,$(arch))
- ITT_NOTIFY =
# Position-independent code (PIC) is a must on IA-64, even for regular (not shared) executables
CPLUS_FLAGS += $(PIC_KEY)
endif
ifeq (intel64,$(arch))
+ ITT_NOTIFY = -DDO_ITT_NOTIFY
CPLUS_FLAGS += -m64
LIB_LINK_FLAGS += -m64
endif
ifeq (ia32,$(arch))
+ ITT_NOTIFY = -DDO_ITT_NOTIFY
CPLUS_FLAGS += -m32 -march=pentium4
LIB_LINK_FLAGS += -m32
endif
@@ -110,6 +115,11 @@ ifeq (sparc,$(arch))
LIB_LINK_FLAGS += -mcpu=v9 -m64
endif
+# automatically generate "IT" instructions when compiling for Thumb ISA
+ifeq (armv7,$(arch))
+ CPLUS_FLAGS += -Wa,-mimplicit-it=thumb
+endif
+
#------------------------------------------------------------------------------
# Setting assembler data.
#------------------------------------------------------------------------------
diff --git a/build/linux.icc.inc b/build/linux.icc.inc
index 8aa5a39..d3452eb 100644
--- a/build/linux.icc.inc
+++ b/build/linux.icc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/linux.inc b/build/linux.inc
index a27408f..1c96d86 100644
--- a/build/linux.inc
+++ b/build/linux.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -56,6 +56,9 @@ ifndef arch
ifeq ($(uname_m),sparc64)
export arch:=sparc
endif
+ ifeq ($(uname_m),armv71)
+ export arch :=armv7
+ endif
ifndef arch
export arch:=$(uname_m)
endif
@@ -76,6 +79,7 @@ debugger ?= gdb
CMD=sh -c
CWD=$(shell pwd)
+CP=cp
RM?=rm -f
RD?=rmdir
MD?=mkdir -p
@@ -103,6 +107,9 @@ endif
ifeq ($(arch),sparc)
def_prefix = lin64
endif
+ifeq ($(arch),armv7)
+ def_prefix = lin32
+endif
ifeq (,$(def_prefix))
ifeq (64,$(findstring 64,$(arch)))
def_prefix = lin64
@@ -128,6 +135,7 @@ MALLOCPROXY_NO_VERSION.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def
MALLOCPROXY.DLL = $(MALLOCPROXY_NO_VERSION.DLL).$(SONAME_SUFFIX)
MALLOCPROXY.LIB = $(MALLOCPROXY_NO_VERSION.DLL)
+LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB)
RML_NO_VERSION.DLL = libirml$(DEBUG_SUFFIX).$(DLL)
RML.DEF = $(RML_SERVER_ROOT)/lin-rml-export.def
@@ -136,4 +144,4 @@ RML.LIB = $(RML_NO_VERSION.DLL)
TBB_NOSTRICT=1
-TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh
+TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs)
diff --git a/build/linux.xl.inc b/build/linux.xl.inc
index c56098a..5197382 100644
--- a/build/linux.xl.inc
+++ b/build/linux.xl.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -50,7 +50,6 @@ LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY)
LIBS = -lpthread -lrt
C_FLAGS = $(CPLUS_FLAGS)
-ITT_NOTIFY = -DDO_ITT_NOTIFY
ifeq ($(cfg), release)
CPLUS_FLAGS = $(ITT_NOTIFY) -O2 -DUSE_PTHREAD
endif
@@ -74,12 +73,14 @@ ASM_FLAGS=
TBB_ASM.OBJ=
ifeq (intel64,$(arch))
+ ITT_NOTIFY = -DDO_ITT_NOTIFY
CPLUS_FLAGS += -q64
LIB_LINK_FLAGS += -q64
endif
# TODO: equivalent for -march=pentium4 in CPLUS_FLAGS
ifeq (ia32,$(arch))
+ ITT_NOTIFY = -DDO_ITT_NOTIFY
CPLUS_FLAGS += -q32 -qarch=pentium4
LIB_LINK_FLAGS += -q32
endif
diff --git a/build/macos.clang.inc b/build/macos.clang.inc
index 92c2cf4..e2347e2 100644
--- a/build/macos.clang.inc
+++ b/build/macos.clang.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -54,6 +54,17 @@ endif
CPLUS_FLAGS += -DUSE_PTHREAD
+ifeq (libc++,$(stdlib))
+ LIBS += -stdlib=libc++
+ CPLUS_FLAGS += -stdlib=libc++
+endif
+
+CPP11_FLAGS = -std=c++11 -D_TBB_CPP0X
+
+ifneq (00,$(lambdas)$(cpp0x))
+ CXX_ONLY_FLAGS += $(CPP11_FLAGS)
+endif
+
ifeq (intel64,$(arch))
CPLUS_FLAGS += -m64
LINK_FLAGS += -m64
diff --git a/build/macos.gcc.inc b/build/macos.gcc.inc
index cd9d9a1..56df839 100644
--- a/build/macos.gcc.inc
+++ b/build/macos.gcc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -78,6 +78,17 @@ ifeq (ppc32,$(arch))
LIB_LINK_FLAGS += -arch ppc
endif
+ifeq (armv7,$(arch))
+ CPLUS_FLAGS += -arch armv7
+ LINK_FLAGS += -arch armv7
+ LIB_LINK_FLAGS += -arch armv7
+endif
+
+ifdef SDKROOT
+ CPLUS_FLAGS += -isysroot $(SDKROOT)
+ LIB_LINK_FLAGS += -L$(SDKROOT)/usr/lib/system -L$(SDKROOT)/usr/lib/
+endif
+
#------------------------------------------------------------------------------
# Setting assembler data.
#------------------------------------------------------------------------------
diff --git a/build/macos.icc.inc b/build/macos.icc.inc
index c689f61..da8baea 100644
--- a/build/macos.icc.inc
+++ b/build/macos.icc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/macos.inc b/build/macos.inc
index 31a80f0..ef9248b 100644
--- a/build/macos.inc
+++ b/build/macos.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -55,6 +55,18 @@ ifndef arch
endif
endif
+ifeq (ios,$(target))
+ ifneq (armv7, $(arch))
+ $(error $(arch) not supported for target 'ios')
+ endif
+ SDKROOT?=$(shell xcodebuild -sdk -version | grep -o -E '/.*SDKs/iPhoneOS.*' 2>/dev/null)
+ ifeq (,$(SDKROOT))
+ $(error iOS SDK not found)
+ endif
+ # next, use a single compiler include file for both iOS* and OS X* builds.
+ override target:=macos
+endif
+
ifndef runtime
gcc_version = $(shell gcc -dumpversion)
os_version:=$(shell /usr/bin/sw_vers -productVersion)
@@ -75,6 +87,12 @@ SLASH=/
MAKE_VERSIONS=sh $(tbb_root)/build/version_info_macos.sh $(CPLUS) $(CPLUS_FLAGS) $(INCLUDES) >version_string.ver
MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh
+ifdef DYLD_LIBRARY_PATH
+ export DYLD_LIBRARY_PATH := .:$(DYLD_LIBRARY_PATH)
+else
+ export DYLD_LIBRARY_PATH := .
+endif
+
####### Build settings ########################################################
OBJ=o
@@ -92,7 +110,8 @@ LINK_TBB.LIB = $(TBB.LIB)
MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
MALLOC.LIB = $(MALLOC.DLL)
+LINK_MALLOC.LIB = $(MALLOC.LIB)
TBB_NOSTRICT=1
-TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh
+TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs)
diff --git a/build/AIX.gcc.inc b/build/mic.icc.inc
similarity index 63%
copy from build/AIX.gcc.inc
copy to build/mic.icc.inc
index 252f3af..ccae7b6 100644
--- a/build/AIX.gcc.inc
+++ b/build/mic.icc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -32,54 +32,59 @@ OUTPUT_KEY = -o #
OUTPUTOBJ_KEY = -o #
PIC_KEY = -fPIC
WARNING_AS_ERROR_KEY = -Werror
-WARNING_KEY = -Wall
+WARNING_KEY = -w1
DYLIB_KEY = -shared
+EXPORT_KEY = -Wl,--version-script,
+NOINTRINSIC_KEY = -fno-builtin
LIBDL = -ldl
TBB_NOSTRICT = 1
-CPLUS = g++
-CONLY = gcc
-LIB_LINK_FLAGS = -shared
-LIBS = -lpthread -ldl
-C_FLAGS = $(CPLUS_FLAGS) -x c
+CPLUS = icpc
+CONLY = icc
-ifeq ($(cfg), release)
- CPLUS_FLAGS = -O2 -DUSE_PTHREAD -pthread
+ifeq (release,$(cfg))
+ CPLUS_FLAGS = -O2 -g -DUSE_PTHREAD
+else
+ CPLUS_FLAGS = -O0 -g -DUSE_PTHREAD -DTBB_USE_DEBUG
endif
-ifeq ($(cfg), debug)
- CPLUS_FLAGS = -DTBB_USE_DEBUG -g -O0 -DUSE_PTHREAD -pthread
+
+ifneq (,$(codecov))
+ CPLUS_FLAGS += -prof-genx
endif
-ASM=
-ASM_FLAGS=
+OPENMP_FLAG = -openmp
+LIB_LINK_FLAGS = -shared -i-static -Wl,-soname=$(BUILDING_LIBRARY)
+LIBS += -lpthread -lrt
+C_FLAGS = $(CPLUS_FLAGS)
+CPP11_FLAGS = -std=c++0x -D_TBB_CPP0X
+CILK_AVAILABLE = yes
TBB_ASM.OBJ=
+MALLOC_ASM.OBJ=
-ifeq (powerpc,$(arch))
- CPLUS_FLAGS += -maix64 -Wl,-G
- LIB_LINK_FLAGS += -maix64 -Wl,-b64 -Wl,-brtl -Wl,-G
-endif
-
-#------------------------------------------------------------------------------
-# Setting assembler data.
-#------------------------------------------------------------------------------
-
-ASSEMBLY_SOURCE=ibm_aix51
-ifeq (powerpc,$(arch))
- TBB_ASM.OBJ = atomic_support.o
+ifneq (00,$(lambdas)$(cpp0x))
+ CPLUS_FLAGS += $(CPP11_FLAGS)
endif
-#------------------------------------------------------------------------------
-# End of setting assembler data.
-#------------------------------------------------------------------------------
+CPLUS_FLAGS += -DHARNESS_INCOMPLETE_SOURCES=1 -D__TBB_MIC_NATIVE -DTBB_USE_EXCEPTIONS=0 -opt-streaming-stores never
+CPLUS += -mmic
+CONLY += -mmic
+LINK_FLAGS = -Wl,-rpath-link=.
+# Tell the icc to not link against libcilk*. Otherwise icc tries to link and emits a warning message.
+LIB_LINK_LIBS += -no-intel-extensions
+# Do not depend on libirc etc dynamic libs. It makes 'native' execution easier for the users.
+LIB_LINK_LIBS += -static-intel
#------------------------------------------------------------------------------
# Setting tbbmalloc data.
#------------------------------------------------------------------------------
-M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions -fno-schedule-insns2
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions
#------------------------------------------------------------------------------
# End of setting tbbmalloc data.
#------------------------------------------------------------------------------
+
+
+
diff --git a/examples/concurrent_hash_map/count_strings/Makefile b/build/mic.linux.inc
similarity index 65%
copy from examples/concurrent_hash_map/count_strings/Makefile
copy to build/mic.linux.inc
index 2ecd86c..87a1b02 100644
--- a/examples/concurrent_hash_map/count_strings/Makefile
+++ b/build/mic.linux.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -24,36 +24,24 @@
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.
-# GNU Makefile that builds and runs example.
-PROG=count_strings
-ARGS=
-PERF_RUN_ARGS=auto 10000000 silent
-
-# The C++ compiler
-ifneq (,$(shell which icc 2>/dev/null))
-CXX=icc
-endif # icc
-
-ifeq ($(shell uname), Linux)
-LIBS+= -lrt
+ifeq ($(tbb_os),mic)
+ $(error MIC supports only cross-compilation. Specify "target=mic" instead.)
endif
-all: release test
-
-release: *.cpp
- $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
-
-debug: *.cpp
- $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
+ifneq ($(BUILDING_PHASE),1)
+ # The same build prefix should be used in offload.inc
+ tbb_build_prefix?=mic_icc$(CPF_SUFFIX)
+endif
-clean:
- $(RM) $(PROG) *.o *.d
+MAKE_VERSIONS=sh $(tbb_root)/build/version_info_linux.sh $(CPLUS) $(CPLUS_FLAGS) $(INCLUDES) >version_string.ver
+MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh
+def_prefix=lin64
-test:
- ./$(PROG) $(ARGS)
-
-perf_build: release
-
-perf_run:
- ./$(PROG) $(PERF_RUN_ARGS)
+TEST_LAUNCHER=
+run_cmd ?= bash $(tbb_root)/build/mic.linux.launcher.sh $(largs)
+# detects whether examples are being built.
+ifeq ($(BUILDING_PHASE),0)
+ export UI = con
+ export x64 = 64
+endif # examples
diff --git a/build/mic.linux.launcher.sh b/build/mic.linux.launcher.sh
new file mode 100644
index 0000000..4709b98
--- /dev/null
+++ b/build/mic.linux.launcher.sh
@@ -0,0 +1,111 @@
+#!/bin/bash
+#
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+#
+# This file is part of Threading Building Blocks.
+#
+# Threading Building Blocks is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# Threading Building Blocks is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Threading Building Blocks; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction. Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License. This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+# Usage:
+# mic.linux.launcher.sh [-v] [-s] [-r <repeats>] [-u] [-l <library>] <executable> <arg1> <arg2> <argN>
+# where: -v enables verbose output
+# where: -s enables stress testing unless ctrl-c is pressed
+# where: -r <repeats> specifies number of times to repeat execution
+# where: -u is ignored
+# where: -l <library> specifies the library name to be assigned to LD_PRELOAD
+#
+# Libs and executable necessary for testing should be present in the current directory before running.
+# Note: Do not remove the redirections to '/dev/null' in the script, otherwise the nightly test system will fail.
+#
+trap 'echo Error at line $LINENO while executing "$BASH_COMMAND"' ERR #
+trap 'echo -e "\n*** Interrupted ***" && exit 1' SIGINT SIGQUIT #
+# Process the optional arguments if present
+if [ "x$1" = "x-v" ]; then shift 1; else SUPPRESS='>/dev/null'; fi #
+if [ "x$1" = "x-s" ]; then shift 1; echo Doing stress testing. Press Ctrl-C to terminate
+ run_prefix+='rep() { while :; do $*; done; }; rep '; fi #
+if [ "x$1" = "x-r" ]; then #
+ run_prefix+="rep() { for i in \$(seq 1 $2); do echo \$i of $2:; \$*; done; }; rep " #
+ shift 2; fi #
+[ "x$1" = "x-u" ] && shift 1 #
+if [ "x$1" = "x-l" ]; then { #
+ ldd_list+="$2 "#
+ run_prefix+=" LD_PRELOAD=$2" #
+ shift 2 #
+}; fi #
+# Collect the executable name
+fexename="$1" #
+exename=`basename $1` #
+shift #
+#
+RSH="sudo ssh mic0" #
+RCP="sudo scp" #
+#
+# Prepare the target directory on the device
+currentdir=`basename $PWD` #
+targetdir=${TEST_DIRECTORY:-/mic0fs/$USER/$currentdir} #
+#
+# Remove leftover target directory on the device
+eval "$RSH \"rm -r $targetdir; mkdir -p $targetdir\" $SUPPRESS 2>&1 || exit \$?" #
+eval "$RCP $fexename mic0:$targetdir/ $SUPPRESS || exit \$?" #
+#
+# Collect the list of files to transfer to the target device, starting with executable itself.
+ldd_list+="libtbbmalloc*.so* `$RSH ldd $targetdir/$exename | grep = | cut -d= -f1 2>/dev/null`" #
+fnamelist="" #
+#
+# Find the libraries and add them to the list.
+# For example, go through MIC_LD_LIBRARY_PATH and add TBB libraries from the first
+# directory that contains tbb files
+mic_dir_list=`echo .:$MIC_LD_LIBRARY_PATH | tr : " "` #
+for name in $ldd_list; do # adds the first matched name in specified dirs
+ fnamelist+="`find $mic_dir_list -name $name -a -readable -print -quit 2>/dev/null` " #
+done #
+#
+# Add any libraries built for specific tests.
+exeroot=${exename%\.*} #
+fnamelist+=`ls ${exeroot}*.so ${exeroot}*.so.* 2>/dev/null`||: #
+#
+# Transfer collected executable and library files to the target device.
+eval "$RCP $fnamelist mic0:$targetdir/ $SUPPRESS || exit \$?" #
+#
+# Transfer input files used by example codes by scanning the executable argument list.
+for fullname in "$@"; do if [ -r $fullname ]; then { #
+ directory=$(dirname $fullname) #
+ filename=$(basename $fullname) #
+ # strip leading "." from fullname if present
+ [ "$directory" = "." ] && directory="" && fullname="$filename" #
+ # Create the target directory to hold input file if necessary
+ [ ! -z "$directory" ] && $RSH "mkdir -p $targetdir/$directory" $SUPPRESS 2>&1 #
+ # Transfer the input file to corresponding directory on target device
+ eval "$RCP $fullname mic0:$targetdir/$fullname $SUPPRESS 2>&1 || exit \$?" #
+}; fi; done #
+#
+args=$* #
+# Run the test on the target device
+kill_interrupt() { #
+echo -e "\n*** Killing remote $exename ***" && $RSH "killall $exename" #
+} # kill target process
+trap 'kill_interrupt' SIGINT SIGQUIT # trap keyboard interrupt (control-c)
+trap - ERR #
+$RSH "cd $targetdir; export LD_LIBRARY_PATH=.:\$LD_LIBRARY_PATH; $run_prefix ./$exename $args" #
+# Return the exit code of the test.
+exit $? #
diff --git a/build/mic.offload.inc b/build/mic.offload.inc
new file mode 100644
index 0000000..636887b
--- /dev/null
+++ b/build/mic.offload.inc
@@ -0,0 +1,170 @@
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+#
+# This file is part of Threading Building Blocks.
+#
+# Threading Building Blocks is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# Threading Building Blocks is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Threading Building Blocks; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction. Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License. This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+ifneq (mic,$(offload))
+ $(error File mic.offload.inc should not be included directly. Use offload=mic instead.)
+endif
+ifneq (icc,$(compiler))
+ $(error Only Intel(R) Compiler is supported for MIC offload compilation)
+endif
+
+tbb_offload_build_prefix?=mic_offload_icc$(CPF_SUFFIX)
+# The same build prefix should be used in mic.linux.inc
+export tbb_mic_build_prefix?=mic_icc$(CPF_SUFFIX)
+initial_tbb_root:=$(tbb_root)
+
+ifndef BUILDING_PHASE
+tbb_native_debug:
+ $(MAKE) tbb_debug target=mic compiler=icc offload= tbb_root=$(initial_tbb_root)
+tbb_native_release:
+ $(MAKE) tbb_release target=mic compiler=icc offload= tbb_root=$(initial_tbb_root)
+tbbmalloc_native_debug:
+ $(MAKE) tbbmalloc_debug target=mic compiler=icc offload= tbb_root=$(initial_tbb_root)
+tbbmalloc_native_release:
+ $(MAKE) tbbmalloc_release target=mic compiler=icc offload= tbb_root=$(initial_tbb_root)
+rml_native_debug:
+ $(MAKE) rml_debug target=mic compiler=icc offload= tbb_root=$(initial_tbb_root)
+rml_native_release:
+ $(MAKE) rml_release target=mic compiler=icc offload= tbb_root=$(initial_tbb_root)
+tbb_native:
+ $(MAKE) tbb target=mic compiler=icc offload= tbb_root=$(initial_tbb_root)
+tbbmalloc_native:
+ $(MAKE) tbbmalloc target=mic compiler=icc offload= tbb_root=$(initial_tbb_root)
+rml_native:
+ $(MAKE) rml target=mic compiler=icc offload= tbb_root=$(initial_tbb_root)
+tbb_host_debug:
+ $(MAKE) tbb_debug compiler=icc offload= tbb_root=$(initial_tbb_root)
+tbb_host_release:
+ $(MAKE) tbb_release compiler=icc offload= tbb_root=$(initial_tbb_root)
+tbbmalloc_host_debug:
+ $(MAKE) tbbmalloc_debug compiler=icc offload= tbb_root=$(initial_tbb_root)
+tbbmalloc_host_release:
+ $(MAKE) tbbmalloc_release compiler=icc offload= tbb_root=$(initial_tbb_root)
+
+# The work_dir variable can not be set via target-specific variable mechanism
+# since it will affect other targets on which the target depends.
+# So work_dir is set via eval function inside the recipe.
+prepare_test_offload_dir_debug: initial_tbb_build_dir:=$(tbb_build_dir)
+prepare_test_offload_dir_debug: tbb_host_debug tbbmalloc_host_debug tbb_native_debug tbbmalloc_native_debug
+ $(eval work_dir=$(initial_tbb_build_dir)$(SLASH)$(tbb_offload_build_prefix))
+ $(shell $(MD) "$(work_dir)_debug$(SLASH)mic" >$(NUL) 2>$(NUL))
+ $(shell $(CP) "$(initial_tbb_build_dir)$(SLASH)$(tbb_build_prefix)_debug$(SLASH)lib"* "$(work_dir)_debug" >$(NUL) 2>$(NUL))
+ $(shell $(CP) "$(initial_tbb_build_dir)$(SLASH)$(tbb_mic_build_prefix)_debug$(SLASH)lib"* "$(work_dir)_debug$(SLASH)mic" >$(NUL) 2>$(NUL))
+ $(eval export TEST_COMPILATION=1)
+
+prepare_test_offload_dir_release: initial_tbb_build_dir:=$(tbb_build_dir)
+prepare_test_offload_dir_release: tbb_host_release tbbmalloc_host_release tbb_native_release tbbmalloc_native_release
+ $(eval work_dir=$(initial_tbb_build_dir)$(SLASH)$(tbb_offload_build_prefix))
+ $(shell $(MD) "$(work_dir)_release$(SLASH)mic" >$(NUL) 2>$(NUL))
+ $(shell $(CP) "$(initial_tbb_build_dir)$(SLASH)$(tbb_build_prefix)_release$(SLASH)lib"* "$(work_dir)_release" >$(NUL) 2>$(NUL))
+ $(shell $(CP) "$(initial_tbb_build_dir)$(SLASH)$(tbb_mic_build_prefix)_release$(SLASH)lib"* "$(work_dir)_release$(SLASH)mic" >$(NUL) 2>$(NUL))
+ $(eval export TEST_COMPILATION=1)
+
+prepare_test_offload_dir: initial_tbb_build_dir:=$(tbb_build_dir)
+prepare_test_offload_dir: tbb tbbmalloc tbb_native tbbmalloc_native
+ $(eval work_dir=$(initial_tbb_build_dir)$(SLASH)$(tbb_offload_build_prefix))
+ $(shell $(MD) "$(work_dir)_debug$(SLASH)mic" >$(NUL) 2>$(NUL))
+ $(shell $(MD) "$(work_dir)_release$(SLASH)mic" >$(NUL) 2>$(NUL))
+ $(shell $(CP) "$(initial_tbb_build_dir)$(SLASH)$(tbb_build_prefix)_debug$(SLASH)lib"* "$(work_dir)_debug" >$(NUL) 2>$(NUL))
+ $(shell $(CP) "$(initial_tbb_build_dir)$(SLASH)$(tbb_build_prefix)_release$(SLASH)lib"* "$(work_dir)_release" >$(NUL) 2>$(NUL))
+ $(shell $(CP) "$(initial_tbb_build_dir)$(SLASH)$(tbb_mic_build_prefix)_debug$(SLASH)lib"* "$(work_dir)_debug$(SLASH)mic" >$(NUL) 2>$(NUL))
+ $(shell $(CP) "$(initial_tbb_build_dir)$(SLASH)$(tbb_mic_build_prefix)_release$(SLASH)lib"* "$(work_dir)_release$(SLASH)mic" >$(NUL) 2>$(NUL))
+ $(eval export TEST_COMPILATION=1)
+
+test: prepare_test_offload_dir
+tbb_test_debug: prepare_test_offload_dir_debug
+tbb_test_release: prepare_test_offload_dir_release
+tbbmalloc_test_debug: prepare_test_offload_dir_debug
+tbbmalloc_test_release: prepare_test_offload_dir_release
+rml_test_debug: rml_native_debug prepare_test_offload_dir_debug
+rml_test_release: rml_native_release prepare_test_offload_dir_release
+
+debug_% test_% stress_% time_% perf_%:: work_dir:=$(tbb_build_dir)$(SLASH)$(tbb_offload_build_prefix)
+debug_% test_% stress_% time_% perf_%:: export TEST_COMPILATION=1
+
+clean: work_dir:=$(tbb_build_dir)$(SLASH)$(tbb_offload_build_prefix)
+# The _clean* targets begin with an underscore symbol to prevent a collision with the clean_% template
+clean: _clean_mic_subdir_debug _clean_mic_subdir_release _clean_host _clean_mic
+clean_release: work_dir:=$(tbb_build_dir)$(SLASH)$(tbb_offload_build_prefix)
+clean_release: _clean_mic_subdir_release _clean_host_release _clean_mic_release
+clean_debug: work_dir:=$(tbb_build_dir)$(SLASH)$(tbb_offload_build_prefix)
+clean_debug: _clean_mic_subdir_debug _clean_host_debug _clean_mic_debug
+clean_%:: work_dir:=$(tbb_build_dir)$(SLASH)$(tbb_offload_build_prefix)
+
+_clean_mic_subdir_debug:
+ $(shell $(RM) $(work_dir)_debug$(SLASH)mic/$(SLASH)*.* >$(NUL) 2>$(NUL))
+ $(shell $(RD) $(work_dir)_debug$(SLASH)mic >$(NUL) 2>$(NUL))
+_clean_mic_subdir_release:
+ $(shell $(RM) $(work_dir)_release$(SLASH)mic/$(SLASH)*.* >$(NUL) 2>$(NUL))
+ $(shell $(RD) $(work_dir)_release$(SLASH)mic >$(NUL) 2>$(NUL))
+_clean_host:
+ $(MAKE) clean tbb_root=$(initial_tbb_root) offload=
+_clean_mic:
+ $(MAKE) clean target=mic tbb_root=$(initial_tbb_root) offload=
+_clean_host_release:
+ $(MAKE) clean_release tbb_root=$(initial_tbb_root) offload=
+_clean_host_debug:
+ $(MAKE) clean_debug tbb_root=$(initial_tbb_root) offload=
+_clean_mic_release:
+ $(MAKE) clean_release target=mic tbb_root=$(initial_tbb_root) offload=
+_clean_mic_debug:
+ $(MAKE) clean_debug target=mic tbb_root=$(initial_tbb_root) offload=
+endif
+
+ifeq ($(TEST_COMPILATION),1)
+ ifdef MIC_LD_LIBRARY_PATH
+ export MIC_LD_LIBRARY_PATH := ./mic:$(MIC_LD_LIBRARY_PATH)
+ else
+ export MIC_LD_LIBRARY_PATH := ./mic
+ endif
+ LINK_TBB.LIB=-offload-option,mic,ld,"./mic/$(TBB.LIB)" $(TBB.LIB)
+ LINK_MALLOC_LIB=-offload-option,mic,ld,"./mic/$(MALLOC.DLL)" $(MALLOC.DLL)
+ LINK_MALLOC_PROXY_LIB=-offload-option,mic,ld,"./mic/$(MALLOCPROXY.DLL)" $(MALLOCPROXY.DLL)
+ LINK_FLAGS =
+ LIB_LINK_FLAGS += $(DYLIB_KEY)
+ # Do not use -Werror because it is too strict for the early offload compiler.
+ # Need to set anything because WARNING_AS_ERROR_KEY should not be empty.
+ # Treat #2426 as a warning. Print errors only.
+ tbb_strict=0
+ override WARNING_AS_ERROR_KEY = Warning as error
+ override WARNING_KEY = -diag-warning 2426 -w0
+ # Enable mic-specific stuff.
+ CXX_MIC_STUFF = -offload-attribute-target=mic -D__TBB_MIC_OFFLOAD=1 \
+ -offload-option,mic,compiler,"-D__TBB_MIC_OFFLOAD=1 -DHARNESS_INCOMPLETE_SOURCES=1 -D__TBB_MIC_NATIVE -DTBB_USE_EXCEPTIONS=0"
+ CPLUS_FLAGS += $(CXX_MIC_STUFF)
+ export OFFLOAD_EXECUTION = 1
+ # Workaround to skip the RML tests in the offload mode
+ TBB_DEP_NON_RML_TEST =
+ TBB_DEP_RML_TEST =
+ RML_TBB_CLIENT.OBJ =
+ RML_OMP_CLIENT.OBJ =
+endif
+
+# detects whether examples are being built.
+ifeq ($(BUILDING_PHASE),0)
+ export UI = con
+ export x64 = 64
+endif # examples
diff --git a/build/test_launcher.bat b/build/test_launcher.bat
index dad7769..46d60a5 100644
--- a/build/test_launcher.bat
+++ b/build/test_launcher.bat
@@ -1,6 +1,6 @@
@echo off
REM
-REM Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+REM Copyright 2005-2013 Intel Corporation. All Rights Reserved.
REM
REM This file is part of Threading Building Blocks.
REM
@@ -27,10 +27,25 @@ REM invalidate any other reasons why the executable file might be covered by
REM the GNU General Public License.
REM
-REM no LD_PRELOAD under Windows
-if "%1"=="-l" (
- echo skip
- exit
+set cmd_line=
+:while
+if NOT "%1"=="" (
+ REM no LD_PRELOAD under Windows
+ REM but run the test to check "#pragma comment" construction
+ if "%1"=="-l" (
+ REM The command line may specify -l with empty dll name,
+ REM e.g. "test_launcher.bat -l app.exe". If the dll name is
+ REM empty then %2 contains the application name and the SHIFT
+ REM operation is not necessary.
+ if exist "%3" SHIFT
+ GOTO continue
+ )
+ REM no need to setup up stack size under Windows
+ if "%1"=="-u" GOTO continue
+ set cmd_line=%cmd_line% %1
+:continue
+ SHIFT
+ GOTO while
)
-%*
+%cmd_line%
diff --git a/build/test_launcher.sh b/build/test_launcher.sh
index 0e80d43..9788ddb 100644
--- a/build/test_launcher.sh
+++ b/build/test_launcher.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -26,17 +26,35 @@
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.
-while getopts "l:" flag #
-do #
- if [ `uname` != 'Linux' ] ; then #
- echo 'skip' #
- exit #
+while getopts "ul:" flag #
+do case $flag in #
+ l ) if [ `uname` != 'Linux' ] ; then #
+ echo 'skip' #
+ exit #
+ fi #
+ LD_PRELOAD=$OPTARG ;; #
+ u ) # Set stack limit
+ ulimit -s 10240 ;; #
+esac done #
+shift `expr $OPTIND - 1` #
+if [ $OFFLOAD_EXECUTION ] ; then #
+ if [ -z $MIC_CARD ] ; then #
+ MIC_CARD=mic0 #
fi #
- LD_PRELOAD=$OPTARG #
- shift `expr $OPTIND - 1` #
-done #
-# Set stack limit
-ulimit -s 10240 #
+ TMPDIR_HOST=$(mktemp -d /tmp/libtbbmallocXXXXXX) #
+ TMPDIR_MIC=$(sudo ssh $MIC_CARD mktemp -d /tmp/libtbbmallocXXXXXX) #
+ sudo ssh $MIC_CARD "chmod +x $TMPDIR_MIC" #
+ cp "./mic/libtbbmalloc"* "$TMPDIR_HOST" >/dev/null 2>/dev/null #
+ sudo scp "$TMPDIR_HOST"/* $MIC_CARD:"$TMPDIR_MIC" >/dev/null 2>/dev/null #
+ LD_LIBRARY_PATH=$TMPDIR_MIC:$LD_LIBRARY_PATH #
+ export LD_LIBRARY_PATH #
+fi #
# Run the command line passed via parameters
export LD_PRELOAD #
-./$* #
+./$* #
+exitcode=$? #
+if [ $OFFLOAD_EXECUTION ] ; then #
+ sudo ssh $MIC_CARD rm -fr "$TMPDIR_MIC" >/dev/null 2>/dev/null #
+ rm -fr "$TMPDIR_HOST" >/dev/null 2>/dev/null #
+fi #
+exit ${exitcode} #
diff --git a/build/version_info_aix.sh b/build/version_info_aix.sh
index 30e9deb..da90d40 100644
--- a/build/version_info_aix.sh
+++ b/build/version_info_aix.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -34,7 +34,7 @@ echo '#N": BUILD_OS'"\t\t"`lsb_release -sd 2>/dev/null | grep -ih '[a-z] ' - /et
echo '#N": BUILD_KERNEL'"\t"`uname -srv`'" ENDL \'
echo '#N": BUILD_GCC'"\t\t"`g++ -v </dev/null 2>&1 | grep 'gcc.*version'`'" ENDL \'
[ -z "$COMPILER_VERSION" ] || echo '#N": BUILD_COMPILER'"\t"$COMPILER_VERSION'" ENDL \'
-echo '#N": BUILD_GLIBC'"\t"`getconf GNU_LIBC_VERSION | grep glibc | sed -e 's/^glibc //'`'" ENDL \'
+echo '#N": BUILD_LIBC'"\t"`getconf GNU_LIBC_VERSION | grep glibc | sed -e 's/^glibc //'`'" ENDL \'
echo '#N": BUILD_LD'"\t\t"`ld -v 2>&1 | grep 'version'`'" ENDL \'
echo '#N": BUILD_TARGET'"\t$arch on $runtime"'" ENDL \'
echo '#N": BUILD_COMMAND'"\t"$*'" ENDL \'
diff --git a/build/version_info_linux.sh b/build/version_info_android.sh
similarity index 75%
copy from build/version_info_linux.sh
copy to build/version_info_android.sh
index c11a85d..c4440a9 100644
--- a/build/version_info_linux.sh
+++ b/build/version_info_android.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -27,15 +27,19 @@
# the GNU General Public License.
# Script used to generate version info string
+# remove extraneous cntrl-M characters from ends of lines generated by adb shell command
+android_os=`(adb shell getprop ro.build.version.release) | sed -e 's/\\r$//g'`
+android_kernel=`(adb shell uname -srv) | sed -e 's/\\r$//g'`
echo "#define __TBB_VERSION_STRINGS(N) \\"
echo '#N": BUILD_HOST'"\t\t"`hostname -s`" ("`uname -m`")"'" ENDL \'
# find OS name in *-release and issue* files by filtering blank lines and lsb-release content out
echo '#N": BUILD_OS'"\t\t"`lsb_release -sd 2>/dev/null | grep -ih '[a-z] ' - /etc/*release /etc/issue 2>/dev/null | head -1 | sed -e 's/["\\\\]//g'`'" ENDL \'
-echo '#N": BUILD_KERNEL'"\t"`uname -srv`'" ENDL \'
-echo '#N": BUILD_GCC'"\t\t"`g++ -v </dev/null 2>&1 | grep 'gcc.*version '`'" ENDL \'
+echo '#N": BUILD_TARGET_OS'"\t\tAndroid ${android_os}"'" ENDL \'
+echo '#N": BUILD_TARGET_KERNEL'"\t${android_kernel}"'" ENDL \'
+echo '#N": BUILD_GCC'"\t\t"`${tbb_tool_prefix}g++ -dumpversion`'" ENDL \'
[ -z "$COMPILER_VERSION" ] || echo '#N": BUILD_COMPILER'"\t"$COMPILER_VERSION'" ENDL \'
-echo '#N": BUILD_GLIBC'"\t"`getconf GNU_LIBC_VERSION | grep glibc | sed -e 's/^glibc //'`'" ENDL \'
-echo '#N": BUILD_LD'"\t\t"`ld -v 2>&1 | grep 'version'`'" ENDL \'
+[ -z "$ndk_version" ] || echo '#N": BUILD_NDK'"\t\t$ndk_version"'" ENDL \'
+echo '#N": BUILD_LD'"\t\t"`${tbb_tool_prefix}ld -v 2>&1 | grep 'ld'`'" ENDL \'
echo '#N": BUILD_TARGET'"\t$arch on $runtime"'" ENDL \'
echo '#N": BUILD_COMMAND'"\t"$*'" ENDL \'
echo ""
diff --git a/build/version_info_linux.sh b/build/version_info_linux.sh
index c11a85d..c00143c 100644
--- a/build/version_info_linux.sh
+++ b/build/version_info_linux.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -34,7 +34,7 @@ echo '#N": BUILD_OS'"\t\t"`lsb_release -sd 2>/dev/null | grep -ih '[a-z] ' - /et
echo '#N": BUILD_KERNEL'"\t"`uname -srv`'" ENDL \'
echo '#N": BUILD_GCC'"\t\t"`g++ -v </dev/null 2>&1 | grep 'gcc.*version '`'" ENDL \'
[ -z "$COMPILER_VERSION" ] || echo '#N": BUILD_COMPILER'"\t"$COMPILER_VERSION'" ENDL \'
-echo '#N": BUILD_GLIBC'"\t"`getconf GNU_LIBC_VERSION | grep glibc | sed -e 's/^glibc //'`'" ENDL \'
+echo '#N": BUILD_LIBC'"\t"`getconf GNU_LIBC_VERSION | grep glibc | sed -e 's/^glibc //'`'" ENDL \'
echo '#N": BUILD_LD'"\t\t"`ld -v 2>&1 | grep 'version'`'" ENDL \'
echo '#N": BUILD_TARGET'"\t$arch on $runtime"'" ENDL \'
echo '#N": BUILD_COMMAND'"\t"$*'" ENDL \'
diff --git a/build/version_info_macos.sh b/build/version_info_macos.sh
index 43c706d..5970aad 100644
--- a/build/version_info_macos.sh
+++ b/build/version_info_macos.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/version_info_sunos.sh b/build/version_info_sunos.sh
index ac1cbcf..00dc2eb 100644
--- a/build/version_info_sunos.sh
+++ b/build/version_info_sunos.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/version_info_windows.js b/build/version_info_windows.js
index 3dcf09a..3ed16b2 100644
--- a/build/version_info_windows.js
+++ b/build/version_info_windows.js
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
@@ -47,7 +47,7 @@ WScript.echo( "#N \": BUILD_OS\\t\\t" +
"\" ENDL \\" );
if ( WScript.Arguments(0).toLowerCase().match("gcc") ) {
- tmpExec = WshShell.Exec("gcc --version");
+ tmpExec = WshShell.Exec(WScript.Arguments(0) + " --version");
WScript.echo( "#N \": BUILD_COMPILER\\t" +
tmpExec.StdOut.ReadLine() +
"\" ENDL \\" );
diff --git a/build/vsproject/index.html b/build/vsproject/index.html
index 6607338..162a28b 100644
--- a/build/vsproject/index.html
+++ b/build/vsproject/index.html
@@ -2,7 +2,7 @@
<BODY>
<H2>Overview</H2>
-This directory contains the visual studio* 2005 solution to build Threading Building Blocks.
+This directory contains the visual studio* 2008 solution to build Intel® Threading Building Blocks.
<H2>Files</H2>
@@ -20,7 +20,7 @@ This directory contains the visual studio* 2005 solution to build Threading Buil
<HR>
<A HREF="../index.html">Up to parent directory</A>
<P></P>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/build/vsproject/makefile.sln b/build/vsproject/makefile.sln
index 1fd7a8d..a4ebd48 100644
--- a/build/vsproject/makefile.sln
+++ b/build/vsproject/makefile.sln
@@ -1,34 +1,18 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tbb", "tbb.vcproj", "{F62787DD-1327-448B-9818-030062BCFAA5}"
- ProjectSection(WebsiteProperties) = preProject
- Debug.AspNetCompiler.Debug = "True"
- Release.AspNetCompiler.Debug = "False"
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8898CE0B-0BFB-45AE-AA71-83735ED2510D}"
+ ProjectSection(SolutionItems) = preProject
+ index.html = index.html
EndProjectSection
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tbb", "tbb.vcproj", "{F62787DD-1327-448B-9818-030062BCFAA5}"
+EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tbbmalloc", "tbbmalloc.vcproj", "{B15F131E-328A-4D42-ADC2-9FF4CA6306D8}"
- ProjectSection(WebsiteProperties) = preProject
- Debug.AspNetCompiler.Debug = "True"
- Release.AspNetCompiler.Debug = "False"
- EndProjectSection
ProjectSection(ProjectDependencies) = postProject
{F62787DD-1327-448B-9818-030062BCFAA5} = {F62787DD-1327-448B-9818-030062BCFAA5}
EndProjectSection
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8898CE0B-0BFB-45AE-AA71-83735ED2510D}"
- ProjectSection(WebsiteProperties) = preProject
- Debug.AspNetCompiler.Debug = "True"
- Release.AspNetCompiler.Debug = "False"
- EndProjectSection
- ProjectSection(SolutionItems) = preProject
- index.html = index.html
- EndProjectSection
-EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tbbmalloc_proxy", "tbbmalloc_proxy.vcproj", "{02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}"
- ProjectSection(WebsiteProperties) = preProject
- Debug.AspNetCompiler.Debug = "True"
- Release.AspNetCompiler.Debug = "False"
- EndProjectSection
ProjectSection(ProjectDependencies) = postProject
{B15F131E-328A-4D42-ADC2-9FF4CA6306D8} = {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}
EndProjectSection
diff --git a/build/vsproject/tbb.vcproj b/build/vsproject/tbb.vcproj
index 1c77711..ee3d37b 100644
--- a/build/vsproject/tbb.vcproj
+++ b/build/vsproject/tbb.vcproj
@@ -1,530 +1,538 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="tbb" ProjectGUID="{F62787DD-1327-448B-9818-030062BCFAA5}" RootNamespace="tbb" Keyword="Win32Proj">
- <Platforms>
- <Platform Name="Win32"/>
- <Platform Name="x64"/>
- </Platforms>
- <ToolFiles>
- <DefaultToolFile FileName="masm.rules"/>
- </ToolFiles>
- <Configurations>
- <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" UsePrecompiledHe [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" BufferSecurityCheck="false" Ru [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" BufferSecurityCheck="false" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel="4" [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" BufferSecurityCheck="false" RuntimeLibrary="1" UsePreco [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" BufferSecurityCheck="false" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File RelativePath="..\..\src\tbb\intel64-masm\atomic_support.asm">
- <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Debug\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Release\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug-MT\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Debug-MT\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release-MT\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Release-MT\atomic_support.obj"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\intel64-masm\intel64_misc.asm">
- <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCCustomBuildTool" Description="building intel64_misc.obj" CommandLine="ml64 /Fo"intel64\Debug\intel64_misc.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm
-" Outputs="intel64\Debug\intel64_misc.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCCustomBuildTool" Description="building intel64_misc.obj" CommandLine="ml64 /Fo"intel64\Release\intel64_misc.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm
-" Outputs="intel64\Release\intel64_misc.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building intel64_misc.obj" CommandLine="ml64 /Fo"intel64\Debug-MT\intel64_misc.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm
-" Outputs="intel64\Debug-MT\intel64_misc.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building intel64_misc.obj" CommandLine="ml64 /Fo"intel64\Release-MT\intel64_misc.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm
-" Outputs="intel64\Release-MT\intel64_misc.obj"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\ia32-masm\atomic_support.asm">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\ia32-masm\lock_byte.asm">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\win32-tbb-export.def">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\win64-tbb-export.def">
- <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\concurrent_hash_map.cpp"/><File RelativePath="..\..\src\tbb\concurrent_queue.cpp"/><File RelativePath="..\..\src\tbb\concurrent_vector.cpp"/><File RelativePath="..\..\src\tbb\dynamic_link.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.cpp"/><File RelativePath="..\..\src\tbb\cache_aligned_allocator.cpp"/><File RelativePath="..\..\src\tbb\pipeline.cpp"/><File RelativePath="..\..\src\tbb\queuing_mutex.cpp"/><File RelativePath="..\..\src\tbb\queuing_r [...]
- <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File RelativePath="..\..\include\tbb\internal\_concurrent_queue_impl.h">
- </File>
- <File RelativePath="..\..\include\tbb\_tbb_windef.h">
- </File>
- <File RelativePath="..\..\include\tbb\aligned_space.h">
- </File>
- <File RelativePath="..\..\include\tbb\atomic.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range2d.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range3d.h">
- </File>
- <File RelativePath="..\..\include\tbb\cache_aligned_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\combinable.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_hash_map.h">
- </File>
- <File RelativePath="..\..\src\tbb\semaphore.h">
- </File>
- <File RelativePath="..\..\src\tbb\concurrent_monitor.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_queue.h">
- </File>
- <File RelativePath="..\..\src\old\concurrent_queue_v2.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_vector.h">
- </File>
- <File RelativePath="..\..\src\old\concurrent_vector_v2.h">
- </File>
- <File RelativePath="..\..\include\tbb\critical_section.h">
- </File>
- <File RelativePath="..\..\src\tbb\dynamic_link.h">
- </File>
- <File RelativePath="..\..\include\tbb\enumerable_thread_specific.h">
- </File>
- <File RelativePath="..\..\src\tbb\gate.h">
- </File>
- <File RelativePath="..\..\src\test\harness.h">
- </File>
- <File RelativePath="..\..\src\test\harness_allocator.h">
- </File>
- <File RelativePath="..\..\src\test\harness_assert.h">
- </File>
- <File RelativePath="..\..\src\test\harness_bad_expr.h">
- </File>
- <File RelativePath="..\..\src\test\harness_barrier.h">
- </File>
- <File RelativePath="..\..\src\test\harness_concurrency_tracker.h">
- </File>
- <File RelativePath="..\..\src\test\harness_cpu.h">
- </File>
- <File RelativePath="..\..\src\test\harness_eh.h">
- </File>
- <File RelativePath="..\..\src\test\harness_iterator.h">
- </File>
- <File RelativePath="..\..\src\test\harness_m128.h">
- </File>
- <File RelativePath="..\..\src\test\harness_memory.h">
- </File>
- <File RelativePath="..\..\src\test\harness_report.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\ibm_aix51.h">
- </File>
- <File RelativePath="..\..\src\tbb\itt_notify.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\linux_common.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\linux_ia32.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\linux_ia64.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\linux_intel64.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\mac_ppc.h">
- </File>
- <File RelativePath="..\..\include\tbb\mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\null_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\null_rw_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_do.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_for.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_for_each.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_invoke.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_reduce.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_scan.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_sort.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_while.h">
- </File>
- <File RelativePath="..\..\include\tbb\partitioner.h">
- </File>
- <File RelativePath="..\..\include\tbb\pipeline.h">
- </File>
- <File RelativePath="..\..\include\tbb\compat\ppl.h">
- </File>
- <File RelativePath="..\..\include\tbb\queuing_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\queuing_rw_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\reader_writer_lock.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_priority_queue.h">
- </File>
- <File RelativePath="..\..\include\tbb\recursive_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\scalable_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\spin_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\spin_rw_mutex.h">
- </File>
- <File RelativePath="..\..\src\old\spin_rw_mutex_v2.h">
- </File>
- <File RelativePath="..\..\include\tbb\task.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_group.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_scheduler_init.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_scheduler_observer.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_allocator.h">
- </File>
- <File RelativePath="..\..\src\tbb\tbb_assert_impl.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_config.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_exception.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_machine.h">
- </File>
- <File RelativePath="..\..\src\tbb\tbb_misc.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_profiling.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_stddef.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_thread.h">
- </File>
- <File RelativePath="..\..\src\tbb\tbb_version.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
- </File>
- <File RelativePath="..\..\src\test\test_allocator.h">
- </File>
- <File RelativePath="..\..\src\test\test_allocator_STL.h">
- </File>
- <File RelativePath="..\..\include\tbb\tick_count.h">
- </File>
- <File RelativePath="..\..\src\tbb\tls.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\windows_ia32.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\windows_intel64.h">
- </File>
- </Filter>
- <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- <File RelativePath="..\..\src\tbb\tbb_resource.rc">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject ProjectType="Visual C++" Version="9.00" Name="tbb" ProjectGUID="{F62787DD-1327-448B-9818-030062BCFAA5}" RootNamespace="tbb" Keyword="Win32Proj" TargetFrameworkVersion="131072">
+ <Platforms>
+ <Platform Name="Win32"/>
+ <Platform Name="x64"/>
+ </Platforms>
+ <ToolFiles>
+ <DefaultToolFile FileName="masm.rules"/>
+ </ToolFiles>
+ <Configurations>
+ <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /WX /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" UsePrecompiledHeader="0" WarningL [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /WX /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" BufferSecurityCheck="false" UsePr [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /WX /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /WX /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="2" BufferSecurityCheck="false" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /WX /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" UsePrecompiledHeader="0" WarningL [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /WX /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" BufferSecurityCheck="false" UsePr [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /WX /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBB_BUILD=1 /W4 /WX /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="0" BufferSecurityCheck="false" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File RelativePath="..\..\src\tbb\ia32-masm\atomic_support.asm">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\intel64-masm\atomic_support.asm">
+ <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Debug\atomic_support.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Release\atomic_support.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug-MT\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Debug-MT\atomic_support.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release-MT\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Release-MT\atomic_support.obj"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\intel64-masm\intel64_misc.asm">
+ <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCCustomBuildTool" Description="building intel64_misc.obj" CommandLine="ml64 /Fo"intel64\Debug\intel64_misc.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm
+" Outputs="intel64\Debug\intel64_misc.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCCustomBuildTool" Description="building intel64_misc.obj" CommandLine="ml64 /Fo"intel64\Release\intel64_misc.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm
+" Outputs="intel64\Release\intel64_misc.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="building intel64_misc.obj" CommandLine="ml64 /Fo"intel64\Debug-MT\intel64_misc.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm
+" Outputs="intel64\Debug-MT\intel64_misc.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="building intel64_misc.obj" CommandLine="ml64 /Fo"intel64\Release-MT\intel64_misc.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm
+" Outputs="intel64\Release-MT\intel64_misc.obj"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\ia32-masm\lock_byte.asm">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\win32-tbb-export.def">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\win64-tbb-export.def">
+ <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\concurrent_hash_map.cpp"/><File RelativePath="..\..\src\tbb\concurrent_queue.cpp"/><File RelativePath="..\..\src\tbb\concurrent_vector.cpp"/><File RelativePath="..\..\src\tbb\dynamic_link.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.cpp"/><File RelativePath="..\..\src\tbb\cache_aligned_allocator.cpp"/><File RelativePath="..\..\src\tbb\pipeline.cpp"/><File RelativePath="..\..\src\tbb\queuing_mutex.cpp"/><File RelativePath="..\..\src\tbb\queuing_r [...]
+ <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ <File RelativePath="..\..\include\tbb\internal\_concurrent_queue_impl.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\_tbb_windef.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\aligned_space.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\atomic.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\blocked_range.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\blocked_range2d.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\blocked_range3d.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\cache_aligned_allocator.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\combinable.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_hash_map.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\concurrent_monitor.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_priority_queue.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_queue.h">
+ </File>
+ <File RelativePath="..\..\src\old\concurrent_queue_v2.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_vector.h">
+ </File>
+ <File RelativePath="..\..\src\old\concurrent_vector_v2.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\critical_section.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\dynamic_link.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\enumerable_thread_specific.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\gate.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_allocator.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_assert.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_bad_expr.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_barrier.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_concurrency_tracker.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_cpu.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_eh.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_iterator.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_m128.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_memory.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_report.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\ibm_aix51.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\itt_notify.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\linux_common.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\linux_ia32.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\linux_ia64.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\linux_intel64.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\mac_ppc.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\null_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\null_rw_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_do.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_for.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_for_each.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_invoke.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_reduce.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_scan.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_sort.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_while.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\partitioner.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\pipeline.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\compat\ppl.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\queuing_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\queuing_rw_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\reader_writer_lock.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\recursive_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\scalable_allocator.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\semaphore.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\spin_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\spin_rw_mutex.h">
+ </File>
+ <File RelativePath="..\..\src\old\spin_rw_mutex_v2.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task_group.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task_scheduler_init.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task_scheduler_observer.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_allocator.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\tbb_assert_impl.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_config.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_exception.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_machine.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\tbb_misc.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_profiling.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_stddef.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_thread.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\tbb_version.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
+ </File>
+ <File RelativePath="..\..\src\test\test_allocator.h">
+ </File>
+ <File RelativePath="..\..\src\test\test_allocator_STL.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tick_count.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\tls.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\windows_ia32.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\windows_intel64.h">
+ </File>
+ </Filter>
+ <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ <File RelativePath="..\..\src\tbb\tbb_resource.rc">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/build/vsproject/tbbmalloc.vcproj b/build/vsproject/tbbmalloc.vcproj
index f0078ad..91be06e 100644
--- a/build/vsproject/tbbmalloc.vcproj
+++ b/build/vsproject/tbbmalloc.vcproj
@@ -1,410 +1,1332 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="tbbmalloc" ProjectGUID="{B15F131E-328A-4D42-ADC2-9FF4CA6306D8}" RootNamespace="tbbmalloc" Keyword="Win32Proj">
- <Platforms>
- <Platform Name="Win32"/>
- <Platform Name="x64"/>
- </Platforms>
- <ToolFiles>
- <DefaultToolFile FileName="masm.rules"/>
- </ToolFiles>
- <Configurations>
- <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I." Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling= [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I." Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeCheck [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I." AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" De [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I." AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" BufferSecurityCheck="false" RuntimeLibrary="2" UsePrecompi [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I." Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="0" BasicRuntimeChe [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I." Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BufferSecurityCheck="false" BasicRun [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I." AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationForma [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I." AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" BufferSecurityCheck="false" RuntimeLibrary="0" UsePrecompiledHeader="0" Warni [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File RelativePath="..\..\src\tbb\intel64-masm\atomic_support.asm">
- <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Debug\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Release\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug-MT\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Debug-MT\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release-MT\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Release-MT\atomic_support.obj"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbbmalloc\win32-tbbmalloc-export.def">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbbmalloc\win64-tbbmalloc-export.def">
- <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbbmalloc\backend.cpp"/><File RelativePath="..\..\src\tbbmalloc\large_objects.cpp"/><File RelativePath="..\..\src\tbbmalloc\backref.cpp"/><File RelativePath="..\..\src\tbbmalloc\tbbmalloc.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.cpp"/><File RelativePath="..\..\src\tbbmalloc\frontend.cpp"/></Filter>
- <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File RelativePath="..\..\include\tbb\internal\_concurrent_queue_impl.h">
- </File>
- <File RelativePath="..\..\include\tbb\_tbb_windef.h">
- </File>
- <File RelativePath="..\..\include\tbb\aligned_space.h">
- </File>
- <File RelativePath="..\..\include\tbb\atomic.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range2d.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range3d.h">
- </File>
- <File RelativePath="..\..\include\tbb\cache_aligned_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\combinable.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_hash_map.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_queue.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_vector.h">
- </File>
- <File RelativePath="..\..\include\tbb\critical_section.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\Customize.h">
- </File>
- <File RelativePath="..\..\include\tbb\enumerable_thread_specific.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\LifoList.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\MapMemory.h">
- </File>
- <File RelativePath="..\..\include\tbb\mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\null_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\null_rw_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_do.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_for.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_for_each.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_invoke.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_reduce.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_scan.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_sort.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_while.h">
- </File>
- <File RelativePath="..\..\include\tbb\partitioner.h">
- </File>
- <File RelativePath="..\..\include\tbb\pipeline.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\proxy.h">
- </File>
- <File RelativePath="..\..\include\tbb\queuing_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\queuing_rw_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\recursive_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\scalable_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\spin_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\spin_rw_mutex.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\Statistics.h">
- </File>
- <File RelativePath="..\..\include\tbb\task.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_group.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_scheduler_init.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_scheduler_observer.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_config.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_exception.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_machine.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_profiling.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_stddef.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_thread.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_version.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
- </File>
- <File RelativePath="..\..\include\tbb\tick_count.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\TypeDefinitions.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\windows_ia32.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\windows_intel64.h">
- </File>
- </Filter>
- <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- <File RelativePath="..\..\src\tbbmalloc\tbbmalloc.rc">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="tbbmalloc"
+ ProjectGUID="{B15F131E-328A-4D42-ADC2-9FF4CA6306D8}"
+ RootNamespace="tbbmalloc"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ <DefaultToolFile
+ FileName="masm.rules"
+ />
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)"
+ IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="MASM"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I."
+ Optimization="0"
+ AdditionalIncludeDirectories="."
+ PreprocessorDefinitions=""
+ MinimalRebuild="true"
+ ExceptionHandling="0"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def""
+ OutputFile="$(OutDir)\tbbmalloc_debug.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)"
+ IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="MASM"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I."
+ Optimization="0"
+ AdditionalIncludeDirectories="."
+ MinimalRebuild="false"
+ ExceptionHandling="0"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ DebugInformationFormat="3"
+ ShowIncludes="false"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def""
+ OutputFile="$(OutDir)\tbbmalloc_debug.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)"
+ IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="MASM"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=" /c /MD /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I."
+ AdditionalIncludeDirectories="."
+ PreprocessorDefinitions=""
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def""
+ OutputFile="$(OutDir)\tbbmalloc.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)"
+ IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="MASM"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=" /c /MD /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I."
+ AdditionalIncludeDirectories="."
+ PreprocessorDefinitions=""
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def""
+ OutputFile="$(OutDir)\tbbmalloc.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug-MT|Win32"
+ OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)"
+ IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="MASM"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I."
+ Optimization="0"
+ AdditionalIncludeDirectories="."
+ PreprocessorDefinitions=""
+ MinimalRebuild="true"
+ ExceptionHandling="0"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def""
+ OutputFile="$(OutDir)\tbbmalloc_debug.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug-MT|x64"
+ OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)"
+ IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="MASM"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I."
+ Optimization="0"
+ AdditionalIncludeDirectories="."
+ MinimalRebuild="false"
+ ExceptionHandling="0"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="false"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ DebugInformationFormat="3"
+ ShowIncludes="false"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def""
+ OutputFile="$(OutDir)\tbbmalloc_debug.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release-MT|Win32"
+ OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)"
+ IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="MASM"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=" /c /MT /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I."
+ AdditionalIncludeDirectories="."
+ PreprocessorDefinitions=""
+ ExceptionHandling="0"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def""
+ OutputFile="$(OutDir)\tbbmalloc.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release-MT|x64"
+ OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)"
+ IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="MASM"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=" /c /MT /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I."
+ AdditionalIncludeDirectories="."
+ PreprocessorDefinitions=""
+ ExceptionHandling="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def""
+ OutputFile="$(OutDir)\tbbmalloc.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\src\tbb\intel64-masm\atomic_support.asm"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="building atomic_support.obj"
+ CommandLine="ml64 /Fo"intel64\Debug\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
"
+ Outputs="intel64\Debug\atomic_support.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="building atomic_support.obj"
+ CommandLine="ml64 /Fo"intel64\Release\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
"
+ Outputs="intel64\Release\atomic_support.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|Win32"
+ ExcludedFromBuild="true"
+ >
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="building atomic_support.obj"
+ CommandLine="ml64 /Fo"intel64\Debug-MT\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
"
+ Outputs="intel64\Debug-MT\atomic_support.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|Win32"
+ ExcludedFromBuild="true"
+ >
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="building atomic_support.obj"
+ CommandLine="ml64 /Fo"intel64\Release-MT\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
"
+ Outputs="intel64\Release-MT\atomic_support.obj"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\backend.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\backref.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\frontend.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbb\itt_notify.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)\itt_notify_malloc.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)\itt_notify_malloc.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)\itt_notify_malloc.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)\itt_notify_malloc.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)\itt_notify_malloc.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)\itt_notify_malloc.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)\itt_notify_malloc.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)\itt_notify_malloc.obj"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\large_objects.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\tbbmalloc.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\win32-tbbmalloc-export.def"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\win64-tbbmalloc-export.def"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="generating tbbmalloc.def file"
+ CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)\tbbmalloc.def"
"
+ Outputs=""$(IntDir)\tbbmalloc.def""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\include\tbb\internal\_concurrent_queue_impl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\_tbb_windef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\aligned_space.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\atomic.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\blocked_range.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\blocked_range2d.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\blocked_range3d.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\cache_aligned_allocator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\combinable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\concurrent_hash_map.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\concurrent_queue.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\concurrent_vector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\critical_section.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\Customize.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\enumerable_thread_specific.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\LifoList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\MapMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\mutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\null_mutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\null_rw_mutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\parallel_do.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\parallel_for.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\parallel_for_each.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\parallel_invoke.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\parallel_reduce.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\parallel_scan.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\parallel_sort.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\parallel_while.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\partitioner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\pipeline.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\proxy.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\queuing_mutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\queuing_rw_mutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\recursive_mutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\scalable_allocator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\spin_mutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\spin_rw_mutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\Statistics.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\task.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\task_group.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\task_scheduler_init.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\task_scheduler_observer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbb.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbb_allocator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbb_config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbb_exception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbb_machine.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbb_profiling.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbb_stddef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbb_thread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbb_version.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tbbmalloc_proxy.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\tick_count.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tbbmalloc\TypeDefinitions.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\machine\windows_ia32.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\include\tbb\machine\windows_intel64.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\..\src\tbbmalloc\tbbmalloc.rc"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug-MT|x64"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release-MT|x64"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/build/vsproject/tbbmalloc_proxy.vcproj b/build/vsproject/tbbmalloc_proxy.vcproj
index 12a60f7..14f48e6 100644
--- a/build/vsproject/tbbmalloc_proxy.vcproj
+++ b/build/vsproject/tbbmalloc_proxy.vcproj
@@ -1,206 +1,214 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="tbbmalloc_proxy" ProjectGUID="{02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}" RootNamespace="tbbmalloc_proxy" Keyword="Win32Proj">
- <Platforms>
- <Platform Name="Win32"/>
- <Platform Name="x64"/>
- </Platforms>
- <ToolFiles>
- <DefaultToolFile FileName="masm.rules"/>
- </ToolFiles>
- <Configurations>
- <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /Wp64 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" Exceptio [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /Wp64 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRu [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /Wp64 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLe [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /Wp64 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" BufferSecurityCheck="false" RuntimeLibrary="2" U [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="1" BasicRuntim [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" BufferSec [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationF [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" BufferSecurityCheck="false" RuntimeLibrary="0" UsePrecompiledHeader="0" W [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File RelativePath="..\..\src\tbbmalloc\proxy.cpp"/><File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.cpp"/></Filter>
- <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
- </File>
- </Filter>
- <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- <File RelativePath="..\..\src\tbbmalloc\tbbmalloc.rc">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject ProjectType="Visual C++" Version="9.00" Name="tbbmalloc_proxy" ProjectGUID="{02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}" RootNamespace="tbbmalloc_proxy" Keyword="Win32Proj" TargetFrameworkVersion="131072">
+ <Platforms>
+ <Platform Name="Win32"/>
+ <Platform Name="x64"/>
+ </Platforms>
+ <ToolFiles>
+ <DefaultToolFile FileName="masm.rules"/>
+ </ToolFiles>
+ <Configurations>
+ <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /WX /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="1" Bas [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /WX /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" Runtim [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /WX /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugInfo [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /WX /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" BufferSecurityCheck="false" UsePrecompiledHeader="0 [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="1" BasicRuntimeChecks="0" RuntimeLibrary="1" UsePrecompiledHeader=" [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /WX /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" Runtim [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0501 /W4 /WX /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" BufferSecurityCheck="false" UsePrecompiledHeader="0 [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" RandomizedBaseAddress="1" DataExecutionPrevention="0" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File RelativePath="..\..\src\tbbmalloc\proxy.cpp"/><File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.cpp"/></Filter>
+ <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ <File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
+ </File>
+ </Filter>
+ <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ <File RelativePath="..\..\src\tbbmalloc\tbbmalloc.rc">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/build/windows.cl.inc b/build/windows.cl.inc
index d4ae95b..0e4dd40 100644
--- a/build/windows.cl.inc
+++ b/build/windows.cl.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -34,14 +34,19 @@
#------------------------------------------------------------------------------
CPLUS = cl /nologo
LINK_FLAGS = /link /nologo
-LIB_LINK_FLAGS=/link /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO
+LIB_LINK_FLAGS=/link /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DYNAMICBASE /NXCOMPAT
+
+ifeq ($(arch), ia32)
+ LIB_LINK_FLAGS += /SAFESEH
+endif
+
ifeq ($(runtime), vc_mt)
MS_CRT_KEY = /MT$(if $(findstring debug,$(cfg)),d)
else
MS_CRT_KEY = /MD$(if $(findstring debug,$(cfg)),d)
endif
EH_FLAGS = /EHsc /GR
-
+
ifeq ($(cfg), release)
CPLUS_FLAGS = $(MS_CRT_KEY) /O2 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=$(TBB.LIB)
ASM_FLAGS =
@@ -51,6 +56,17 @@ ifeq ($(cfg), debug)
ASM_FLAGS = /DUSE_FRAME_POINTER
endif
+ifeq ($(target_ui), win8ui)
+ CPLUS_FLAGS += /D "_UNICODE" /D "UNICODE" /D "WINAPI_FAMILY=WINAPI_FAMILY_APP"
+ _WIN32_WINNT=0x0602
+ifeq ($(target_ui_mode), production)
+ LIB_LINK_FLAGS += /APPCONTAINER
+endif
+else
+ CPLUS_FLAGS += /DDO_ITT_NOTIFY
+endif
+
+CPLUS_FLAGS += /GS
COMPILE_ONLY = /c
PREPROC_ONLY = /TP /EP
@@ -64,6 +80,7 @@ ifeq ($(runtime),vc7.1)
WARNING_KEY = /W3
else
WARNING_KEY = /W4
+ OPENMP_FLAG = /openmp
endif
DYLIB_KEY = /DLL
@@ -72,23 +89,20 @@ NODEFAULTLIB_KEY = /Zl
NOINTRINSIC_KEY = /Oi-
ifeq ($(runtime),vc8)
- OPENMP_FLAG = /openmp
WARNING_KEY += /Wp64
CPLUS_FLAGS += /D_USE_RTM_VERSION
endif
-ifeq ($(runtime),vc9)
- OPENMP_FLAG = /openmp
-endif
-ifeq ($(runtime),vc_mt)
- OPENMP_FLAG = /openmp
-endif
-ifeq (intel64,$(arch))
- CPLUS_FLAGS += /GS-
+
+# Since VS2012, VC++ provides /volatile option to control semantics of volatile variables.
+# We want to use strict ISO semantics in the library and tests
+ifeq (ok,$(call detect_js,/minversion cl 17))
+ CPLUS_FLAGS += /volatile:iso
endif
-CPLUS_FLAGS += /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE \
+CPLUS_FLAGS += /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE \
/D_WIN32_WINNT=$(_WIN32_WINNT)
C_FLAGS = $(CPLUS_FLAGS)
+
#------------------------------------------------------------------------------
# End of setting compiler flags.
#------------------------------------------------------------------------------
@@ -104,10 +118,15 @@ ifeq (intel64,$(arch))
TBB_ASM.OBJ = atomic_support.obj intel64_misc.obj
MALLOC_ASM.OBJ = atomic_support.obj
else
+ifeq (armv7,$(arch))
+ ASM=
+ TBB_ASM.OBJ=
+else
ASM=ml /nologo
- ASM_FLAGS += /c /coff /Zi
+ ASM_FLAGS += /c /coff /Zi /safeseh
TBB_ASM.OBJ = atomic_support.obj lock_byte.obj
endif
+endif
#------------------------------------------------------------------------------
# End of setting assembler data.
#------------------------------------------------------------------------------
@@ -116,7 +135,11 @@ endif
#------------------------------------------------------------------------------
# Setting tbbmalloc data.
#------------------------------------------------------------------------------
+ifneq ($(target_ui), win8ui)
M_CPLUS_FLAGS = $(subst $(EH_FLAGS),/EHs-,$(CPLUS_FLAGS))
+else
+M_CPLUS_FLAGS = $(CPLUS_FLAGS)
+endif
#------------------------------------------------------------------------------
# End of setting tbbmalloc data.
#------------------------------------------------------------------------------
diff --git a/build/windows.gcc.inc b/build/windows.gcc.inc
index 15851db..8b498aa 100644
--- a/build/windows.gcc.inc
+++ b/build/windows.gcc.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -48,6 +48,8 @@ MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-gcc-tbbmalloc-export.def
RML.DEF = $(RML_SERVER_ROOT)/lin-rml-export.def
LINK_TBB.LIB = $(TBB.LIB)
+# no TBB proxy for the configuration
+PROXY.LIB =
#------------------------------------------------------------------------------
# End of overridden settings
@@ -81,7 +83,7 @@ LIBS = -lpsapi
LINK_FLAGS = -Wl,--enable-auto-import
LIB_LINK_FLAGS = $(DYLIB_KEY)
# gcc 4.4 and higher support -std=c++0x
-ifeq (ok,$(shell cmd /C "cscript /nologo /E:jscript $(tbb_root)/build/detect.js /minversion gcc 4.4"))
+ifeq (ok,$(call detect_js,/minversion gcc 4.4))
CPP11_FLAGS = -std=c++0x -D_TBB_CPP0X
endif
@@ -91,6 +93,11 @@ endif
ifeq ($(cfg), debug)
CPLUS_FLAGS = -g -O0 -DTBB_USE_DEBUG
endif
+
+ifneq (00,$(lambdas)$(cpp0x))
+ CXX_ONLY_FLAGS += $(CPP11_FLAGS)
+endif
+
CPLUS_FLAGS += -DUSE_WINTHREAD
CPLUS_FLAGS += -D_WIN32_WINNT=$(_WIN32_WINNT)
@@ -98,6 +105,7 @@ CPLUS_FLAGS += -D_WIN32_WINNT=$(_WIN32_WINNT)
CPLUS_FLAGS += -DMINGW_HAS_SECURE_API=1 -D__MSVCRT_VERSION__=0x0700 -msse -mthreads
CONLY = gcc
+debugger = gdb
C_FLAGS = $(CPLUS_FLAGS)
ifeq (intel64,$(arch))
diff --git a/build/windows.icl.inc b/build/windows.icl.inc
index 7f38b22..ccdb7d1 100644
--- a/build/windows.icl.inc
+++ b/build/windows.icl.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -43,15 +43,20 @@ cfg ?= release
#------------------------------------------------------------------------------
CPLUS = icl /nologo $(VCCOMPAT_FLAG)
LINK_FLAGS = /link /nologo
-LIB_LINK_FLAGS= /link /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO
+LIB_LINK_FLAGS= /link /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DYNAMICBASE /NXCOMPAT
+
+ifeq ($(arch), ia32)
+ LIB_LINK_FLAGS += /SAFESEH
+endif
+
# ICC 11.0 and higher support -std=c++0x
-ifeq (ok,$(shell cmd /C "cscript /nologo /E:jscript $(tbb_root)/build/detect.js /minversion icl 11"))
+ifeq (ok,$(call detect_js,/minversion icl 11))
CPP11_FLAGS = /Qstd=c++0x /D_TBB_CPP0X
endif
# ICC 12.0 and higher provide Intel(R) Cilk Plus
-ifeq (ok,$(shell cmd /C "cscript /nologo /E:jscript $(tbb_root)/build/detect.js /minversion icl 12"))
+ifeq (ok,$(call detect_js,/minversion icl 12))
CILK_AVAILABLE = yes
endif
@@ -70,7 +75,7 @@ ifeq ($(cfg), debug)
CPLUS_FLAGS = $(MS_CRT_KEY) /Od /Ob0 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=$(TBB.LIB)
ASM_FLAGS = /DUSE_FRAME_POINTER
endif
-
+CPLUS_FLAGS += /GS
COMPILE_ONLY = /c /QMMD
# PREPROC_ONLY should really use /TP which applies to all files in the command line.
@@ -87,9 +92,6 @@ EXPORT_KEY = /DEF:
NODEFAULTLIB_KEY = /Zl
NOINTRINSIC_KEY = /Oi-
-ifeq (intel64,$(arch))
- CPLUS_FLAGS += /GS-
-endif
ifneq (,$(codecov))
CPLUS_FLAGS += /Qprof-genx
@@ -127,9 +129,13 @@ ifeq ($(VCCOMPAT_FLAG),)
VCCOMPAT_FLAG := $(if $(findstring vc10, $(VCVERSION)),/Qvc10)
endif
ifeq ($(VCCOMPAT_FLAG),)
+ VCCOMPAT_FLAG := $(if $(findstring vc11, $(VCVERSION)),/Qvc11)
+endif
+ifeq ($(VCCOMPAT_FLAG),)
$(error VC version not detected correctly: $(VCVERSION) )
endif
export VCCOMPAT_FLAG
+
#------------------------------------------------------------------------------
# End of setting compiler flags.
#------------------------------------------------------------------------------
@@ -146,7 +152,7 @@ ifeq (intel64,$(arch))
MALLOC_ASM.OBJ = atomic_support.obj
else
ASM=ml /nologo
- ASM_FLAGS += /c /coff /Zi
+ ASM_FLAGS += /c /coff /Zi /safeseh
TBB_ASM.OBJ = atomic_support.obj lock_byte.obj
endif
#------------------------------------------------------------------------------
diff --git a/build/windows.inc b/build/windows.inc
index 03c8661..c06f128 100644
--- a/build/windows.inc
+++ b/build/windows.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -32,13 +32,17 @@ else
test_dir:=.
endif
+# A convenience wrapper for calls to detect.js.
+# $(1) is the full command line for the script, e.g. /minversion icl 12
+detect_js = $(shell cmd /C "cscript /nologo /E:jscript $(tbb_root)/build/detect.js $(1)")
+
# TODO give an error if archs doesn't match
ifndef arch
- export arch:=$(shell cmd /C "cscript /nologo /E:jscript $(tbb_root)/build/detect.js /arch $(compiler)")
+ export arch:=$(call detect_js, /arch $(compiler))
endif
ifndef runtime
- export runtime:=$(shell cmd /C "cscript /nologo /E:jscript $(tbb_root)/build/detect.js /runtime $(compiler)")
+ export runtime:=$(call detect_js, /runtime $(compiler))
endif
native_compiler := cl
@@ -62,7 +66,7 @@ DLL = dll
LIBEXT = lib
ASMEXT = asm
-def_prefix = $(if $(findstring ia32,$(arch)),win32,win64)
+def_prefix = $(if $(findstring intel64,$(arch)),win64,win32)
# Target Windows version. Do not increase beyond 0x0501 without prior discussion!
# Used as the value for macro definition opiton in windows.cl.inc etc.
@@ -93,6 +97,7 @@ LINK_MALLOC.LIB = $(MALLOC.LIB)
MALLOCPROXY.DLL = tbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
MALLOCPROXY.LIB = tbbmalloc_proxy$(DEBUG_SUFFIX).$(LIBEXT)
+LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB)
PROXY.LIB = tbbproxy$(DEBUG_SUFFIX).$(LIBEXT)
@@ -107,4 +112,4 @@ endif
MAKE_VERSIONS = cmd /C cscript /nologo /E:jscript $(subst \,/,$(tbb_root))/build/version_info_windows.js $(compiler) $(arch) $(subst \,/,"$(CPLUS) $(CPLUS_FLAGS)") > version_string.ver
MAKE_TBBVARS = cmd /C "$(subst /,\,$(tbb_root))\build\generate_tbbvars.bat"
-TEST_LAUNCHER = $(subst /,\,$(tbb_root))\build\test_launcher.bat
+TEST_LAUNCHER = $(subst /,\,$(tbb_root))\build\test_launcher.bat $(largs)
diff --git a/build/xbox360.cl.inc b/build/xbox360.cl.inc
index 7efa4e9..358fc1e 100644
--- a/build/xbox360.cl.inc
+++ b/build/xbox360.cl.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/build/xbox360.inc b/build/xbox360.inc
index b215942..d381ba2 100644
--- a/build/xbox360.inc
+++ b/build/xbox360.inc
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -72,6 +72,8 @@ LINK_TBB.LIB =
MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
MALLOC.DLL = tbbmalloc$(DEBUG_SUFFIX).$(DLL)
MALLOC.LIB = tbbmalloc$(DEBUG_SUFFIX).$(LIBEXT)
+#On Windows we specify appropriate tbbmalloc library using #pragma comment
+LINK_MALLOC.LIB =
MALLOC.RES =
MAKE_VERSIONS = cmd /C cscript /nologo /E:jscript $(subst \,/,$(tbb_root))/build/version_info_windows.js $(compiler) $(arch) $(subst \,/,"$(CPLUS) $(CPLUS_FLAGS) $(INCLUDES)") > version_string.ver
diff --git a/doc/Release_Notes.txt b/doc/Release_Notes.txt
index e7290e5..985e362 100644
--- a/doc/Release_Notes.txt
+++ b/doc/Release_Notes.txt
@@ -1,6 +1,6 @@
------------------------------------------------------------------------
Intel(R) Threading Building Blocks - Release Notes
- Version 4.0
+ Version 4.1
------------------------------------------------------------------------
@@ -28,19 +28,20 @@ Hardware - Recommended
Linux* Systems
Intel(R) Core(TM) 2 Duo processor or Intel(R) Xeon(R) processor
or higher
- Mac OS* X Systems
+ Intel(R) Xeon Phi(TM) coprocessor
+ OS X* Systems
Intel(R) Core(TM) 2 Duo processor or higher
Hardware - Supported
Intel(R) Pentium(R) 4 processor family and higher
+ Intel(R) Xeon Phi(TM) coprocessor
Non Intel(R) processors compatible with the above processors
Software - Minimum Requirements
Supported operating system (see below)
Supported compiler (see below)
- Adobe(R) Reader(R)* 7.0 or higher
Software - Recommended
@@ -49,38 +50,37 @@ Software - Recommended
Software - Supported Operating Systems
- Microsoft* Windows* Systems
- Microsoft* Windows* 7
- Microsoft* Windows* Server 2008
- Microsoft* Windows* Vista
- Microsoft* Windows* XP Professional
- Microsoft* Windows* Server 2003 (deprecated)
- Linux* Systems
- Red Hat* Enterprise Linux* 6, 5, 4 (deprecated)
- Fedora* 15
- Asianux* 4.0, 3.0
- Debian* GNU/Linux* 6.0
- Ubuntu* 11.04, 10.04 LTS
- SuSE* Linux* Enterprise Server 10, 11SP1
- Mac OS* X Systems
- Mac OS* X 10.6.7 or higher
+ Systems with Microsoft* Windows* operating systems
+ Microsoft* Windows* 8
+ Microsoft* Windows* 7 SP1
+ Microsoft* Windows* Server 2012
+ Microsoft* Windows* Server 2008 SP2
+ Microsoft* Windows* Server 2008 R2 SP1
+ Microsoft* Windows* XP Professional SP3
+ Systems with Linux* operating systems
+ Red Hat* Enterprise Linux* 6, 5
+ Fedora* 17
+ Debian* 6.0
+ Ubuntu* 11.10, 12.04
+ SuSE* Linux* Enterprise Server 10, 11SP2
+ Pardus* 2011.2 (x64 only)
+ Intel(R) Cluster Ready
+ Systems with OS X* operating systems
+ OS X* 10.7.5 or higher
Software - Supported Compilers
- Intel(R) C++ Composer XE 2011 and higher
- Intel(R) C++ Compiler 11.1
+ Intel(R) C++ Composer XE 2011 SP1 and higher
+ Microsoft* Visual C++ 11.0 (Microsoft* Visual Studio* 2012,
+ Windows* OS only)
Microsoft* Visual C++ 10.0 (Microsoft* Visual Studio* 2010,
- Windows* systems only)
+ Windows* OS only)
Microsoft* Visual C++ 9.0 (Microsoft* Visual Studio* 2008,
- Windows* systems only)
- Microsoft* Visual C++ 8.0 (Microsoft* Visual Studio* 2005,
- Windows* systems only, deprecated)
+ Windows* OS only)
For each supported Linux* operating system, the standard gcc
version provided with that operating system is supported,
- including gcc 3.4 through 4.6
- For each supported Mac OS* X operating system, the standard gcc
- version provided with that operating system is supported,
- including: 4.0.1 or higher (Xcode* tool suite 3.2.5 or higher)
+ including gcc 4.1 through 4.7
+ Xcode* 4.4.1 and higher and command line tools (OS X* only)
Known Issues
@@ -90,14 +90,30 @@ Please note the following with respect to this particular release of
Intel(R) Threading Building Blocks.
Library Issues
+ - If Intel TBB is used together with Intel C++ Compiler 12.1 and
+ the standard C++ library from GCC 4.4, compilation in C++11 mode
+ (-std=c++0x) may fail with an error saying 'namespace "std" has
+ no member "exception_ptr"'. To overcome the problem, include an
+ Intel TBB header (e.g. tbb_stddef.h) before any standard
+ library headers.
+
+ - If an application is built for Microsoft* Windows* XP Professional
+ or similar the _WIN32_WINNT macro must be set manually to 0x0501
+ in order to limit the usage of modern API that is available on
+ newer operating systems.
- If an application uses static version of MSVCRT libraries or uses
- TBB DLL built with static MSVCRT (vc_mt variant), and throws
+ Intel TBB DLL built with static MSVCRT (vc_mt variant), and throws
an exception from a functor passed to task_group::run_and_wait(),
- the exception will not be intercepted by TBB and will not result
+ the exception will not be intercepted by Intel TBB and will not result
in cancellation of the task_group. For a workaround, catch the
exception in the functor and explicitly cancel the task_group.
+ - If an application uses debug version of Intel TBB DLL built with static
+ MSVCRT (vc_mt variant), Microsoft* Visual C++ debug library 10.0
+ (msvcp100d.dll) is required to be available on the system to run
+ an application.
+
- If you are using Intel(R) Threading Building Blocks and OpenMP*
constructs mixed together in rapid succession in the same
program, and you are using Intel(R) compilers for your OpenMP*
@@ -111,16 +127,27 @@ Library Issues
examples should link against the non-debug versions of the
Intel(R) Threading Building Blocks libraries, and debug builds
should link against the debug versions of these libraries. On
- Windows* systems, compile with /MD and use Intel(R) Threading
+ Windows* OS, compile with /MD and use Intel(R) Threading
Building Blocks release libraries, or compile with /MDd and use
debug libraries; not doing so may cause run-time failures. See
the Tutorial in the product "doc" sub-directory for more details
on debug vs. release libraries.
+ - If open source verion installed to the system folders like /usr/lib64
+ on Linux OS examples may fail to link because sometimes gcc
+ searches for folders in the different order than expected.
+ -L command line linker option needs to be used to set the right
+ location. This does not affect a program execution.
+
------------------------------------------------------------------------
-Copyright (C) 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright (C) 2005-2013 Intel Corporation. All Rights Reserved.
Intel, Xeon and Pentium are registered trademarks or trademarks of
Intel Corporation or its subsidiaries in the United States and other countries.
* Other names and brands may be claimed as the property of others.
+
+Third Party and Open Source Licenses
+
+Content of some examples or binaries may be covered by various open-source
+licenses. See the index.html file in each respective folder for details.
diff --git a/doc/html/a00005.html b/doc/html/a00005.html
index 13dede1..37d9a17 100644
--- a/doc/html/a00005.html
+++ b/doc/html/a00005.html
@@ -20,13 +20,13 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface6::aggregator_ext< handler_type > Member List</h1>This is the complete list of members for <a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>aggregator_ext</b>(const handler_type &h) (defined in <a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a>)</td><td><a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00252.html#fdd0a9ce522246b9e14ae5e44bc72d31">execute_impl</a>(aggregator_operation &op)</td><td><a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00252.html#ccd88bf4333dc100ba97da8e2170277d">process</a>(aggregator_operation *op)</td><td><a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::aggregator_ext< handler_type > Member List</h1>This is the complete list of members for <a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>aggregator_ext</b>(const handler_type &h) (defined in <a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a>)</td><td><a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00264.html#fdd0a9ce522246b9e14ae5e44bc72d31">execute_impl</a>(aggregator_operation &op)</td><td><a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00264.html#ccd88bf4333dc100ba97da8e2170277d">process</a>(aggregator_operation *op)</td><td><a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00006.html b/doc/html/a00006.html
index 48d1954..3bf41fe 100644
--- a/doc/html/a00006.html
+++ b/doc/html/a00006.html
@@ -20,15 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface6::aggregator Member List</h1>This is the complete list of members for <a class="el" href="a00251.html">tbb::interface6::aggregator</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>aggregator</b>() (defined in <a class="el" href="a00251.html">tbb::interface6::aggregator</a>)</td><td><a class="el" href="a00251.html">tbb::interface6::aggregator</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>aggregator_ext</b>(const handler_type &h) (defined in <a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a>)</td><td><a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline, private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00251.html#641c8dc43652589d12eefaef130c094d">execute</a>(const Body &b)</td><td><a class="el" href="a00251.html">tbb::interface6::aggregator</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00252.html#fdd0a9ce522246b9e14ae5e44bc72d31">execute_impl</a>(aggregator_operation &op)</td><td><a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline, private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00252.html#ccd88bf4333dc100ba97da8e2170277d">process</a>(aggregator_operation *op)</td><td><a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline, private]</code></td></tr>
+<h1>tbb::interface6::aggregator Member List</h1>This is the complete list of members for <a class="el" href="a00263.html">tbb::interface6::aggregator</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>aggregator</b>() (defined in <a class="el" href="a00263.html">tbb::interface6::aggregator</a>)</td><td><a class="el" href="a00263.html">tbb::interface6::aggregator</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>aggregator_ext</b>(const handler_type &h) (defined in <a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a>)</td><td><a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline, private]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00263.html#641c8dc43652589d12eefaef130c094d">execute</a>(const Body &b)</td><td><a class="el" href="a00263.html">tbb::interface6::aggregator</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00264.html#fdd0a9ce522246b9e14ae5e44bc72d31">execute_impl</a>(aggregator_operation &op)</td><td><a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline, private]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00264.html#ccd88bf4333dc100ba97da8e2170277d">process</a>(aggregator_operation *op)</td><td><a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td><code> [inline, private]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00007.html b/doc/html/a00007.html
index 8834756..bab4862 100644
--- a/doc/html/a00007.html
+++ b/doc/html/a00007.html
@@ -20,12 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::aligned_space< T, N > Member List</h1>This is the complete list of members for <a class="el" href="a00253.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00253.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00253.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00253.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::aligned_space< T, N > Member List</h1>This is the complete list of members for <a class="el" href="a00265.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00265.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00265.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00265.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00265.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00008.html b/doc/html/a00008.html
index 318ca84..4e9a243 100644
--- a/doc/html/a00008.html
+++ b/doc/html/a00008.html
@@ -20,12 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00254.html">tbb::atomic< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(T rhs) (defined in <a class="el" href="a00254.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00254.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< T > &rhs) (defined in <a class="el" href="a00254.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00254.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00266.html">tbb::atomic< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>atomic</b>() (defined in <a class="el" href="a00266.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00266.html">tbb::atomic< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>atomic</b>(T arg) (defined in <a class="el" href="a00266.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00266.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(T rhs) (defined in <a class="el" href="a00266.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00266.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< T > &rhs) (defined in <a class="el" href="a00266.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00266.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00009.html b/doc/html/a00009.html
index 823bc54..f30f548 100644
--- a/doc/html/a00009.html
+++ b/doc/html/a00009.html
@@ -20,12 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::atomic< void * > Member List</h1>This is the complete list of members for <a class="el" href="a00255.html">tbb::atomic< void * ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(void *rhs) (defined in <a class="el" href="a00255.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00255.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< void * > &rhs) (defined in <a class="el" href="a00255.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00255.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::atomic< void * > Member List</h1>This is the complete list of members for <a class="el" href="a00267.html">tbb::atomic< void * ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>atomic</b>() (defined in <a class="el" href="a00267.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00267.html">tbb::atomic< void * ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>atomic</b>(void *arg) (defined in <a class="el" href="a00267.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00267.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(void *rhs) (defined in <a class="el" href="a00267.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00267.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< void * > &rhs) (defined in <a class="el" href="a00267.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00267.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00010.html b/doc/html/a00010.html
index 7a86408..bbf5dff 100644
--- a/doc/html/a00010.html
+++ b/doc/html/a00010.html
@@ -20,23 +20,23 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00259.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00259.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b> (defined in <a class="el" href="a00259.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b> (defined in <a class="el" href="a00259.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+<h1>tbb::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00271.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00271.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b> (defined in <a class="el" href="a00271.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b> (defined in <a class="el" href="a00271.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00011.html b/doc/html/a00011.html
index c3a6787..5068a0c 100644
--- a/doc/html/a00011.html
+++ b/doc/html/a00011.html
@@ -20,19 +20,19 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::blocked_range2d< RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(blocked_range2d &r, split) (defined in <a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00260.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00260.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00260.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00260.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00260.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::blocked_range2d< RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(blocked_range2d &r, split) (defined in <a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00272.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00272.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00272.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00272.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00272.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00012.html b/doc/html/a00012.html
index 0599205..71e4fd6 100644
--- a/doc/html/a00012.html
+++ b/doc/html/a00012.html
@@ -20,21 +20,21 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00261.html">tbb::blocked_range3d [...]
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00261.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00261.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00261.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00261.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00261.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>row_range_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00261.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00273.html">tbb::blocked_range3d [...]
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>row_range_type</b> typedef (defined in <a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00013.html b/doc/html/a00013.html
index abb30bd..aa8310f 100644
--- a/doc/html/a00013.html
+++ b/doc/html/a00013.html
@@ -20,26 +20,26 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00264.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>() (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator &) (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator< U > &) (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00264.html#48a7e49dfb0578edc84a90a5ac30793d">construct</a>(pointer p, Args &&...args)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00264.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00264.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+<h1>tbb::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00276.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>() (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator &) (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator< U > &) (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00276.html#273d07524d386efc1366bf37af5f91f4">construct</a>(U *p, Args &&...args)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00276.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00276.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00015.html b/doc/html/a00015.html
index e20af72..352b5b6 100644
--- a/doc/html/a00015.html
+++ b/doc/html/a00015.html
@@ -20,13 +20,13 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::cache_aligned_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+<h1>tbb::cache_aligned_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00017.html b/doc/html/a00017.html
index 40f9017..b7914f7 100644
--- a/doc/html/a00017.html
+++ b/doc/html/a00017.html
@@ -20,20 +20,20 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::combinable< T > Member List</h1>This is the complete list of members for <a class="el" href="a00267.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00267.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combinable</b>() (defined in <a class="el" href="a00267.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combinable</b>(finit _finit) (defined in <a class="el" href="a00267.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combinable</b>(const combinable &other) (defined in <a class="el" href="a00267.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00267.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00267.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>local</b>() (defined in <a class="el" href="a00267.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>local</b>(bool &exists) (defined in <a class="el" href="a00267.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const combinable &other) (defined in <a class="el" href="a00267.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00267.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::combinable< T > Member List</h1>This is the complete list of members for <a class="el" href="a00279.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00279.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combinable</b>() (defined in <a class="el" href="a00279.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combinable</b>(finit _finit) (defined in <a class="el" href="a00279.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combinable</b>(const combinable &other) (defined in <a class="el" href="a00279.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00279.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00279.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>local</b>() (defined in <a class="el" href="a00279.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>local</b>(bool &exists) (defined in <a class="el" href="a00279.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const combinable &other) (defined in <a class="el" href="a00279.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00279.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00018.html b/doc/html/a00018.html
index c0fcf95..61850f9 100644
--- a/doc/html/a00018.html
+++ b/doc/html/a00018.html
@@ -20,12 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::tbb_hash_compare< Key > Member List</h1>This is the complete list of members for <a class="el" href="a00347.html">tbb::tbb_hash_compare< Key ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>equal</b>(const Key &a, const Key &b) (defined in <a class="el" href="a00347.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00347.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>hash</b>(const Key &a) (defined in <a class="el" href="a00347.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00347.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::tbb_hash_compare< Key > Member List</h1>This is the complete list of members for <a class="el" href="a00360.html">tbb::tbb_hash_compare< Key ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>equal</b>(const Key &a, const Key &b) (defined in <a class="el" href="a00360.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00360.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>hash</b>(const Key &a) (defined in <a class="el" href="a00360.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00360.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00019.html b/doc/html/a00019.html
index 9e12c85..dc39482 100644
--- a/doc/html/a00019.html
+++ b/doc/html/a00019.html
@@ -20,73 +20,73 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>begin</b>() const (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a>() const </td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#220686fe17b197eedf19dd856cd02e36">clear</a>()</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_accessor</b> (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#6968eb6feed2df36be421df0464297af">count</a>(const Key &key) const </td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>delete_node</b>(node_base *n) (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a>() const </td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>end</b>() const (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) const (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a>(const Key &key)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#5f12d150d421420965db07368666a84f">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#0c964214eb38f54603aa75fdff6d2709">exclude</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#2afcc33dade7bb24e008d60c0df38230">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a>() const </td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#47fe0e60151a9bd7a444db827772a4e6">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#54e0955ecd11575b4c07166838a72893">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#39183d78d6e8425917555ab542ab92de">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#3f121a316af8135de476a30fae6d7c07">insert</a>(const value_type &value)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a>(I first, I last)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_iterator</b> (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_range</b> (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_copy</b>(I first, I last) (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>key_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#3f3413264a99174a224ef96f6c4ea769">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>mapped_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a>() const </td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_allocator</b> (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_hash_compare</b> (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>node_allocator_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#088d1aaccc816884a49e38f7065622c8">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) const (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#94758113d8993cfe5afdf2d63a728869">rehash</a>(size_type n=0)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rehash_bucket</b>(bucket *b_new, const hashcode_t h) (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>search_bucket</b>(const key_type &key, bucket *b) const (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a>() const </td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#076f8d9e16110aac5f558777aa744eb6">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a>()</td><td><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>begin</b>() const (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a>() const </td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#220686fe17b197eedf19dd856cd02e36">clear</a>()</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_accessor</b> (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#6968eb6feed2df36be421df0464297af">count</a>(const Key &key) const </td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>delete_node</b>(node_base *n) (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a>() const </td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>end</b>() const (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) const (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a>(const Key &key)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#5f12d150d421420965db07368666a84f">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#0c964214eb38f54603aa75fdff6d2709">exclude</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#2afcc33dade7bb24e008d60c0df38230">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a>() const </td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#47fe0e60151a9bd7a444db827772a4e6">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#54e0955ecd11575b4c07166838a72893">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#39183d78d6e8425917555ab542ab92de">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#3f121a316af8135de476a30fae6d7c07">insert</a>(const value_type &value)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a>(I first, I last)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_iterator</b> (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_range</b> (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_copy</b>(I first, I last) (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>key_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#3f3413264a99174a224ef96f6c4ea769">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>mapped_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a>() const </td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_allocator</b> (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_hash_compare</b> (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>node_allocator_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#088d1aaccc816884a49e38f7065622c8">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) const (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#94758113d8993cfe5afdf2d63a728869">rehash</a>(size_type n=0)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rehash_bucket</b>(bucket *b_new, const hashcode_t h) (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>search_bucket</b>(const key_type &key, bucket *b) const (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a>() const </td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#076f8d9e16110aac5f558777aa744eb6">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00281.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a>()</td><td><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00021.html b/doc/html/a00021.html
index 912ea6f..60f6d95 100644
--- a/doc/html/a00021.html
+++ b/doc/html/a00021.html
@@ -20,14 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00271.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00271.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00271.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>bucket_accessor</b>(concurrent_hash_map *base, const hashcode_t h, bool writer=false) (defined in <a class="el" href="a00271.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00271.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00271.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>()</td><td><a class="el" href="a00271.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00271.html#fa6314b861c574f86ed189b124cf5853">operator()</a>()</td><td><a class="el" href="a00271.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00283.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00283.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00283.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>bucket_accessor</b>(concurrent_hash_map *base, const hashcode_t h, bool writer=false) (defined in <a class="el" href="a00283.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00283.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00283.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>()</td><td><a class="el" href="a00283.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00283.html#fa6314b861c574f86ed189b124cf5853">operator()</a>()</td><td><a class="el" href="a00283.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00022.html b/doc/html/a00022.html
index 21504d7..b813ee1 100644
--- a/doc/html/a00022.html
+++ b/doc/html/a00022.html
@@ -20,22 +20,22 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>accessor</b> (defined in <a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b> (defined in <a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_writer</b>() (defined in <a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_hash</b> (defined in <a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_node</b> (defined in <a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a>() const </td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a>() const </td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#a8e50238483ba451363dccebd981d346">value_type</a> typedef</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>accessor</b> (defined in <a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b> (defined in <a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_writer</b>() (defined in <a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_hash</b> (defined in <a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_node</b> (defined in <a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a>() const </td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a>() const </td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#a8e50238483ba451363dccebd981d346">value_type</a> typedef</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00023.html b/doc/html/a00023.html
index dc39faf..e91490e 100644
--- a/doc/html/a00023.html
+++ b/doc/html/a00023.html
@@ -20,20 +20,20 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00270.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00272.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_writer</b>() (defined in <a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_hash</b> (defined in <a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_node</b> (defined in <a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00270.html#170280ea807a22e742095de3e8c5ea38">operator *</a>() const </td><td><a class="el" href="a00270.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00270.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a>() const </td><td><a class="el" href="a00270.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00270.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a> typedef</td><td><a class="el" href="a00270.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00282.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00284.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_writer</b>() (defined in <a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_hash</b> (defined in <a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_node</b> (defined in <a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00282.html#170280ea807a22e742095de3e8c5ea38">operator *</a>() const </td><td><a class="el" href="a00282.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00282.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a>() const </td><td><a class="el" href="a00282.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00282.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a> typedef</td><td><a class="el" href="a00282.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00031.html b/doc/html/a00031.html
index a7971f4..4a18eaf 100644
--- a/doc/html/a00031.html
+++ b/doc/html/a00031.html
@@ -20,29 +20,29 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::concurrent_priority_queue< T, Compare, A > Member List</h1>This is the complete list of members for <a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> typedef</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>()</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a>(size_type init_capacity, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#c8b20e7430c5302936030bef59a562be">concurrent_priority_queue</a>(const concurrent_priority_queue &src, const allocator_type &a)</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> typedef</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a> typedef</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#317c508fa92df218be5d014c26c09bb7">empty</a>() const </td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>() const </td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#d905af7b8f6defff562f5ae9c3275763">push</a>(const_reference elem)</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> typedef</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>() const </td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> typedef</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(concurrent_priority_queue &q)</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(reference elem)</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> typedef</td><td><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+<h1>tbb::interface5::concurrent_priority_queue< T, Compare, A > Member List</h1>This is the complete list of members for <a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> typedef</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>()</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a>(size_type init_capacity, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#c8b20e7430c5302936030bef59a562be">concurrent_priority_queue</a>(const concurrent_priority_queue &src, const allocator_type &a)</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> typedef</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a> typedef</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#317c508fa92df218be5d014c26c09bb7">empty</a>() const </td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>() const </td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#d905af7b8f6defff562f5ae9c3275763">push</a>(const_reference elem)</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> typedef</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>() const </td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> typedef</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(concurrent_priority_queue &q)</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(reference elem)</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00285.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> typedef</td><td><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00035.html b/doc/html/a00035.html
index bead577..1b9c1ce 100644
--- a/doc/html/a00035.html
+++ b/doc/html/a00035.html
@@ -20,33 +20,33 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::strict_ppl::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::strict_ppl::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00036.html b/doc/html/a00036.html
index 3df8f83..bef22a9 100644
--- a/doc/html/a00036.html
+++ b/doc/html/a00036.html
@@ -20,38 +20,38 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00268.html#86c77a6c1317239405968f5afc7b10d3">abort</a>()</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::concurrent_bounded_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00280.html#86c77a6c1317239405968f5afc7b10d3">abort</a>()</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00038.html b/doc/html/a00038.html
index 1664dba..ade218f 100644
--- a/doc/html/a00038.html
+++ b/doc/html/a00038.html
@@ -20,47 +20,47 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::deprecated::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00268.html#86c77a6c1317239405968f5afc7b10d3">abort</a>()</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>begin</b>() const (defined in <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00275.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00275.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00275.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a>(InputIterator b, InputIterator e, const A &a=A())</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>end</b>() const (defined in <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00275.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00275.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::deprecated::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00280.html#86c77a6c1317239405968f5afc7b10d3">abort</a>()</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>begin</b>() const (defined in <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a>(InputIterator b, InputIterator e, const A &a=A())</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>end</b>() const (defined in <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00280.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00044.html b/doc/html/a00044.html
deleted file mode 100644
index b5a85c5..0000000
--- a/doc/html/a00044.html
+++ /dev/null
@@ -1,102 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::concurrent_vector< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::vector_iterator</b> (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_vector_base</b>() const (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00276.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00046.html b/doc/html/a00046.html
new file mode 100644
index 0000000..7d6a2c3
--- /dev/null
+++ b/doc/html/a00046.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class Members</span></a></li>
+ </ul></div>
+<h1>tbb::concurrent_vector< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#c04d64fe86696a084afa117d34384b5f">assign</a>(std::initializer_list< T > init_list)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#4b4937fc82ba4c8245a87a079476d80a">concurrent_vector</a>(std::initializer_list< T > init_list, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::vector_iterator</b> (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_vector_base</b>() const (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#85cc876b1dec457b831b4745be274be1">operator=</a>(const std::initializer_list< T > &init_list)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00049.html b/doc/html/a00051.html
similarity index 64%
rename from doc/html/a00049.html
rename to doc/html/a00051.html
index 0ca50e2..d8c26ad 100644
--- a/doc/html/a00049.html
+++ b/doc/html/a00051.html
@@ -20,44 +20,44 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Member List</h1>This is the complete list of members for <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00281.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a> typedef</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#01d7baf8e913ab2819e97917a2ac795f">begin</a>()</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#84afb3906a39e399cde1c950d6351300">begin</a>() const </td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#a8764176d4b6014c5d65f1051851abc8">clear</a>()</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#72595886d0ac8fd0543f90038570510d">empty</a>() const </td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#2456ff88252fc921b01cd8907628a4ee">end</a>()</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#cb448bb4977ce366ceb7344085cc7050">end</a>() const </td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b> (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a>()</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a>(Finit finit)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a>(const T &exemplar)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a>()</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#7dc79058d2832f7447de8e691c3455ea">local</a>(bool &exists)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#b22c54990b2362cd93c1a8f73de140bc">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#33fd6593da1ed14340f10f67d5a69130">size</a>() const </td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00281.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Member List</h1>This is the complete list of members for <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00293.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a> typedef</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#01d7baf8e913ab2819e97917a2ac795f">begin</a>()</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#84afb3906a39e399cde1c950d6351300">begin</a>() const </td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#a8764176d4b6014c5d65f1051851abc8">clear</a>()</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#72595886d0ac8fd0543f90038570510d">empty</a>() const </td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#2456ff88252fc921b01cd8907628a4ee">end</a>()</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#cb448bb4977ce366ceb7344085cc7050">end</a>() const </td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b> (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a>()</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a>(Finit finit)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a>(const T &exemplar)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a>()</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#7dc79058d2832f7447de8e691c3455ea">local</a>(bool &exists)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#b22c54990b2362cd93c1a8f73de140bc">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#33fd6593da1ed14340f10f67d5a69130">size</a>() const </td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00053.html b/doc/html/a00053.html
deleted file mode 100644
index 09bc581..0000000
--- a/doc/html/a00053.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::flow::interface6::sender< T > Member List</h1>This is the complete list of members for <a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00327.html#127af99916cc085cd9dbc09c53299928">output_type</a> typedef</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> typedef</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00054.html b/doc/html/a00054.html
deleted file mode 100644
index bf62763..0000000
--- a/doc/html/a00054.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::flow::interface6::receiver< T > Member List</h1>This is the complete list of members for <a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00321.html#0d0524c99313dedea1e04464bbf2f7ef">input_type</a> typedef</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#7fa8cff811e7c1589b805a4bb4c7a74f">predecessor_type</a> typedef</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#c6d5d0cb8ebe5771be91933609fe31b8">try_put</a>(const T &t)=0</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00055.html b/doc/html/a00055.html
index 038a1d1..1e2b32f 100644
--- a/doc/html/a00055.html
+++ b/doc/html/a00055.html
@@ -20,27 +20,19 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::continue_receiver Member List</h1>This is the complete list of members for <a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00279.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>(int number_of_predecessors=0)</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#a0b292ed7fa6556b2a735f6d1e82dc74">continue_receiver</a>(const continue_receiver &src)</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a>()=0</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected, pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#3c43c166af832d9187035985841e0a7f">input_type</a> typedef</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_current_count</b> (defined in <a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_initial_predecessor_count</b> (defined in <a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_predecessor_count</b> (defined in <a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#f9c58b3e9c46afd2518d0fd8957a5a2f">predecessor_type</a> typedef</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#3969c70fb89c0a982f142ae9eb5facae">try_put</a>(const input_type &)</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#c6d5d0cb8ebe5771be91933609fe31b8">tbb::flow::interface6::receiver::try_put</a>(const T &t)=0</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a>()</td><td><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::sender< T > Member List</h1>This is the complete list of members for <a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00339.html#127af99916cc085cd9dbc09c53299928">output_type</a> typedef</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> typedef</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00056.html b/doc/html/a00056.html
new file mode 100644
index 0000000..2f80023
--- /dev/null
+++ b/doc/html/a00056.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class Members</span></a></li>
+ </ul></div>
+<h1>tbb::flow::interface6::receiver< T > Member List</h1>This is the complete list of members for <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00333.html#0d0524c99313dedea1e04464bbf2f7ef">input_type</a> typedef</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::successor_cache</b> (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_continue_receiver</b>() (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">limiter_node</a> class</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#7fa8cff811e7c1589b805a4bb4c7a74f">predecessor_type</a> typedef</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset_receiver</b>()=0 (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [protected, pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a> class</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a>(const T &t)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>try_put_task</b>(const T &t)=0 (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [protected, pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00057.html b/doc/html/a00057.html
index 477218c..85ffbe9 100644
--- a/doc/html/a00057.html
+++ b/doc/html/a00057.html
@@ -20,31 +20,35 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::graph Member List</h1>This is the complete list of members for <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00288.html#b028cb585ec21e5de523d0075d0fa880">begin</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#f63c3b7d03098b57fc16b71c57b303e5">begin</a>() const </td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#e183dfc3f89dc8f57c06ba165fb89f66">cbegin</a>() const </td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#4866156e6a31d0399b61c6eb82ee81fd">cend</a>() const </td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#a167c62511ddacaa152daa64ab2d6aac">end</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#907bd06606818c36f52420fe8d469d35">end</a>() const </td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>exception_thrown</b>() (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#104d4f3775f596b43177c29e6b7b7656">graph</a>(task_group_context &use_this_context)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline, explicit]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_iterator</b> (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b> (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#227ea140dc2c68f79a4e5a34a8367b58">is_cancelled</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#50a7938df01b6148ab2c0696835f002e">run</a>(Receiver &r, Body body)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#c1145b00e063793a7e7bf994d202c7a0">run</a>(Body body)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::flow::interface6::continue_receiver Member List</h1>This is the complete list of members for <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00291.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>(int number_of_predecessors=0)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#a0b292ed7fa6556b2a735f6d1e82dc74">continue_receiver</a>(const continue_receiver &src)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#2165b726212975be532cff7b2f001834">execute</a>()=0</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected, pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#3c43c166af832d9187035985841e0a7f">input_type</a> typedef</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::successor_cache</b> (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_continue_receiver</b>() (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#3b6d13039c2a8c1e369e5790895b0088">limiter_node</a> class</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_current_count</b> (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_initial_predecessor_count</b> (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_predecessor_count</b> (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#f9c58b3e9c46afd2518d0fd8957a5a2f">predecessor_type</a> typedef</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset_receiver</b>() (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a> class</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a>(const T &t)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>try_put_task</b>(const input_type &) (defined in <a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>try_put_task</b>(const T &t)=0 (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [protected, pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a>()</td><td><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00057.html b/doc/html/a00059.html
similarity index 54%
copy from doc/html/a00057.html
copy to doc/html/a00059.html
index 477218c..f174d6e 100644
--- a/doc/html/a00057.html
+++ b/doc/html/a00059.html
@@ -20,31 +20,32 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::graph Member List</h1>This is the complete list of members for <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00288.html#b028cb585ec21e5de523d0075d0fa880">begin</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#f63c3b7d03098b57fc16b71c57b303e5">begin</a>() const </td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#e183dfc3f89dc8f57c06ba165fb89f66">cbegin</a>() const </td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#4866156e6a31d0399b61c6eb82ee81fd">cend</a>() const </td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#a167c62511ddacaa152daa64ab2d6aac">end</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#907bd06606818c36f52420fe8d469d35">end</a>() const </td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>exception_thrown</b>() (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#104d4f3775f596b43177c29e6b7b7656">graph</a>(task_group_context &use_this_context)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline, explicit]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_iterator</b> (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b> (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#227ea140dc2c68f79a4e5a34a8367b58">is_cancelled</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00288.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#50a7938df01b6148ab2c0696835f002e">run</a>(Receiver &r, Body body)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#c1145b00e063793a7e7bf994d202c7a0">run</a>(Body body)</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a>()</td><td><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::flow::interface6::graph Member List</h1>This is the complete list of members for <a class="el" href="a00300.html">tbb::flow::interface6::graph</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00300.html#b028cb585ec21e5de523d0075d0fa880">begin</a>()</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#f63c3b7d03098b57fc16b71c57b303e5">begin</a>() const </td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#e183dfc3f89dc8f57c06ba165fb89f66">cbegin</a>() const </td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#4866156e6a31d0399b61c6eb82ee81fd">cend</a>() const </td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00300.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a>()</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#a167c62511ddacaa152daa64ab2d6aac">end</a>()</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#907bd06606818c36f52420fe8d469d35">end</a>() const </td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>exception_thrown</b>() (defined in <a class="el" href="a00300.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>()</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#104d4f3775f596b43177c29e6b7b7656">graph</a>(task_group_context &use_this_context)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_iterator</b> (defined in <a class="el" href="a00300.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b> (defined in <a class="el" href="a00300.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a>()</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#227ea140dc2c68f79a4e5a34a8367b58">is_cancelled</a>()</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00300.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00300.html">tbb::flow::interface6::graph</a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a>()</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#50a7938df01b6148ab2c0696835f002e">run</a>(Receiver &r, Body body)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#c1145b00e063793a7e7bf994d202c7a0">run</a>(Body body)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>()</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00300.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a>()</td><td><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00060.html b/doc/html/a00060.html
deleted file mode 100644
index c21afe8..0000000
--- a/doc/html/a00060.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::flow::interface6::graph_node Member List</h1>This is the complete list of members for <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_iterator</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00061.html b/doc/html/a00061.html
deleted file mode 100644
index 8f133ba..0000000
--- a/doc/html/a00061.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::flow::interface6::source_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00330.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a>()</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::source_task< source_node< output_type > ></b> (defined in <a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a>)</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a> typedef</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#222484bf295f39df36415a29e508e5c9">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>(graph &g, Body body, bool is_active=true)</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#adaac111fbcace95804219a5f2929304">source_node</a>(const source_node &src)</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">successor_type</a> typedef</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>()</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a>(output_type &v)</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#494678baf9096835268736b800824460">try_release</a>()</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>(output_type &v)</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00327.html">tbb::flow::interface6::sender< Output ></a>)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00330.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a>()</td><td><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00062.html b/doc/html/a00062.html
index f872024..9b8a3c2 100644
--- a/doc/html/a00062.html
+++ b/doc/html/a00062.html
@@ -20,25 +20,18 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::function_node< Input, Output,, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>fInput_type</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00286.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00286.html#d5132323fd2ac6a00ea0c78beda78723">function_node</a>(const function_node &src)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_put</b>(const input_type &i) (defined in <a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::graph_node Member List</h1>This is the complete list of members for <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_iterator</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>()=0 (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected, pure virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00063.html b/doc/html/a00063.html
index 6454e71..4bd919e 100644
--- a/doc/html/a00063.html
+++ b/doc/html/a00063.html
@@ -20,26 +20,31 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>fInput_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00287.html#5b9019c1e6e9b2c41c986a384bd179db">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00287.html#01055081ed477714503820035db3a965">function_node</a>(const function_node &src)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>queue_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_put</b>(const input_type &i) (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::source_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00342.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a>()</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>copy_function_object</b>() (defined in <a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a>)</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::source_task_bypass< source_node< output_type > ></b> (defined in <a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a>)</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#407533487cc3f6032c1072cba19c609c">output_type</a> typedef</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#222484bf295f39df36415a29e508e5c9">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#d751cdda02bdaa1dc90c4d9609c05df2">reset</a>()</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>(graph &g, Body body, bool is_active=true)</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#adaac111fbcace95804219a5f2929304">source_node</a>(const source_node &src)</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">successor_type</a> typedef</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>()</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a>(output_type &v)</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#494678baf9096835268736b800824460">try_release</a>()</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>(output_type &v)</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00339.html">tbb::flow::interface6::sender< Output ></a>)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00342.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a>()</td><td><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00064.html b/doc/html/a00064.html
index 8e76336..091c2bb 100644
--- a/doc/html/a00064.html
+++ b/doc/html/a00064.html
@@ -20,19 +20,28 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::multifunction_node< Input, Output,, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>multifunction_node</b>(graph &g, size_t concurrency, Body body) (defined in <a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>multifunction_node</b>(const multifunction_node &other) (defined in <a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_ports_type</b> typedef (defined in <a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::function_node< Input, Output,, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>fInput_type</b> typedef (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#d5132323fd2ac6a00ea0c78beda78723">function_node</a>(const function_node &src)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>run_and_put_task</b> (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00063.html b/doc/html/a00065.html
similarity index 54%
copy from doc/html/a00063.html
copy to doc/html/a00065.html
index 6454e71..26abe45 100644
--- a/doc/html/a00063.html
+++ b/doc/html/a00065.html
@@ -20,26 +20,29 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>fInput_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00287.html#5b9019c1e6e9b2c41c986a384bd179db">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00287.html#01055081ed477714503820035db3a965">function_node</a>(const function_node &src)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>queue_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_put</b>(const input_type &i) (defined in <a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>fInput_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00299.html#5b9019c1e6e9b2c41c986a384bd179db">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00299.html#01055081ed477714503820035db3a965">function_node</a>(const function_node &src)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>queue_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>run_and_put_task</b> (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00066.html b/doc/html/a00066.html
index ff77f55..af80d6f 100644
--- a/doc/html/a00066.html
+++ b/doc/html/a00066.html
@@ -20,22 +20,20 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::split_node< TupleType, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>multifunction_node</b>(graph &g, size_t concurrency, Body body) (defined in <a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>multifunction_node</b>(const multifunction_node &other) (defined in <a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a>)</td><td><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_ports_type</b> typedef (defined in <a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>split_node</b>(graph &g) (defined in <a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>split_node</b>(const split_node &other) (defined in <a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::multifunction_node< Input, Output,, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>multifunction_node</b>(graph &g, size_t concurrency, Body body) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>multifunction_node</b>(const multifunction_node &other) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>output_ports_type</b> typedef (defined in <a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00068.html b/doc/html/a00068.html
index bc68351..b82c75d 100644
--- a/doc/html/a00068.html
+++ b/doc/html/a00068.html
@@ -20,25 +20,23 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::continue_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00278.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>(graph &g, Body body)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00278.html#7817aebf22dd125ca04df53ac488d163">continue_node</a>(graph &g, int number_of_predecessors, Body body)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00278.html#869562787fcb5c57a90aea120f26d492">continue_node</a>(const continue_node &src)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_put</b>(const input_type &i) (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::split_node< TupleType, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>multifunction_node</b>(graph &g, size_t concurrency, Body body) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>multifunction_node</b>(const multifunction_node &other) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>output_ports_type</b> typedef (defined in <a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>split_node</b>(graph &g) (defined in <a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>split_node</b>(const split_node &other) (defined in <a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00068.html b/doc/html/a00070.html
similarity index 50%
copy from doc/html/a00068.html
copy to doc/html/a00070.html
index bc68351..4b82d66 100644
--- a/doc/html/a00068.html
+++ b/doc/html/a00070.html
@@ -20,25 +20,29 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::continue_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00278.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>(graph &g, Body body)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00278.html#7817aebf22dd125ca04df53ac488d163">continue_node</a>(graph &g, int number_of_predecessors, Body body)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00278.html#869562787fcb5c57a90aea120f26d492">continue_node</a>(const continue_node &src)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_put</b>(const input_type &i) (defined in <a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::continue_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00290.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>(graph &g, Body body)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00290.html#7817aebf22dd125ca04df53ac488d163">continue_node</a>(graph &g, int number_of_predecessors, Body body)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00290.html#869562787fcb5c57a90aea120f26d492">continue_node</a>(const continue_node &src)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>fInput_type</b> typedef (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>run_and_put_task</b> (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00071.html b/doc/html/a00071.html
deleted file mode 100644
index 4a960d6..0000000
--- a/doc/html/a00071.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::flow::interface6::broadcast_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>broadcast_node</b>(graph &g) (defined in <a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>broadcast_node</b>(const broadcast_node &src) (defined in <a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00262.html#43c775d80e98cc601de69764983319f9">input_type</a> typedef</td><td><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00262.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a> typedef</td><td><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00262.html#0e2ad9a121cb286aa0d0142fef33c646">predecessor_type</a> typedef</td><td><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00262.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00262.html#366efcc046ec08a104281109801ae629">remove_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00262.html#cc6a0eb1c4ee65465770628d8366f055">successor_type</a> typedef</td><td><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00262.html#29eb768c10b377880bbf83d31ee49acf">try_put</a>(const T &t)</td><td><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00072.html b/doc/html/a00072.html
deleted file mode 100644
index 1fe10f4..0000000
--- a/doc/html/a00072.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::flow::interface6::buffer_node< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00263.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a> typedef</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T, A > ></b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(buffer_operation *op) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a>(buffer_operation *op)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(buffer_operation *op) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(buffer_operation *op) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(buffer_operation *op) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> typedef</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#5fb0ad03a822ca0fc34ad5d56a4093a2">predecessor_type</a> typedef</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a> typedef</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00073.html b/doc/html/a00073.html
new file mode 100644
index 0000000..1d46b3c
--- /dev/null
+++ b/doc/html/a00073.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class Members</span></a></li>
+ </ul></div>
+<h1>tbb::flow::interface6::broadcast_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>broadcast_node</b>(graph &g) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>broadcast_node</b>(const broadcast_node &src) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00274.html#43c775d80e98cc601de69764983319f9">input_type</a> typedef</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::successor_cache</b> (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_continue_receiver</b>() (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">limiter_node</a> class</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00274.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a> typedef</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00274.html#0e2ad9a121cb286aa0d0142fef33c646">predecessor_type</a> typedef</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00274.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00274.html#366efcc046ec08a104281109801ae629">remove_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset_receiver</b>() (defined in <a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00274.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a> class</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00274.html#cc6a0eb1c4ee65465770628d8366f055">successor_type</a> typedef</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a>(const T &t)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00274.html#b4804d99e0fb0576f1061ab7269e5939">try_put_task</a>(const T &t)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00074.html b/doc/html/a00074.html
index 89f85fc..8a156b9 100644
--- a/doc/html/a00074.html
+++ b/doc/html/a00074.html
@@ -20,68 +20,76 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::queue_node< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00263.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a> typedef</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T, A > ></b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(queue_operation *op) (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(queue_operation *op) (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(buffer_operation *op) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(queue_operation *op) (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a> typedef</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#5e2fdd33c45d44549dee9c1638e19898">predecessor_type</a> typedef</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>(graph &g)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a>(const queue_node &src)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#f35076a19f256f9e7a61bed77ca1ccc5">successor_type</a> typedef</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::buffer_node< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00275.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enqueue_forwarding_task</b>(buffer_operation &op_data) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#8954338d1a7740f9be80455ba27e8eed">forward_task</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>grab_forwarding_task</b>(buffer_operation &op_data) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a> typedef</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::forward_task_bypass< buffer_node< T, A > ></b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::successor_cache</b> (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(buffer_operation *op) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#bc6ef82fe9c28ace2ef6b78abb43ffb8">internal_forward_task</a>(buffer_operation *op)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(buffer_operation *op) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(buffer_operation *op) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(buffer_operation *op) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_continue_receiver</b>() (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">limiter_node</a> class</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> typedef</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#5fb0ad03a822ca0fc34ad5d56a4093a2">predecessor_type</a> typedef</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset_receiver</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a> class</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a> typedef</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>try_fwd_task</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a>(const T &t)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#84d939049fa8c3205aec91ced0980e03">try_put_task</a>(const T &t)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00075.html b/doc/html/a00075.html
deleted file mode 100644
index 6bf48b6..0000000
--- a/doc/html/a00075.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::flow::interface6::sequencer_node< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00263.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00328.html#af629f26832ff4e476e240637a78bc0c">input_type</a> typedef</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T, A > ></b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(queue_operation *op) (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(queue_operation *op) (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(queue_operation *op) (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00328.html#ca026eaef70e35791c407323199031a7">output_type</a> typedef</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00328.html#8127e36811832563fe1e9bc3ba391f79">predecessor_type</a> typedef</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>(graph &g)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00313.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a>(const queue_node &src)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00328.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>(graph &g, const Sequencer &s)</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00328.html#b38e7a070552960384bcc1d91af13a5c">sequencer_node</a>(const sequencer_node &src)</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>sequencer_operation</b> typedef (defined in <a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00328.html#795f3ee75f133b9d3b159172fc4a197f">successor_type</a> typedef</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00328.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a>()</td><td><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00076.html b/doc/html/a00076.html
index 6617254..a9eb60b 100644
--- a/doc/html/a00076.html
+++ b/doc/html/a00076.html
@@ -20,69 +20,79 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::priority_queue_node< T, Compare, A > Member List</h1>This is the complete list of members for <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00263.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(prio_operation *op_list) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00312.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> typedef</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T, A > ></b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(prio_operation *op) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00312.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a>(prio_operation *op)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(prio_operation *op) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(prio_operation *op) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(prio_operation *op) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(prio_operation *op) (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>item_type</b> typedef (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00312.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a> typedef</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00312.html#fdea783bf9d5a4c98e794ac7e0f84ccf">predecessor_type</a> typedef</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prio_operation</b> typedef (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00312.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>(graph &g)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00312.html#17a4f66e23d54100b64805405e905d62">priority_queue_node</a>(const priority_queue_node &src)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00312.html#09ab5064ca8192e68c03da47603e68eb">successor_type</a> typedef</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00263.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::queue_node< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00275.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enqueue_forwarding_task</b>(buffer_operation &op_data) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#8954338d1a7740f9be80455ba27e8eed">forward_task</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>grab_forwarding_task</b>(buffer_operation &op_data) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a> typedef</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::forward_task_bypass< buffer_node< T, A > ></b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::successor_cache</b> (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(queue_operation *op) (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#8eecd6591d7565cbb5b7f1e37bf97979">internal_forward_task</a>(queue_operation *op)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(queue_operation *op) (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(buffer_operation *op) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(queue_operation *op) (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_continue_receiver</b>() (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">limiter_node</a> class</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a> typedef</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#5e2fdd33c45d44549dee9c1638e19898">predecessor_type</a> typedef</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>(graph &g)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a>(const queue_node &src)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset_receiver</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a> class</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#f35076a19f256f9e7a61bed77ca1ccc5">successor_type</a> typedef</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>try_fwd_task</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a>(const T &t)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#84d939049fa8c3205aec91ced0980e03">try_put_task</a>(const T &t)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00077.html b/doc/html/a00077.html
index febb8e1..fd1afef 100644
--- a/doc/html/a00077.html
+++ b/doc/html/a00077.html
@@ -20,37 +20,82 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::flow::interface6::limiter_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">decrement</a></td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> typedef</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::decrementer< limiter_node< T > ></b> (defined in <a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< limiter_node< T > ></b> (defined in <a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>(graph &g, size_t threshold, int num_decrement_predecessors=0)</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#83d3ab884543b070ee5b345a87f241fa">limiter_node</a>(const limiter_node &src)</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> typedef</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#f89fcf44f38eb33f965ee5362d3e68e9">predecessor_type</a> typedef</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#c76561d8d871b4769876988a4de12a9b">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#275e328063c121b3e506ccef2a825d28">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#e8945e4dd6ea759ff9e4735da13f12ef">successor_type</a> typedef</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00292.html#55a02d458a4d8ffa6accd7a70605da2f">try_put</a>(const T &t)</td><td><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00327.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::sequencer_node< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00275.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enqueue_forwarding_task</b>(buffer_operation &op_data) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#8954338d1a7740f9be80455ba27e8eed">forward_task</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>grab_forwarding_task</b>(buffer_operation &op_data) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00340.html#af629f26832ff4e476e240637a78bc0c">input_type</a> typedef</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::forward_task_bypass< buffer_node< T, A > ></b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::successor_cache</b> (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(queue_operation *op) (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#8eecd6591d7565cbb5b7f1e37bf97979">internal_forward_task</a>(queue_operation *op)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(queue_operation *op) (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(queue_operation *op) (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_continue_receiver</b>() (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">limiter_node</a> class</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00340.html#ca026eaef70e35791c407323199031a7">output_type</a> typedef</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00340.html#8127e36811832563fe1e9bc3ba391f79">predecessor_type</a> typedef</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>(graph &g)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00325.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a>(const queue_node &src)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset_receiver</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a> class</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00340.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>(graph &g, const Sequencer &s)</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00340.html#b38e7a070552960384bcc1d91af13a5c">sequencer_node</a>(const sequencer_node &src)</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>sequencer_operation</b> typedef (defined in <a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00340.html#795f3ee75f133b9d3b159172fc4a197f">successor_type</a> typedef</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>try_fwd_task</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a>(const T &t)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#84d939049fa8c3205aec91ced0980e03">try_put_task</a>(const T &t)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00340.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a>()</td><td><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00078.html b/doc/html/a00078.html
new file mode 100644
index 0000000..1c38c0e
--- /dev/null
+++ b/doc/html/a00078.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class Members</span></a></li>
+ </ul></div>
+<h1>tbb::flow::interface6::priority_queue_node< T, Compare, A > Member List</h1>This is the complete list of members for <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>base_type</b> typedef (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enqueue_forwarding_task</b>(buffer_operation &op_data) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#8954338d1a7740f9be80455ba27e8eed">forward_task</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>grab_forwarding_task</b>(buffer_operation &op_data) (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(prio_operation *op_list) (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> typedef</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::forward_task_bypass< buffer_node< T, A > ></b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::successor_cache</b> (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(prio_operation *op) (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#9249c25621a6ee7a741a6b7eac710ba4">internal_forward_task</a>(prio_operation *op)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(prio_operation *op) (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(prio_operation *op) (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(prio_operation *op) (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(prio_operation *op) (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_continue_receiver</b>() (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>item_type</b> typedef (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">limiter_node</a> class</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a> typedef</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#fdea783bf9d5a4c98e794ac7e0f84ccf">predecessor_type</a> typedef</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prio_operation</b> typedef (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>(graph &g)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#17a4f66e23d54100b64805405e905d62">priority_queue_node</a>(const priority_queue_node &src)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset_receiver</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a> class</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#09ab5064ca8192e68c03da47603e68eb">successor_type</a> typedef</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>try_fwd_task</b> enum value (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a>(const T &t)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#84d939049fa8c3205aec91ced0980e03">try_put_task</a>(const T &t)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00079.html b/doc/html/a00079.html
new file mode 100644
index 0000000..f044a66
--- /dev/null
+++ b/doc/html/a00079.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class Members</span></a></li>
+ </ul></div>
+<h1>tbb::flow::interface6::limiter_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00304.html#a3344b2461966631b6ee34b79fb105c7">decrement</a></td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>graph_node</b>(graph &g) (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::broadcast_cache</b> (defined in <a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::decrementer< limiter_node< T > ></b> (defined in <a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::forward_task_bypass< limiter_node< T > ></b> (defined in <a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::round_robin_cache</b> (defined in <a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::successor_cache</b> (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_continue_receiver</b>() (defined in <a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>(graph &g, size_t threshold, int num_decrement_predecessors=0)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#83d3ab884543b070ee5b345a87f241fa">limiter_node</a>(const limiter_node &src)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">tbb::flow::interface6::receiver::limiter_node</a> class</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_graph</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#f89fcf44f38eb33f965ee5362d3e68e9">predecessor_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev</b> (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#c76561d8d871b4769876988a4de12a9b">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#275e328063c121b3e506ccef2a825d28">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset_receiver</b>() (defined in <a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a> class</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#e8945e4dd6ea759ff9e4735da13f12ef">successor_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a>(const T &t)</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#ca2ff9f3379b8b5a3de2ababbca4a476">try_put_task</a>(const T &t)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00339.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00082.html b/doc/html/a00082.html
deleted file mode 100644
index ab4eeb1..0000000
--- a/doc/html/a00082.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::interface6::memory_pool_allocator< T, P > Member List</h1>This is the complete list of members for <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#365bd64d284c80d85bb2149a12681526">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#3491a81e0597c1696a163e7c8fa8706a">construct</a>(pointer p, Args &&...args)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#4e24a03de38638af07548383024c54ab">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#beebdb6144df8ba219fadfad4de866ea">max_size</a>() const </td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b> (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(pool_type &pool) (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator &src) (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator< U, P > &src) (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_pool</b> (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator!=</b> (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator==</b> (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pool_type</b> typedef (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00084.html b/doc/html/a00084.html
index fe9265a..a9b812f 100644
--- a/doc/html/a00084.html
+++ b/doc/html/a00084.html
@@ -20,21 +20,31 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface6::memory_pool_allocator< void, P > Member List</h1>This is the complete list of members for <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b> (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(pool_type &pool) (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator &src) (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator< U, P > &src) (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_pool</b> (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator!=</b> (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator==</b> (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pool_type</b> typedef (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
+<h1>tbb::interface6::memory_pool_allocator< T, P > Member List</h1>This is the complete list of members for <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#365bd64d284c80d85bb2149a12681526">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#c6d3fa3032bf5d4be841729d7893e26d">construct</a>(U *p, Args &&...args)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#4e24a03de38638af07548383024c54ab">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#beebdb6144df8ba219fadfad4de866ea">max_size</a>() const </td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b> (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(pool_type &pool) (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator &src) (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator< U, P > &src) (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_pool</b> (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator!=</b> (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator==</b> (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pool_type</b> typedef (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00086.html b/doc/html/a00086.html
index 46fd5dd..e5ce873 100644
--- a/doc/html/a00086.html
+++ b/doc/html/a00086.html
@@ -20,12 +20,21 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface6::memory_pool< Alloc > Member List</h1>This is the complete list of members for <a class="el" href="a00295.html">tbb::interface6::memory_pool< Alloc ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00295.html#2822528265718a4c779591fc37c02ca8">memory_pool</a>(const Alloc &src=Alloc())</td><td><a class="el" href="a00295.html">tbb::interface6::memory_pool< Alloc ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00295.html#fdad7c4ed08332ec384491a71b721957">~memory_pool</a>()</td><td><a class="el" href="a00295.html">tbb::interface6::memory_pool< Alloc ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::memory_pool_allocator< void, P > Member List</h1>This is the complete list of members for <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b> (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(pool_type &pool) (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator &src) (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator< U, P > &src) (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_pool</b> (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator!=</b> (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator==</b> (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pool_type</b> typedef (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00088.html b/doc/html/a00088.html
index a97e5c6..c86937e 100644
--- a/doc/html/a00088.html
+++ b/doc/html/a00088.html
@@ -20,27 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::mutex Member List</h1>This is the complete list of members for <a class="el" href="a00301.html">tbb::mutex</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>DESTROYED</b> enum value (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>HELD</b> enum value (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>INITIALIZED</b> enum value (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00301.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00301.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>native_handle</b>() (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> typedef</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00301.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>(state_t to)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>state_t</b> enum name (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00301.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00301.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00301.html">tbb::mutex</a>)</td><td><a class="el" href="a00301.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::memory_pool< Alloc > Member List</h1>This is the complete list of members for <a class="el" href="a00307.html">tbb::interface6::memory_pool< Alloc ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00307.html#2822528265718a4c779591fc37c02ca8">memory_pool</a>(const Alloc &src=Alloc())</td><td><a class="el" href="a00307.html">tbb::interface6::memory_pool< Alloc ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00307.html#fdad7c4ed08332ec384491a71b721957">~memory_pool</a>()</td><td><a class="el" href="a00307.html">tbb::interface6::memory_pool< Alloc ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00089.html b/doc/html/a00089.html
deleted file mode 100644
index ddb367b..0000000
--- a/doc/html/a00089.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00302.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00302.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00302.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>mutex</b> (defined in <a class="el" href="a00302.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00302.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00302.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00302.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00302.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00302.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00302.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00302.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00302.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00302.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00302.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00302.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00090.html b/doc/html/a00090.html
index d868cc3..a386356 100644
--- a/doc/html/a00090.html
+++ b/doc/html/a00090.html
@@ -20,14 +20,27 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::null_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00303.html">tbb::null_mutex</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00303.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00303.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00303.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00303.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00303.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00303.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>null_mutex</b>() (defined in <a class="el" href="a00303.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00303.html">tbb::null_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::mutex Member List</h1>This is the complete list of members for <a class="el" href="a00313.html">tbb::mutex</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>DESTROYED</b> enum value (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>HELD</b> enum value (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>INITIALIZED</b> enum value (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00313.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00313.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>native_handle</b>() (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00313.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> typedef</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00313.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>(state_t to)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>state_t</b> enum name (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00313.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00313.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00313.html">tbb::mutex</a>)</td><td><a class="el" href="a00313.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00091.html b/doc/html/a00091.html
index bdd2323..4a9d92c 100644
--- a/doc/html/a00091.html
+++ b/doc/html/a00091.html
@@ -20,16 +20,17 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::null_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>acquire</b>(null_mutex &) (defined in <a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>release</b>() (defined in <a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>() (defined in <a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>(null_mutex &) (defined in <a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_acquire</b>(null_mutex &) (defined in <a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~scoped_lock</b>() (defined in <a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00314.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00314.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00314.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>mutex</b> (defined in <a class="el" href="a00314.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00314.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00314.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00314.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00314.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00314.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00314.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00314.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00314.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00314.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00314.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00314.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00092.html b/doc/html/a00092.html
index 6fb88b3..e595b3e 100644
--- a/doc/html/a00092.html
+++ b/doc/html/a00092.html
@@ -20,14 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::null_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00305.html">tbb::null_rw_mutex</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00305.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00305.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00305.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>null_rw_mutex</b>() (defined in <a class="el" href="a00305.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::null_rw_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::null_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00315.html">tbb::null_mutex</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00315.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00315.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00315.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00315.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00315.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00315.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>null_mutex</b>() (defined in <a class="el" href="a00315.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00315.html">tbb::null_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00093.html b/doc/html/a00093.html
index c547bac..c8e11d5 100644
--- a/doc/html/a00093.html
+++ b/doc/html/a00093.html
@@ -20,18 +20,16 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::null_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>downgrade_to_reader</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>release</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>upgrade_to_writer</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~scoped_lock</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::null_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>acquire</b>(null_mutex &) (defined in <a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>release</b>() (defined in <a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>() (defined in <a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>(null_mutex &) (defined in <a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>try_acquire</b>(null_mutex &) (defined in <a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~scoped_lock</b>() (defined in <a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00094.html b/doc/html/a00094.html
index 8c6bf6b..1ec5e34 100644
--- a/doc/html/a00094.html
+++ b/doc/html/a00094.html
@@ -20,12 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::parallel_do_feeder< Item > Member List</h1>This is the complete list of members for <a class="el" href="a00307.html">tbb::parallel_do_feeder< Item ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00307.html#40baaf0f6856f4491dd0adf896c93516">add</a>(const Item &item)</td><td><a class="el" href="a00307.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::parallel_do_feeder_impl</b> (defined in <a class="el" href="a00307.html">tbb::parallel_do_feeder< Item ></a>)</td><td><a class="el" href="a00307.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::null_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00317.html">tbb::null_rw_mutex</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00317.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00317.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00317.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00317.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00317.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00317.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>null_rw_mutex</b>() (defined in <a class="el" href="a00317.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00317.html">tbb::null_rw_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00093.html b/doc/html/a00095.html
similarity index 68%
copy from doc/html/a00093.html
copy to doc/html/a00095.html
index c547bac..d3f5080 100644
--- a/doc/html/a00093.html
+++ b/doc/html/a00095.html
@@ -20,18 +20,18 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::null_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>downgrade_to_reader</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>release</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>try_acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>upgrade_to_writer</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~scoped_lock</b>() (defined in <a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::null_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>downgrade_to_reader</b>() (defined in <a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>release</b>() (defined in <a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>() (defined in <a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>try_acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>upgrade_to_writer</b>() (defined in <a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~scoped_lock</b>() (defined in <a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00096.html b/doc/html/a00096.html
index 8d215e3..9de9a26 100644
--- a/doc/html/a00096.html
+++ b/doc/html/a00096.html
@@ -20,11 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::pre_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00311.html">tbb::pre_scan_tag</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00311.html">tbb::pre_scan_tag</a>)</td><td><a class="el" href="a00311.html">tbb::pre_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::parallel_do_feeder< Item > Member List</h1>This is the complete list of members for <a class="el" href="a00319.html">tbb::parallel_do_feeder< Item ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00319.html#40baaf0f6856f4491dd0adf896c93516">add</a>(const Item &item)</td><td><a class="el" href="a00319.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::parallel_do_feeder_impl</b> (defined in <a class="el" href="a00319.html">tbb::parallel_do_feeder< Item ></a>)</td><td><a class="el" href="a00319.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00097.html b/doc/html/a00097.html
deleted file mode 100644
index ad8bd18..0000000
--- a/doc/html/a00097.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00284.html">tbb::final_scan_tag</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00284.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00284.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00098.html b/doc/html/a00098.html
index b92ef81..fdd5b98 100644
--- a/doc/html/a00098.html
+++ b/doc/html/a00098.html
@@ -20,15 +20,11 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::parallel_while< Body > Member List</h1>This is the complete list of members for <a class="el" href="a00308.html">tbb::parallel_while< Body ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00308.html#e131c560057a58229992b61eb8dba4c6">add</a>(const value_type &item)</td><td><a class="el" href="a00308.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00308.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>()</td><td><a class="el" href="a00308.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00308.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>(Stream &stream, const Body &body)</td><td><a class="el" href="a00308.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00308.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> typedef</td><td><a class="el" href="a00308.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00308.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>()</td><td><a class="el" href="a00308.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::pre_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00323.html">tbb::pre_scan_tag</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00323.html">tbb::pre_scan_tag</a>)</td><td><a class="el" href="a00323.html">tbb::pre_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00099.html b/doc/html/a00099.html
index 8ec61c6..106c570 100644
--- a/doc/html/a00099.html
+++ b/doc/html/a00099.html
@@ -20,12 +20,11 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::affinity_partitioner_base_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>tbb::affinity_partitioner</b> (defined in <a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::affinity_partition_type</b> (defined in <a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00296.html">tbb::final_scan_tag</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00296.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00296.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00100.html b/doc/html/a00100.html
index 30a59c7..0ade400 100644
--- a/doc/html/a00100.html
+++ b/doc/html/a00100.html
@@ -20,15 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::partition_type_base Member List</h1>This is the complete list of members for <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>continue_after_execute_range</b>() (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>decide_whether_to_delay</b>() (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>note_affinity</b>(task::affinity_id) (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set_affinity</b>(task &) (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>spawn_or_delay</b>(bool, task &b) (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::parallel_while< Body > Member List</h1>This is the complete list of members for <a class="el" href="a00320.html">tbb::parallel_while< Body ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00320.html#e131c560057a58229992b61eb8dba4c6">add</a>(const value_type &item)</td><td><a class="el" href="a00320.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00320.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>()</td><td><a class="el" href="a00320.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00320.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>(Stream &stream, const Body &body)</td><td><a class="el" href="a00320.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00320.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> typedef</td><td><a class="el" href="a00320.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00320.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>()</td><td><a class="el" href="a00320.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00101.html b/doc/html/a00101.html
index ec1ce9b..3a3bde4 100644
--- a/doc/html/a00101.html
+++ b/doc/html/a00101.html
@@ -20,15 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::simple_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00329.html">tbb::simple_partitioner</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_for</b> (defined in <a class="el" href="a00329.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00329.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_reduce</b> (defined in <a class="el" href="a00329.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00329.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00329.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00329.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>serial::interface6::start_for</b> (defined in <a class="el" href="a00329.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00329.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>simple_partitioner</b>() (defined in <a class="el" href="a00329.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00329.html">tbb::simple_partitioner</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::internal::affinity_partitioner_base_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>tbb::affinity_partitioner</b> (defined in <a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::affinity_partition_type</b> (defined in <a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00100.html b/doc/html/a00102.html
similarity index 74%
copy from doc/html/a00100.html
copy to doc/html/a00102.html
index 30a59c7..fd97764 100644
--- a/doc/html/a00100.html
+++ b/doc/html/a00102.html
@@ -20,15 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::partition_type_base Member List</h1>This is the complete list of members for <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>continue_after_execute_range</b>() (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>decide_whether_to_delay</b>() (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>note_affinity</b>(task::affinity_id) (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set_affinity</b>(task &) (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>spawn_or_delay</b>(bool, task &b) (defined in <a class="el" href="a00309.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::internal::partition_type_base Member List</h1>This is the complete list of members for <a class="el" href="a00321.html">tbb::internal::partition_type_base</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>continue_after_execute_range</b>() (defined in <a class="el" href="a00321.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00321.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>decide_whether_to_delay</b>() (defined in <a class="el" href="a00321.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00321.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>note_affinity</b>(task::affinity_id) (defined in <a class="el" href="a00321.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00321.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>set_affinity</b>(task &) (defined in <a class="el" href="a00321.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00321.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>spawn_or_delay</b>(bool, task &b) (defined in <a class="el" href="a00321.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00321.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00103.html b/doc/html/a00103.html
index 1ba82c5..71fb512 100644
--- a/doc/html/a00103.html
+++ b/doc/html/a00103.html
@@ -20,15 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00257.html">tbb::auto_partitioner</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>auto_partitioner</b>() (defined in <a class="el" href="a00257.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00257.html">tbb::auto_partitioner</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_for</b> (defined in <a class="el" href="a00257.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00257.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_reduce</b> (defined in <a class="el" href="a00257.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00257.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00257.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00257.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>serial::interface6::start_for</b> (defined in <a class="el" href="a00257.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00257.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::simple_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00341.html">tbb::simple_partitioner</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_for</b> (defined in <a class="el" href="a00341.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00341.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_reduce</b> (defined in <a class="el" href="a00341.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00341.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00341.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00341.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>serial::interface6::start_for</b> (defined in <a class="el" href="a00341.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00341.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>simple_partitioner</b>() (defined in <a class="el" href="a00341.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00341.html">tbb::simple_partitioner</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00104.html b/doc/html/a00104.html
deleted file mode 100644
index 4087aae..0000000
--- a/doc/html/a00104.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::affinity_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00249.html">tbb::affinity_partitioner</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>affinity_partitioner</b>() (defined in <a class="el" href="a00249.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00249.html">tbb::affinity_partitioner</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_for</b> (defined in <a class="el" href="a00249.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00249.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_reduce</b> (defined in <a class="el" href="a00249.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00249.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00249.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00249.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>serial::interface6::start_for</b> (defined in <a class="el" href="a00249.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00249.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb::affinity_partitioner</b> (defined in <a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::affinity_partition_type</b> (defined in <a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00105.html b/doc/html/a00105.html
index 19a6239..85b5548 100644
--- a/doc/html/a00105.html
+++ b/doc/html/a00105.html
@@ -20,32 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::filter Member List</h1>This is the complete list of members for <a class="el" href="a00282.html">tbb::filter</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00282.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_pipeline</b>(NULL) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next_segment</b>(NULL) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pipeline</b> (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev_filter_in_pipeline</b>(not_in_pipeline()) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set_end_of_input</b>() (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>x1</b>((is_serial_?serial:parallel)|exact_exception_propagation)) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00269.html">tbb::auto_partitioner</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>auto_partitioner</b>() (defined in <a class="el" href="a00269.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00269.html">tbb::auto_partitioner</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_for</b> (defined in <a class="el" href="a00269.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00269.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_reduce</b> (defined in <a class="el" href="a00269.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00269.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00269.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00269.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>serial::interface6::start_for</b> (defined in <a class="el" href="a00269.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00269.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00106.html b/doc/html/a00106.html
index d86c682..1f767e1 100644
--- a/doc/html/a00106.html
+++ b/doc/html/a00106.html
@@ -20,37 +20,17 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::thread_bound_filter Member List</h1>This is the complete list of members for <a class="el" href="a00348.html">tbb::thread_bound_filter</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>end_of_stream</b> enum value (defined in <a class="el" href="a00348.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00348.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>item_not_available</b> enum value (defined in <a class="el" href="a00348.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00348.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_pipeline</b>(NULL) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next_segment</b>(NULL) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prev_filter_in_pipeline</b>(not_in_pipeline()) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00348.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>()</td><td><a class="el" href="a00348.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>result_type</b> enum name (defined in <a class="el" href="a00348.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00348.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set_end_of_input</b>() (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>success</b> enum value (defined in <a class="el" href="a00348.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00348.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b>(mode filter_mode) (defined in <a class="el" href="a00348.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00348.html">tbb::thread_bound_filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00348.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>()</td><td><a class="el" href="a00348.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>x1</b>((is_serial_?serial:parallel)|exact_exception_propagation)) (defined in <a class="el" href="a00282.html">tbb::filter</a>)</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00282.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::affinity_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00261.html">tbb::affinity_partitioner</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>affinity_partitioner</b>() (defined in <a class="el" href="a00261.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00261.html">tbb::affinity_partitioner</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_for</b> (defined in <a class="el" href="a00261.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00261.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_reduce</b> (defined in <a class="el" href="a00261.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00261.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00261.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00261.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>serial::interface6::start_for</b> (defined in <a class="el" href="a00261.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00261.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb::affinity_partitioner</b> (defined in <a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::affinity_partition_type</b> (defined in <a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00107.html b/doc/html/a00107.html
index 2ed6c4b..b30c352 100644
--- a/doc/html/a00107.html
+++ b/doc/html/a00107.html
@@ -20,22 +20,32 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::pipeline Member List</h1>This is the complete list of members for <a class="el" href="a00310.html">tbb::pipeline</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00310.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>(filter &filter_)</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00310.html#2c84aef5b834b555ee220b176e25931e">clear</a>()</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter</b> (defined in <a class="el" href="a00310.html">tbb::pipeline</a>)</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_cleaner</b> (defined in <a class="el" href="a00310.html">tbb::pipeline</a>)</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00310.html">tbb::pipeline</a>)</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00310.html">tbb::pipeline</a>)</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00310.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>()</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00310.html#f627616049b3fe36801f37ee40403ef8">run</a>(size_t max_number_of_live_tokens)</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00310.html#93d7fec8cd607b803dd2d79fb46bd260">run</a>(size_t max_number_of_live_tokens, tbb::task_group_context &context)</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::pipeline_proxy</b> (defined in <a class="el" href="a00310.html">tbb::pipeline</a>)</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00310.html">tbb::pipeline</a>)</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00310.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>()</td><td><a class="el" href="a00310.html">tbb::pipeline</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::filter Member List</h1>This is the complete list of members for <a class="el" href="a00294.html">tbb::filter</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00294.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_pipeline</b>(NULL) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next_segment</b>(NULL) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pipeline</b> (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev_filter_in_pipeline</b>(not_in_pipeline()) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>set_end_of_input</b>() (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>x1</b>((is_serial_?serial:parallel)|exact_exception_propagation)) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00108.html b/doc/html/a00108.html
index 768cfad..0006fd1 100644
--- a/doc/html/a00108.html
+++ b/doc/html/a00108.html
@@ -20,12 +20,37 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface6::flow_control Member List</h1>This is the complete list of members for <a class="el" href="a00285.html">tbb::interface6::flow_control</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>internal::concrete_filter</b> (defined in <a class="el" href="a00285.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00285.html">tbb::interface6::flow_control</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>stop</b>() (defined in <a class="el" href="a00285.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00285.html">tbb::interface6::flow_control</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::thread_bound_filter Member List</h1>This is the complete list of members for <a class="el" href="a00361.html">tbb::thread_bound_filter</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>end_of_stream</b> enum value (defined in <a class="el" href="a00361.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00361.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>item_not_available</b> enum value (defined in <a class="el" href="a00361.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00361.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_pipeline</b>(NULL) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>next_segment</b>(NULL) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prev_filter_in_pipeline</b>(not_in_pipeline()) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00361.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>()</td><td><a class="el" href="a00361.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>result_type</b> enum name (defined in <a class="el" href="a00361.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00361.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>set_end_of_input</b>() (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>success</b> enum value (defined in <a class="el" href="a00361.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00361.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b>(mode filter_mode) (defined in <a class="el" href="a00361.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00361.html">tbb::thread_bound_filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00361.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>()</td><td><a class="el" href="a00361.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>x1</b>((is_serial_?serial:parallel)|exact_exception_propagation)) (defined in <a class="el" href="a00294.html">tbb::filter</a>)</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00294.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00294.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00109.html b/doc/html/a00109.html
index 346452e..559c8d2 100644
--- a/doc/html/a00109.html
+++ b/doc/html/a00109.html
@@ -20,19 +20,22 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface6::filter_t< T, U > Member List</h1>This is the complete list of members for <a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter_t</b>() (defined in <a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(tbb::filter::mode mode, const Body &body) (defined in <a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_proxy</b> (defined in <a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00283.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, const Body &)</td><td><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator &</b> (defined in <a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~filter_t</b>() (defined in <a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::pipeline Member List</h1>This is the complete list of members for <a class="el" href="a00322.html">tbb::pipeline</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00322.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>(filter &filter_)</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00322.html#2c84aef5b834b555ee220b176e25931e">clear</a>()</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter</b> (defined in <a class="el" href="a00322.html">tbb::pipeline</a>)</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_cleaner</b> (defined in <a class="el" href="a00322.html">tbb::pipeline</a>)</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00322.html">tbb::pipeline</a>)</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00322.html">tbb::pipeline</a>)</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00322.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>()</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00322.html#f627616049b3fe36801f37ee40403ef8">run</a>(size_t max_number_of_live_tokens)</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00322.html#93d7fec8cd607b803dd2d79fb46bd260">run</a>(size_t max_number_of_live_tokens, tbb::task_group_context &context)</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::pipeline_proxy</b> (defined in <a class="el" href="a00322.html">tbb::pipeline</a>)</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00322.html">tbb::pipeline</a>)</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00322.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>()</td><td><a class="el" href="a00322.html">tbb::pipeline</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00110.html b/doc/html/a00110.html
index 2130b67..887695f 100644
--- a/doc/html/a00110.html
+++ b/doc/html/a00110.html
@@ -20,15 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::queuing_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00314.html">tbb::queuing_mutex</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00314.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00314.html">tbb::queuing_mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00314.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00314.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00314.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00314.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00314.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00314.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00314.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>()</td><td><a class="el" href="a00314.html">tbb::queuing_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::flow_control Member List</h1>This is the complete list of members for <a class="el" href="a00297.html">tbb::interface6::flow_control</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>internal::concrete_filter</b> (defined in <a class="el" href="a00297.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00297.html">tbb::interface6::flow_control</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>stop</b>() (defined in <a class="el" href="a00297.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00297.html">tbb::interface6::flow_control</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00111.html b/doc/html/a00111.html
index a8da238..50c70dd 100644
--- a/doc/html/a00111.html
+++ b/doc/html/a00111.html
@@ -20,16 +20,19 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::queuing_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00315.html">tbb::queuing_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00315.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00315.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00315.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>()</td><td><a class="el" href="a00315.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00315.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>()</td><td><a class="el" href="a00315.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00315.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a>(queuing_mutex &m)</td><td><a class="el" href="a00315.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00315.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00315.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00315.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>()</td><td><a class="el" href="a00315.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::filter_t< T, U > Member List</h1>This is the complete list of members for <a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter_t</b>() (defined in <a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(tbb::filter::mode mode, const Body &body) (defined in <a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_proxy</b> (defined in <a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, const Body &)</td><td><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator &</b> (defined in <a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~filter_t</b>() (defined in <a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00112.html b/doc/html/a00112.html
index c3a3d9d..0e140bb 100644
--- a/doc/html/a00112.html
+++ b/doc/html/a00112.html
@@ -20,16 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::queuing_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00316.html">tbb::queuing_rw_mutex</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00316.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00316.html">tbb::queuing_rw_mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00316.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00316.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00316.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00316.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00316.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00316.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00316.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>()</td><td><a class="el" href="a00316.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00316.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>()</td><td><a class="el" href="a00316.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::queuing_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00326.html">tbb::queuing_mutex</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00326.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00326.html">tbb::queuing_mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00326.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00326.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00326.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00326.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00326.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00326.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00326.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>()</td><td><a class="el" href="a00326.html">tbb::queuing_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00113.html b/doc/html/a00113.html
index 091c401..d9b1ed8 100644
--- a/doc/html/a00113.html
+++ b/doc/html/a00113.html
@@ -20,18 +20,16 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::queuing_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00317.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00317.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>()</td><td><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00317.html#67ae221109ddc69510ab593874e435d4">release</a>()</td><td><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00317.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>()</td><td><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00317.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00317.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00317.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>()</td><td><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00317.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>()</td><td><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::queuing_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00327.html">tbb::queuing_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00327.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00327.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00327.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>()</td><td><a class="el" href="a00327.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00327.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>()</td><td><a class="el" href="a00327.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00327.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a>(queuing_mutex &m)</td><td><a class="el" href="a00327.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00327.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00327.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00327.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>()</td><td><a class="el" href="a00327.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00114.html b/doc/html/a00114.html
index b4cb5fd..9fb0f1d 100644
--- a/doc/html/a00114.html
+++ b/doc/html/a00114.html
@@ -20,24 +20,16 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::reader_writer_lock Member List</h1>This is the complete list of members for <a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>active</b> enum value (defined in <a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>invalid</b> enum value (defined in <a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00318.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>()</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00318.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>()</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00318.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>()</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock_read</b> (defined in <a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00318.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> enum name</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00318.html#721eb173e154ab38292273e9266a9b07">try_lock</a>()</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00318.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>()</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00318.html#5113b32689305599b2c36b5831547704">unlock</a>()</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>waiting</b> enum value (defined in <a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>waiting_nonblocking</b> enum value (defined in <a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00318.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>()</td><td><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::queuing_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00328.html">tbb::queuing_rw_mutex</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00328.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00328.html">tbb::queuing_rw_mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00328.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00328.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00328.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00328.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00328.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00328.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00328.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>()</td><td><a class="el" href="a00328.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00328.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>()</td><td><a class="el" href="a00328.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00115.html b/doc/html/a00115.html
index 3d9f6c6..1b931d7 100644
--- a/doc/html/a00115.html
+++ b/doc/html/a00115.html
@@ -20,15 +20,18 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::reader_writer_lock::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>operator delete</b>(void *p) (defined in <a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator new</b>(size_t s) (defined in <a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reader_writer_lock</b> (defined in <a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00319.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00319.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>()</td><td><a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::queuing_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00329.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00329.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>()</td><td><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00329.html#67ae221109ddc69510ab593874e435d4">release</a>()</td><td><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00329.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>()</td><td><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00329.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00329.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00329.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>()</td><td><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00329.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>()</td><td><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00116.html b/doc/html/a00116.html
index a9a041f..0f596ec 100644
--- a/doc/html/a00116.html
+++ b/doc/html/a00116.html
@@ -20,15 +20,24 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::reader_writer_lock::scoped_lock_read Member List</h1>This is the complete list of members for <a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>operator delete</b>(void *p) (defined in <a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator new</b>(size_t s) (defined in <a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reader_writer_lock</b> (defined in <a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00320.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00320.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>()</td><td><a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::reader_writer_lock Member List</h1>This is the complete list of members for <a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>active</b> enum value (defined in <a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>invalid</b> enum value (defined in <a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00330.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>()</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00330.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>()</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00330.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>()</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock_read</b> (defined in <a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00330.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> enum name</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00330.html#721eb173e154ab38292273e9266a9b07">try_lock</a>()</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00330.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>()</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00330.html#5113b32689305599b2c36b5831547704">unlock</a>()</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>waiting</b> enum value (defined in <a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>waiting_nonblocking</b> enum value (defined in <a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00330.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>()</td><td><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00117.html b/doc/html/a00117.html
index 7db7b57..d5d0571 100644
--- a/doc/html/a00117.html
+++ b/doc/html/a00117.html
@@ -20,22 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::recursive_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00322.html">tbb::recursive_mutex</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00322.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00322.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00322.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00322.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>()</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>native_handle</b>() (defined in <a class="el" href="a00322.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> typedef</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00322.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00322.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>()</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00322.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00322.html#86e719b0afee25704af11ab97694d240">try_lock</a>()</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00322.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>()</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~recursive_mutex</b>() (defined in <a class="el" href="a00322.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::reader_writer_lock::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>operator delete</b>(void *p) (defined in <a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator new</b>(size_t s) (defined in <a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reader_writer_lock</b> (defined in <a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00331.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00331.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>()</td><td><a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00118.html b/doc/html/a00118.html
index 7360b9b..d8c63ac 100644
--- a/doc/html/a00118.html
+++ b/doc/html/a00118.html
@@ -20,17 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::recursive_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00323.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>recursive_mutex</b> (defined in <a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a>)</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>()</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>()</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>()</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::reader_writer_lock::scoped_lock_read Member List</h1>This is the complete list of members for <a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>operator delete</b>(void *p) (defined in <a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator new</b>(size_t s) (defined in <a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reader_writer_lock</b> (defined in <a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00332.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00332.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>()</td><td><a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00119.html b/doc/html/a00119.html
index 2f41f37..8ae2055 100644
--- a/doc/html/a00119.html
+++ b/doc/html/a00119.html
@@ -20,26 +20,22 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface6::runtime_loader Member List</h1>This is the complete list of members for <a class="el" href="a00324.html">tbb::interface6::runtime_loader</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a> enum value</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a> enum value</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a> enum value</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a> enum value</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a> enum value</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a> enum value</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a> enum value</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a> enum value</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a> enum value</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a> enum name</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> enum name</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#5f3f6f1683386705a6931acae45f0862">load</a>(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a>(error_mode mode=em_abort)</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#7ae5330beb48fce0c702c32a5df0094a">runtime_loader</a>(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, error_mode mode=em_abort)</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#78d938ed2e54d38dd38d6609e6c60389">status</a>()</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00324.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a>()</td><td><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+<h1>tbb::recursive_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00334.html">tbb::recursive_mutex</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00334.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00334.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00334.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00334.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>()</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>native_handle</b>() (defined in <a class="el" href="a00334.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00334.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> typedef</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00334.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00334.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>()</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00334.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00334.html#86e719b0afee25704af11ab97694d240">try_lock</a>()</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00334.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>()</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~recursive_mutex</b>() (defined in <a class="el" href="a00334.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00118.html b/doc/html/a00120.html
similarity index 69%
copy from doc/html/a00118.html
copy to doc/html/a00120.html
index 7360b9b..ad79d83 100644
--- a/doc/html/a00118.html
+++ b/doc/html/a00120.html
@@ -20,17 +20,17 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::recursive_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00323.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>recursive_mutex</b> (defined in <a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a>)</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>()</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>()</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00323.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>()</td><td><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::recursive_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00335.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>recursive_mutex</b> (defined in <a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a>)</td><td><a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00335.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>()</td><td><a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00335.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>()</td><td><a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00335.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00335.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00335.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>()</td><td><a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00121.html b/doc/html/a00121.html
index 0abc0aa..d896120 100644
--- a/doc/html/a00121.html
+++ b/doc/html/a00121.html
@@ -20,26 +20,26 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::scalable_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00325.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>construct</b>(pointer p, Args &&...args) (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00325.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00325.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const </td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>() (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>(const scalable_allocator &) (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>(const scalable_allocator< U > &) (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+<h1>tbb::interface6::runtime_loader Member List</h1>This is the complete list of members for <a class="el" href="a00336.html">tbb::interface6::runtime_loader</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a> enum value</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a> enum value</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a> enum value</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a> enum value</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a> enum value</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a> enum value</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a> enum value</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a> enum value</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a> enum value</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789">error_code</a> enum name</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> enum name</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#5f3f6f1683386705a6931acae45f0862">load</a>(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a>(error_mode mode=em_abort)</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#7ae5330beb48fce0c702c32a5df0094a">runtime_loader</a>(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, error_mode mode=em_abort)</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#78d938ed2e54d38dd38d6609e6c60389">status</a>()</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00336.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a>()</td><td><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00123.html b/doc/html/a00123.html
index ca11399..4b979b2 100644
--- a/doc/html/a00123.html
+++ b/doc/html/a00123.html
@@ -20,13 +20,26 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::scalable_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00326.html">tbb::scalable_allocator< void ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00326.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00326.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00326.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00326.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00326.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00326.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+<h1>tbb::scalable_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00337.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>construct</b>(U *p, Args &&...args) (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00337.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00337.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const </td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>() (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>(const scalable_allocator &) (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>(const scalable_allocator< U > &) (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00125.html b/doc/html/a00125.html
index 68002b9..9e1f0b5 100644
--- a/doc/html/a00125.html
+++ b/doc/html/a00125.html
@@ -20,19 +20,13 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::spin_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00331.html">tbb::spin_mutex</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00331.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00331.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00331.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00331.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00331.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>()</td><td><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00331.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00331.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>()</td><td><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00331.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>()</td><td><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00331.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>()</td><td><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::scalable_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00338.html">tbb::scalable_allocator< void ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00338.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00338.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00338.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00338.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00338.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00338.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00126.html b/doc/html/a00126.html
deleted file mode 100644
index b3d0629..0000000
--- a/doc/html/a00126.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::spin_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00332.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00332.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>()</td><td><a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00332.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>()</td><td><a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00332.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a>(spin_mutex &m)</td><td><a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>spin_mutex</b> (defined in <a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a>)</td><td><a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00332.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00332.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>()</td><td><a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00127.html b/doc/html/a00127.html
index 51f45e0..38ec61b 100644
--- a/doc/html/a00127.html
+++ b/doc/html/a00127.html
@@ -20,20 +20,19 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::spin_rw_mutex_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::spin_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00343.html">tbb::spin_mutex</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00343.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00343.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00343.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00343.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00343.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>()</td><td><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00343.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00343.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>()</td><td><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00343.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>()</td><td><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00343.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>()</td><td><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00128.html b/doc/html/a00128.html
index 55ac4c9..c9dde52 100644
--- a/doc/html/a00128.html
+++ b/doc/html/a00128.html
@@ -20,20 +20,17 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::spin_rw_mutex_v3::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00334.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00334.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a>()</td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00334.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00334.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00334.html#61b14d00a78185c9b2d206ebfc379124">release</a>()</td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00334.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a>()</td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00334.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00334.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00334.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a>()</td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00334.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a>()</td><td><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::spin_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00344.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00344.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>()</td><td><a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00344.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>()</td><td><a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00344.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a>(spin_mutex &m)</td><td><a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>spin_mutex</b> (defined in <a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a>)</td><td><a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00344.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00344.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>()</td><td><a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00127.html b/doc/html/a00129.html
similarity index 62%
copy from doc/html/a00127.html
copy to doc/html/a00129.html
index 51f45e0..64ded4a 100644
--- a/doc/html/a00127.html
+++ b/doc/html/a00129.html
@@ -20,20 +20,20 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::spin_rw_mutex_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00333.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::spin_rw_mutex_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00345.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00345.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00345.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00345.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00345.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00345.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00345.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00130.html b/doc/html/a00130.html
index 2aefa04..2e0dd07 100644
--- a/doc/html/a00130.html
+++ b/doc/html/a00130.html
@@ -20,10 +20,20 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::internal::task_base Member List</h1>This is the complete list of members for <a class="el" href="a00338.html">tbb::interface5::internal::task_base</a>, including all inherited members.<p><table>
+<h1>tbb::spin_rw_mutex_v3::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00346.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00346.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a>()</td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00346.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00346.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00346.html#61b14d00a78185c9b2d206ebfc379124">release</a>()</td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00346.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a>()</td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00346.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00346.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00346.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a>()</td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00346.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a>()</td><td><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00155.html b/doc/html/a00132.html
similarity index 75%
rename from doc/html/a00155.html
rename to doc/html/a00132.html
index 16a42a3..cd42daf 100644
--- a/doc/html/a00155.html
+++ b/doc/html/a00132.html
@@ -20,11 +20,10 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::missing_wait Member List</h1>This is the complete list of members for <a class="el" href="a00298.html">tbb::missing_wait</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00298.html">tbb::missing_wait</a>)</td><td><a class="el" href="a00298.html">tbb::missing_wait</a></td><td></td></tr>
+<h1>tbb::interface5::internal::task_base Member List</h1>This is the complete list of members for <a class="el" href="a00351.html">tbb::interface5::internal::task_base</a>, including all inherited members.<p><table>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00133.html b/doc/html/a00133.html
deleted file mode 100644
index 84e3739..0000000
--- a/doc/html/a00133.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::task Member List</h1>This is the complete list of members for <a class="el" href="a00337.html">tbb::task</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>add_to_depth</b>(int) (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>depth</b>() const (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute</a>()=0</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_child_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_continuation_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::scheduler</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set_depth</b>(intptr_t) (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a>(task *p)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>task_list</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00134.html b/doc/html/a00134.html
deleted file mode 100644
index ea31f2e..0000000
--- a/doc/html/a00134.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::empty_task Member List</h1>This is the complete list of members for <a class="el" href="a00280.html">tbb::empty_task</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>add_to_depth</b>(int) (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>depth</b>() const (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_child_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_continuation_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::scheduler</b> (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set_depth</b>(intptr_t) (defined in <a class="el" href="a00337.html">tbb::task</a>)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a>(task *p)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00337.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00337.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00337.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00135.html b/doc/html/a00135.html
index ab14bbf..3dcf5a3 100644
--- a/doc/html/a00135.html
+++ b/doc/html/a00135.html
@@ -20,18 +20,71 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::task_list Member List</h1>This is the complete list of members for <a class="el" href="a00341.html">tbb::task_list</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00341.html#fce446ee13e025969945328f3ff59b95">clear</a>()</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#f3ac31e092814b90929f81bb30441959">empty</a>() const </td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00341.html">tbb::task_list</a>)</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#5fe85df5ed524418389d34051750347d">pop_front</a>()</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>(task &task)</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>task</b> (defined in <a class="el" href="a00341.html">tbb::task_list</a>)</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>()</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>()</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::task Member List</h1>This is the complete list of members for <a class="el" href="a00349.html">tbb::task</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e2a3f84c7721f6c0b859a91a5ecc660c4">__TBB_RECYCLE_TO_ENQUEUE</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>add_to_depth</b>(int) (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>depth</b>() const (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>endif</b> enum value (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute</a>()=0</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_child_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_continuation_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::scheduler</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_cancelled</b>() const (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#076120a15237d1ee63060c992e878b29">recycle_to_enqueue</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>set_depth</b>(intptr_t) (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a>(task *p)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>task_list</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00136.html b/doc/html/a00136.html
new file mode 100644
index 0000000..b07e17f
--- /dev/null
+++ b/doc/html/a00136.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class Members</span></a></li>
+ </ul></div>
+<h1>tbb::empty_task Member List</h1>This is the complete list of members for <a class="el" href="a00292.html">tbb::empty_task</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e2a3f84c7721f6c0b859a91a5ecc660c4">__TBB_RECYCLE_TO_ENQUEUE</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>add_to_depth</b>(int) (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>depth</b>() const (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>endif</b> enum value (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_child_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_continuation_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::scheduler</b> (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_cancelled</b>() const (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#076120a15237d1ee63060c992e878b29">recycle_to_enqueue</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>set_depth</b>(intptr_t) (defined in <a class="el" href="a00349.html">tbb::task</a>)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a>(task *p)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00349.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00349.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00349.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00135.html b/doc/html/a00137.html
similarity index 64%
copy from doc/html/a00135.html
copy to doc/html/a00137.html
index ab14bbf..0e9c98e 100644
--- a/doc/html/a00135.html
+++ b/doc/html/a00137.html
@@ -20,18 +20,18 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::task_list Member List</h1>This is the complete list of members for <a class="el" href="a00341.html">tbb::task_list</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00341.html#fce446ee13e025969945328f3ff59b95">clear</a>()</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#f3ac31e092814b90929f81bb30441959">empty</a>() const </td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00341.html">tbb::task_list</a>)</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#5fe85df5ed524418389d34051750347d">pop_front</a>()</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>(task &task)</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>task</b> (defined in <a class="el" href="a00341.html">tbb::task_list</a>)</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>()</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00341.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>()</td><td><a class="el" href="a00341.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::task_list Member List</h1>This is the complete list of members for <a class="el" href="a00354.html">tbb::task_list</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00354.html#fce446ee13e025969945328f3ff59b95">clear</a>()</td><td><a class="el" href="a00354.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00354.html#f3ac31e092814b90929f81bb30441959">empty</a>() const </td><td><a class="el" href="a00354.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00354.html">tbb::task_list</a>)</td><td><a class="el" href="a00354.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00354.html#5fe85df5ed524418389d34051750347d">pop_front</a>()</td><td><a class="el" href="a00354.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00354.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>(task &task)</td><td><a class="el" href="a00354.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>task</b> (defined in <a class="el" href="a00354.html">tbb::task_list</a>)</td><td><a class="el" href="a00354.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00354.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>()</td><td><a class="el" href="a00354.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00354.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>()</td><td><a class="el" href="a00354.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00138.html b/doc/html/a00138.html
new file mode 100644
index 0000000..0f09758
--- /dev/null
+++ b/doc/html/a00138.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class Members</span></a></li>
+ </ul></div>
+<h1>tbb::interface6::task_arena Member List</h1>This is the complete list of members for <a class="el" href="a00350.html">tbb::interface6::task_arena</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00350.html#fa26370c094032900c1ed69d8e92f4e8">automatic</a></td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#e734de6a5f4a0bd4461c0cbdaa29b6ce">current_slot</a>()</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#11e3854e92c842ee7d72a7f83d416896">enqueue</a>(const F &f)</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#780277a89e35868abdec843fecaa2237">enqueue</a>(const F &f, priority_t p)</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#1e013b96178a79c57ec7846ea2cf5e2e">execute</a>(F &f)</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#082803bb20347e64fed2c11db8e9670e">execute</a>(const F &f)</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>initialize</b>() (defined in <a class="el" href="a00350.html">tbb::interface6::task_arena</a>)</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#ff36aa5ec1305ca9931396fa608981da">initialize</a>(int max_concurrency, unsigned reserved_for_masters=1)</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::task_scheduler_observer_v3</b> (defined in <a class="el" href="a00350.html">tbb::interface6::task_arena</a>)</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#11e35391bf67e96f877183659106583d">is_active</a>() const </td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#5e14461dfcbc713df95367cf7f44738f">task_arena</a>(int max_concurrency=automatic, unsigned reserved_for_masters=1)</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#27ac2706e3f2a989487ba7944b07cb94">task_arena</a>(const task_arena &s)</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#ee3f3f736da03bfe8b82acfa822624a6">terminate</a>()</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#776e73ba196e5bbb8b8ed489fc2b77d3">wait_until_empty</a>()</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00350.html#fec24e9b3fa07a6e7b20add7c7e0a660">~task_arena</a>()</td><td><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td><code> [inline]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00144.html b/doc/html/a00144.html
deleted file mode 100644
index d5e415c..0000000
--- a/doc/html/a00144.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::tbb_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00343.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00343.html#15c431ccb5ccc5a30e5d496edad4c143">construct</a>(pointer p, Args &&...args)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00343.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00343.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> enum name</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00343.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const </td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scalable</b> enum value (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>standard</b> enum value (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>() (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>(const tbb_allocator &) (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>(const tbb_allocator< U > &) (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00142.html b/doc/html/a00145.html
similarity index 55%
rename from doc/html/a00142.html
rename to doc/html/a00145.html
index 17fcd35..1c80241 100644
--- a/doc/html/a00142.html
+++ b/doc/html/a00145.html
@@ -20,19 +20,18 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::task_scheduler_init Member List</h1>This is the complete list of members for <a class="el" href="a00342.html">tbb::task_scheduler_init</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></td><td><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00342.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a>()</td><td><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00342.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a></td><td><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00342.html#d476053cc712e572554823492a5229ce">initialize</a>(int number_of_threads=automatic)</td><td><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00342.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a>(int number_of_threads, stack_size_type thread_stack_size)</td><td><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00342.html#12752282977029f23416642bc03e8b74">is_active</a>() const </td><td><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00342.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>(int number_of_threads=automatic, stack_size_type thread_stack_size=0)</td><td><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00342.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>()</td><td><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00342.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>()</td><td><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::task_scheduler_init Member List</h1>This is the complete list of members for <a class="el" href="a00355.html">tbb::task_scheduler_init</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00355.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></td><td><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00355.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a></td><td><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00355.html#d476053cc712e572554823492a5229ce">initialize</a>(int number_of_threads=automatic)</td><td><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00355.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a>(int number_of_threads, stack_size_type thread_stack_size)</td><td><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00355.html#12752282977029f23416642bc03e8b74">is_active</a>() const </td><td><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00355.html#5dbd23c83603b3b09dffa7982112cc95">task_scheduler_init</a>(int number_of_threads=automatic, stack_size_type thread_stack_size=0, bool wait_workers_in_terminate=false) task_scheduler_init(int number_of_threads</td><td><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00355.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>()</td><td><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>thread_stack_size</b> (defined in <a class="el" href="a00355.html">tbb::task_scheduler_init</a>)</td><td><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00146.html b/doc/html/a00146.html
deleted file mode 100644
index 33b67d9..0000000
--- a/doc/html/a00146.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::tbb_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00344.html">tbb::tbb_allocator< void ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00344.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00344.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00344.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00344.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00344.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00344.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00148.html b/doc/html/a00148.html
index 8749dc9..a4c9004 100644
--- a/doc/html/a00148.html
+++ b/doc/html/a00148.html
@@ -20,22 +20,29 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::zero_allocator< T, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>allocate</b>(const size_type n, const void *hint=0) (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>base_allocator_type</b> typedef (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>() (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>(const zero_allocator &a) (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>(const zero_allocator< U > &a) (defined in <a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::tbb_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00356.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00356.html#3999cb92a8b6a995b65ee9ae5c31751f">construct</a>(U *p, Args &&...args)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00356.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00356.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> enum name</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00356.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const </td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scalable</b> enum value (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>standard</b> enum value (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>() (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>(const tbb_allocator &) (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>(const tbb_allocator< U > &) (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00150.html b/doc/html/a00150.html
index 53d3c66..4d4233d 100644
--- a/doc/html/a00150.html
+++ b/doc/html/a00150.html
@@ -20,14 +20,13 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::zero_allocator< void, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>base_allocator_type</b> typedef (defined in <a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
+<h1>tbb::tbb_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00357.html">tbb::tbb_allocator< void ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00357.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00357.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00357.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00357.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00357.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00357.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00152.html b/doc/html/a00152.html
index fb2070e..117173f 100644
--- a/doc/html/a00152.html
+++ b/doc/html/a00152.html
@@ -20,12 +20,22 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::bad_last_alloc Member List</h1>This is the complete list of members for <a class="el" href="a00258.html">tbb::bad_last_alloc</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00258.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00258.html">tbb::bad_last_alloc</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~bad_last_alloc</b>() (defined in <a class="el" href="a00258.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00258.html">tbb::bad_last_alloc</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::zero_allocator< T, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>allocate</b>(const size_type n, const void *hint=0) (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>base_allocator_type</b> typedef (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>() (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>(const zero_allocator &a) (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>(const zero_allocator< U > &a) (defined in <a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00153.html b/doc/html/a00153.html
deleted file mode 100644
index f5f1d14..0000000
--- a/doc/html/a00153.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::improper_lock Member List</h1>This is the complete list of members for <a class="el" href="a00290.html">tbb::improper_lock</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00290.html">tbb::improper_lock</a>)</td><td><a class="el" href="a00290.html">tbb::improper_lock</a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00154.html b/doc/html/a00154.html
index a180181..d936ab9 100644
--- a/doc/html/a00154.html
+++ b/doc/html/a00154.html
@@ -20,11 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::user_abort Member List</h1>This is the complete list of members for <a class="el" href="a00351.html">tbb::user_abort</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00351.html">tbb::user_abort</a>)</td><td><a class="el" href="a00351.html">tbb::user_abort</a></td><td></td></tr>
+<h1>tbb::zero_allocator< void, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>base_allocator_type</b> typedef (defined in <a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00156.html b/doc/html/a00156.html
index 2de2c80..5fb9751 100644
--- a/doc/html/a00156.html
+++ b/doc/html/a00156.html
@@ -20,11 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::invalid_multiple_scheduling Member List</h1>This is the complete list of members for <a class="el" href="a00291.html">tbb::invalid_multiple_scheduling</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00291.html">tbb::invalid_multiple_scheduling</a>)</td><td><a class="el" href="a00291.html">tbb::invalid_multiple_scheduling</a></td><td></td></tr>
+<h1>tbb::bad_last_alloc Member List</h1>This is the complete list of members for <a class="el" href="a00270.html">tbb::bad_last_alloc</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00270.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00270.html">tbb::bad_last_alloc</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~bad_last_alloc</b>() (defined in <a class="el" href="a00270.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00270.html">tbb::bad_last_alloc</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00157.html b/doc/html/a00157.html
index 2376ebd..7a13656 100644
--- a/doc/html/a00157.html
+++ b/doc/html/a00157.html
@@ -20,16 +20,11 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::tbb_exception Member List</h1>This is the complete list of members for <a class="el" href="a00345.html">tbb::tbb_exception</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00345.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a>()=0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move</a>()=0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() const =0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a>()=0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() const =0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+<h1>tbb::improper_lock Member List</h1>This is the complete list of members for <a class="el" href="a00302.html">tbb::improper_lock</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00302.html">tbb::improper_lock</a>)</td><td><a class="el" href="a00302.html">tbb::improper_lock</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00158.html b/doc/html/a00158.html
index 7799031..fdcf630 100644
--- a/doc/html/a00158.html
+++ b/doc/html/a00158.html
@@ -20,22 +20,11 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00266.html">tbb::captured_exception</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const captured_exception &src) (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const char *name_, const char *info) (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const captured_exception &src) (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set</b>(const char *name, const char *info) (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~captured_exception</b>() (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td></td></tr>
+<h1>tbb::user_abort Member List</h1>This is the complete list of members for <a class="el" href="a00364.html">tbb::user_abort</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00364.html">tbb::user_abort</a>)</td><td><a class="el" href="a00364.html">tbb::user_abort</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00159.html b/doc/html/a00159.html
index e9cf7cf..bd29e5d 100644
--- a/doc/html/a00159.html
+++ b/doc/html/a00159.html
@@ -20,23 +20,11 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::movable_exception< ExceptionData > Member List</h1>This is the complete list of members for <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>data</b>() (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>data</b>() const (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#7a46873119d9f85a7b0009c13e41a258">destroy</a>()</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const ExceptionData &data_) (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const movable_exception &src) (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a>()</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>() const </td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const movable_exception &src) (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#17cffba35811c92b7e65d63506b69602">throw_self</a>()</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a>() const </td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~movable_exception</b>() (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::missing_wait Member List</h1>This is the complete list of members for <a class="el" href="a00310.html">tbb::missing_wait</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00310.html">tbb::missing_wait</a>)</td><td><a class="el" href="a00310.html">tbb::missing_wait</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00160.html b/doc/html/a00160.html
index 689f460..73a6acb 100644
--- a/doc/html/a00160.html
+++ b/doc/html/a00160.html
@@ -20,15 +20,11 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::tbb_exception_ptr Member List</h1>This is the complete list of members for <a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>allocate</b>() (defined in <a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>allocate</b>(const tbb_exception &tag) (defined in <a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00346.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a>(captured_exception &src)</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00346.html#921875bbacd2c8a5f324c7da7a415262">destroy</a>()</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00346.html#292832fd5c523e3d8081a22247840a1d">throw_self</a>()</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::invalid_multiple_scheduling Member List</h1>This is the complete list of members for <a class="el" href="a00303.html">tbb::invalid_multiple_scheduling</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00303.html">tbb::invalid_multiple_scheduling</a>)</td><td><a class="el" href="a00303.html">tbb::invalid_multiple_scheduling</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00157.html b/doc/html/a00161.html
similarity index 64%
copy from doc/html/a00157.html
copy to doc/html/a00161.html
index 2376ebd..1d82b9c 100644
--- a/doc/html/a00157.html
+++ b/doc/html/a00161.html
@@ -20,16 +20,17 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::tbb_exception Member List</h1>This is the complete list of members for <a class="el" href="a00345.html">tbb::tbb_exception</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00345.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a>()=0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move</a>()=0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() const =0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a>()=0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() const =0</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+<h1>tbb::tbb_exception Member List</h1>This is the complete list of members for <a class="el" href="a00358.html">tbb::tbb_exception</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00358.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a>()=0</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">move</a>()=0</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00358.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() const =0</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00358.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00358.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a>()=0</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00358.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() const =0</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~tbb_exception</b>() (defined in <a class="el" href="a00358.html">tbb::tbb_exception</a>)</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00158.html b/doc/html/a00162.html
similarity index 57%
copy from doc/html/a00158.html
copy to doc/html/a00162.html
index 7799031..c760408 100644
--- a/doc/html/a00158.html
+++ b/doc/html/a00162.html
@@ -20,22 +20,23 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00266.html">tbb::captured_exception</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const captured_exception &src) (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const char *name_, const char *info) (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const captured_exception &src) (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set</b>(const char *name, const char *info) (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~captured_exception</b>() (defined in <a class="el" href="a00266.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00266.html">tbb::captured_exception</a></td><td></td></tr>
+<h1>tbb::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00278.html">tbb::captured_exception</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const captured_exception &src) (defined in <a class="el" href="a00278.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const char *name_, const char *info) (defined in <a class="el" href="a00278.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00278.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00278.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00278.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00278.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00358.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const captured_exception &src) (defined in <a class="el" href="a00278.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>set</b>(const char *name, const char *info) (defined in <a class="el" href="a00278.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00278.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00278.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~captured_exception</b>() (defined in <a class="el" href="a00278.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00278.html">tbb::captured_exception</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~tbb_exception</b>() (defined in <a class="el" href="a00358.html">tbb::tbb_exception</a>)</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00159.html b/doc/html/a00163.html
similarity index 62%
copy from doc/html/a00159.html
copy to doc/html/a00163.html
index e9cf7cf..6993323 100644
--- a/doc/html/a00159.html
+++ b/doc/html/a00163.html
@@ -20,23 +20,24 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::movable_exception< ExceptionData > Member List</h1>This is the complete list of members for <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>data</b>() (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>data</b>() const (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#7a46873119d9f85a7b0009c13e41a258">destroy</a>()</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const ExceptionData &data_) (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const movable_exception &src) (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a>()</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>() const </td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const movable_exception &src) (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#17cffba35811c92b7e65d63506b69602">throw_self</a>()</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a>() const </td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~movable_exception</b>() (defined in <a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::movable_exception< ExceptionData > Member List</h1>This is the complete list of members for <a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>data</b>() (defined in <a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>data</b>() const (defined in <a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#7a46873119d9f85a7b0009c13e41a258">destroy</a>()</td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const ExceptionData &data_) (defined in <a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const movable_exception &src) (defined in <a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a>()</td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>() const </td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00358.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const movable_exception &src) (defined in <a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#17cffba35811c92b7e65d63506b69602">throw_self</a>()</td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a>() const </td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~movable_exception</b>() (defined in <a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~tbb_exception</b>() (defined in <a class="el" href="a00358.html">tbb::tbb_exception</a>)</td><td><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00160.html b/doc/html/a00164.html
similarity index 72%
copy from doc/html/a00160.html
copy to doc/html/a00164.html
index 689f460..d243320 100644
--- a/doc/html/a00160.html
+++ b/doc/html/a00164.html
@@ -20,15 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::tbb_exception_ptr Member List</h1>This is the complete list of members for <a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>allocate</b>() (defined in <a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>allocate</b>(const tbb_exception &tag) (defined in <a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00346.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a>(captured_exception &src)</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00346.html#921875bbacd2c8a5f324c7da7a415262">destroy</a>()</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00346.html#292832fd5c523e3d8081a22247840a1d">throw_self</a>()</td><td><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::internal::tbb_exception_ptr Member List</h1>This is the complete list of members for <a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>allocate</b>() (defined in <a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>allocate</b>(const tbb_exception &tag) (defined in <a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00359.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a>(captured_exception &src)</td><td><a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00359.html#921875bbacd2c8a5f324c7da7a415262">destroy</a>()</td><td><a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00359.html#292832fd5c523e3d8081a22247840a1d">throw_self</a>()</td><td><a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00165.html b/doc/html/a00165.html
deleted file mode 100644
index 85205fc..0000000
--- a/doc/html/a00165.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::internal::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00256.html">tbb::internal::atomic_backoff</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>atomic_backoff</b>() (defined in <a class="el" href="a00256.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00256.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>bounded_pause</b>() (defined in <a class="el" href="a00256.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00256.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00256.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00256.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00256.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00256.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00169.html b/doc/html/a00169.html
index ebb7c32..95f54e8 100644
--- a/doc/html/a00169.html
+++ b/doc/html/a00169.html
@@ -20,12 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::machine_load_store_seq_cst< T, 8 > Member List</h1>This is the complete list of members for <a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>load</b>(const volatile T &location) (defined in <a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td><code> [inline, static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>store</b>(volatile T &location, T value) (defined in <a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::internal::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00268.html">tbb::internal::atomic_backoff</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>atomic_backoff</b>() (defined in <a class="el" href="a00268.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00268.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>bounded_pause</b>() (defined in <a class="el" href="a00268.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00268.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00268.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00268.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00268.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00268.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00169.html b/doc/html/a00173.html
similarity index 83%
copy from doc/html/a00169.html
copy to doc/html/a00173.html
index ebb7c32..4372e5d 100644
--- a/doc/html/a00169.html
+++ b/doc/html/a00173.html
@@ -20,12 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::machine_load_store_seq_cst< T, 8 > Member List</h1>This is the complete list of members for <a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>load</b>(const volatile T &location) (defined in <a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td><code> [inline, static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>store</b>(volatile T &location, T value) (defined in <a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::internal::machine_load_store_seq_cst< T, 8 > Member List</h1>This is the complete list of members for <a class="el" href="a00306.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>load</b>(const volatile T &location) (defined in <a class="el" href="a00306.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00306.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td><code> [inline, static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>store</b>(volatile T &location, T value) (defined in <a class="el" href="a00306.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00306.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00170.html b/doc/html/a00174.html
similarity index 83%
rename from doc/html/a00170.html
rename to doc/html/a00174.html
index cf23eda..ba3eb5f 100644
--- a/doc/html/a00170.html
+++ b/doc/html/a00174.html
@@ -20,12 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::machine_load_store_relaxed< T, S > Member List</h1>This is the complete list of members for <a class="el" href="a00293.html">tbb::internal::machine_load_store_relaxed< T, S ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>load</b>(const volatile T &location) (defined in <a class="el" href="a00293.html">tbb::internal::machine_load_store_relaxed< T, S ></a>)</td><td><a class="el" href="a00293.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td><code> [inline, static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>store</b>(volatile T &location, T value) (defined in <a class="el" href="a00293.html">tbb::internal::machine_load_store_relaxed< T, S ></a>)</td><td><a class="el" href="a00293.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::internal::machine_load_store_relaxed< T, S > Member List</h1>This is the complete list of members for <a class="el" href="a00305.html">tbb::internal::machine_load_store_relaxed< T, S ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>load</b>(const volatile T &location) (defined in <a class="el" href="a00305.html">tbb::internal::machine_load_store_relaxed< T, S ></a>)</td><td><a class="el" href="a00305.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td><code> [inline, static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>store</b>(volatile T &location, T value) (defined in <a class="el" href="a00305.html">tbb::internal::machine_load_store_relaxed< T, S ></a>)</td><td><a class="el" href="a00305.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00179.html b/doc/html/a00179.html
deleted file mode 100644
index 36a0907..0000000
--- a/doc/html/a00179.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::internal::work_around_alignment_bug< Size, T > Member List</h1>This is the complete list of members for <a class="el" href="a00352.html">tbb::internal::work_around_alignment_bug< Size, T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>alignment</b> (defined in <a class="el" href="a00352.html">tbb::internal::work_around_alignment_bug< Size, T ></a>)</td><td><a class="el" href="a00352.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td><code> [static]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00183.html b/doc/html/a00183.html
index ee5ff29..5a1562b 100644
--- a/doc/html/a00183.html
+++ b/doc/html/a00183.html
@@ -20,13 +20,11 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::tick_count Member List</h1>This is the complete list of members for <a class="el" href="a00349.html">tbb::tick_count</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00349.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00349.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00349.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00349.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00349.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00349.html">tbb::tick_count</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::internal::work_around_alignment_bug< Size, T > Member List</h1>This is the complete list of members for <a class="el" href="a00365.html">tbb::internal::work_around_alignment_bug< Size, T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>alignment</b> (defined in <a class="el" href="a00365.html">tbb::internal::work_around_alignment_bug< Size, T ></a>)</td><td><a class="el" href="a00365.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td><code> [static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00183.html b/doc/html/a00188.html
similarity index 70%
copy from doc/html/a00183.html
copy to doc/html/a00188.html
index ee5ff29..e9e10fe 100644
--- a/doc/html/a00183.html
+++ b/doc/html/a00188.html
@@ -20,13 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::tick_count Member List</h1>This is the complete list of members for <a class="el" href="a00349.html">tbb::tick_count</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00349.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00349.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00349.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00349.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00349.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00349.html">tbb::tick_count</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::tick_count Member List</h1>This is the complete list of members for <a class="el" href="a00362.html">tbb::tick_count</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00362.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00362.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00362.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00362.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00362.html#8aaa5ac47975a1b0fa3e95752281159e">resolution</a>()</td><td><a class="el" href="a00362.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00362.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00362.html">tbb::tick_count</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00184.html b/doc/html/a00189.html
similarity index 66%
rename from doc/html/a00184.html
rename to doc/html/a00189.html
index e402627..74e4f6a 100644
--- a/doc/html/a00184.html
+++ b/doc/html/a00189.html
@@ -20,19 +20,19 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::tick_count::interval_t Member List</h1>This is the complete list of members for <a class="el" href="a00350.html">tbb::tick_count::interval_t</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>()</td><td><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00350.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a>(double sec)</td><td><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00350.html#5871ead1ca230efbe52a5008470e6428">operator+</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00350.html#cd9814947902e26463a69a111530f81b">operator+=</a>(const interval_t &i)</td><td><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00350.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00350.html#fa509691e1d689830931e36edd274f76">operator-</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00350.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>(const interval_t &i)</td><td><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00350.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() const </td><td><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb::tick_count</b> (defined in <a class="el" href="a00350.html">tbb::tick_count::interval_t</a>)</td><td><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::tick_count::interval_t Member List</h1>This is the complete list of members for <a class="el" href="a00363.html">tbb::tick_count::interval_t</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00363.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>()</td><td><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00363.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a>(double sec)</td><td><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00363.html#5871ead1ca230efbe52a5008470e6428">operator+</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00363.html#cd9814947902e26463a69a111530f81b">operator+=</a>(const interval_t &i)</td><td><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00363.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00363.html#fa509691e1d689830931e36edd274f76">operator-</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00363.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>(const interval_t &i)</td><td><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00363.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() const </td><td><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb::tick_count</b> (defined in <a class="el" href="a00363.html">tbb::tick_count::interval_t</a>)</td><td><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00249.html b/doc/html/a00249.html
deleted file mode 100644
index efaa794..0000000
--- a/doc/html/a00249.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::affinity_partitioner Class Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00249.html">affinity_partitioner</a></div>
-<h1>tbb::affinity_partitioner Class Reference</h1><!-- doxytag: class="tbb::affinity_partitioner" --><!-- doxytag: inherits="tbb::internal::affinity_partitioner_base_v3" -->An affinity partitioner.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00575.html">partitioner.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::affinity_partitioner:
-<p><center><img src="a00249.png" usemap="#tbb::affinity_partitioner_map" border="0" alt=""></center>
-<map name="tbb::affinity_partitioner_map">
-<area href="a00250.html" alt="tbb::internal::affinity_partitioner_base_v3" shape="rect" coords="0,0,240,24">
-</map>
-<a href="a00104.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f730f70d21df405adaebfc2018f59cd"></a><!-- doxytag: member="tbb::affinity_partitioner::serial::interface6::start_for" ref="5f730f70d21df405adaebfc2018f59cd" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>serial::interface6::start_for</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a4cd0ffed4fad0d9af2c5efdaf586a8"></a><!-- doxytag: member="tbb::affinity_partitioner::interface6::internal::start_for" ref="8a4cd0ffed4fad0d9af2c5efdaf586a8" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_for</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86f0750233dd6c83b65fb684338fd09f"></a><!-- doxytag: member="tbb::affinity_partitioner::interface6::internal::start_reduce" ref="86f0750233dd6c83b65fb684338fd09f" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_reduce</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-An affinity partitioner.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00575.html">partitioner.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00250.html b/doc/html/a00250.html
deleted file mode 100644
index 287624f..0000000
--- a/doc/html/a00250.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::affinity_partitioner_base_v3 Class Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>internal</b>::<a class="el" href="a00250.html">affinity_partitioner_base_v3</a></div>
-<h1>tbb::internal::affinity_partitioner_base_v3 Class Reference</h1><!-- doxytag: class="tbb::internal::affinity_partitioner_base_v3" -->Defines entry point for affinity partitioner into tbb run-time library.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00575.html">partitioner.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::internal::affinity_partitioner_base_v3:
-<p><center><img src="a00250.png" usemap="#tbb::internal::affinity_partitioner_base_v3_map" border="0" alt=""></center>
-<map name="tbb::internal::affinity_partitioner_base_v3_map">
-<area href="a00249.html" alt="tbb::affinity_partitioner" shape="rect" coords="0,56,240,80">
-</map>
-<a href="a00099.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa554f840d8ef010ff2650bac032ec01"></a><!-- doxytag: member="tbb::internal::affinity_partitioner_base_v3::tbb::affinity_partitioner" ref="fa554f840d8ef010ff2650bac032ec01" args="" -->
-class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#fa554f840d8ef010ff2650bac032ec01">tbb::affinity_partitioner</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6d1d1f136cb6105d06ddbcf67107575"></a><!-- doxytag: member="tbb::internal::affinity_partitioner_base_v3::tbb::interface6::internal::affinity_partition_type" ref="c6d1d1f136cb6105d06ddbcf67107575" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::internal::affinity_partition_type</b></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Defines entry point for affinity partitioner into tbb run-time library.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00575.html">partitioner.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00250.png b/doc/html/a00250.png
deleted file mode 100644
index 18c7d58..0000000
Binary files a/doc/html/a00250.png and /dev/null differ
diff --git a/doc/html/a00251.html b/doc/html/a00251.html
deleted file mode 100644
index af0be41..0000000
--- a/doc/html/a00251.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::aggregator Class Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00251.html">aggregator</a></div>
-<h1>tbb::interface6::aggregator Class Reference</h1><!-- doxytag: class="tbb::interface6::aggregator" --><!-- doxytag: inherits="tbb::interface6::aggregator_ext" -->Basic aggregator interface.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00432.html">aggregator.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::interface6::aggregator:
-<p><center><img src="a00251.png" usemap="#tbb::interface6::aggregator_map" border="0" alt=""></center>
-<map name="tbb::interface6::aggregator_map">
-<area href="a00252.html" alt="tbb::interface6::aggregator_ext< handler_type >" shape="rect" coords="0,0,281,24">
-</map>
-<a href="a00006.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00251.html#641c8dc43652589d12eefaef130c094d">execute</a> (const Body &b)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">BASIC INTERFACE: Enter a function for exclusvie execution by the aggregator. <a href="#641c8dc43652589d12eefaef130c094d"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Basic aggregator interface.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="641c8dc43652589d12eefaef130c094d"></a><!-- doxytag: member="tbb::interface6::aggregator::execute" ref="641c8dc43652589d12eefaef130c094d" args="(const Body &b)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Body> </div>
- <table class="memname">
- <tr>
- <td class="memname">void tbb::interface6::aggregator::execute </td>
- <td>(</td>
- <td class="paramtype">const Body & </td>
- <td class="paramname"> <em>b</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-BASIC INTERFACE: Enter a function for exclusvie execution by the aggregator.
-<p>
-The calling thread stores the function object in a basic_operation and places the operation in the aggregator's mailbox
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00432.html">aggregator.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00251.png b/doc/html/a00251.png
deleted file mode 100644
index 123e10d..0000000
Binary files a/doc/html/a00251.png and /dev/null differ
diff --git a/doc/html/a00252.html b/doc/html/a00252.html
deleted file mode 100644
index 4300fd3..0000000
--- a/doc/html/a00252.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::aggregator_ext< handler_type > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00252.html">aggregator_ext</a></div>
-<h1>tbb::interface6::aggregator_ext< handler_type > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::aggregator_ext" -->Aggregator base class and expert interface.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00432.html">aggregator.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::interface6::aggregator_ext< handler_type >:
-<p><center><img src="a00252.png" usemap="#tbb::interface6::aggregator_ext< handler_type >_map" border="0" alt=""></center>
-<map name="tbb::interface6::aggregator_ext< handler_type >_map">
-<area href="a00251.html" alt="tbb::interface6::aggregator" shape="rect" coords="0,56,281,80">
-</map>
-<a href="a00005.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="882115f59b5a15b2f4fc54178ad66cd9"></a><!-- doxytag: member="tbb::interface6::aggregator_ext::aggregator_ext" ref="882115f59b5a15b2f4fc54178ad66cd9" args="(const handler_type &h)" -->
- </td><td class="memItemRight" valign="bottom"><b>aggregator_ext</b> (const handler_type &h)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00252.html#ccd88bf4333dc100ba97da8e2170277d">process</a> (aggregator_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">EXPERT INTERFACE: Enter a user-made operation into the aggregator's mailbox. <a href="#ccd88bf4333dc100ba97da8e2170277d"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00252.html#fdd0a9ce522246b9e14ae5e44bc72d31">execute_impl</a> (aggregator_operation &op)</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename handler_type><br>
- class tbb::interface6::aggregator_ext< handler_type ></h3>
-
-Aggregator base class and expert interface.
-<p>
-An aggregator for collecting operations coming from multiple sources and executing them serially on a single thread.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="fdd0a9ce522246b9e14ae5e44bc72d31"></a><!-- doxytag: member="tbb::interface6::aggregator_ext::execute_impl" ref="fdd0a9ce522246b9e14ae5e44bc72d31" args="(aggregator_operation &op)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename handler_type> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00252.html">tbb::interface6::aggregator_ext</a>< handler_type >::execute_impl </td>
- <td>(</td>
- <td class="paramtype">aggregator_operation & </td>
- <td class="paramname"> <em>op</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, protected]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Place operation in mailbox, then either handle mailbox or wait for the operation to be completed by a different thread.
-</div>
-</div><p>
-<a class="anchor" name="ccd88bf4333dc100ba97da8e2170277d"></a><!-- doxytag: member="tbb::interface6::aggregator_ext::process" ref="ccd88bf4333dc100ba97da8e2170277d" args="(aggregator_operation *op)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename handler_type> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00252.html">tbb::interface6::aggregator_ext</a>< handler_type >::process </td>
- <td>(</td>
- <td class="paramtype">aggregator_operation * </td>
- <td class="paramname"> <em>op</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-EXPERT INTERFACE: Enter a user-made operation into the aggregator's mailbox.
-<p>
-Details of user-made operations must be handled by user-provided handler
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00432.html">aggregator.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00253.html b/doc/html/a00253.html
deleted file mode 100644
index 2e7bd94..0000000
--- a/doc/html/a00253.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::aligned_space< T, N > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00253.html">aligned_space</a></div>
-<h1>tbb::aligned_space< T, N > Class Template Reference<br>
-<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::aligned_space" -->Block of space aligned sufficiently to construct an array T with N elements.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00440.html">aligned_space.h</a>></code>
-<p>
-<a href="a00007.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d702fc6b9e9d061ace3501b3c861cdf"></a><!-- doxytag: member="tbb::aligned_space::begin" ref="0d702fc6b9e9d061ace3501b3c861cdf" args="()" -->
-T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to beginning of array. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="024be075c23c0394c9a2518d993bcd9e"></a><!-- doxytag: member="tbb::aligned_space::end" ref="024be075c23c0394c9a2518d993bcd9e" args="()" -->
-T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#024be075c23c0394c9a2518d993bcd9e">end</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to one past last element in array. <br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, size_t N><br>
- class tbb::aligned_space< T, N ></h3>
-
-Block of space aligned sufficiently to construct an array T with N elements.
-<p>
-The elements are not constructed or destroyed by this class.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00440.html">aligned_space.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00255.html b/doc/html/a00255.html
deleted file mode 100644
index 6b2eece..0000000
--- a/doc/html/a00255.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::atomic< void * > Struct Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00255.html">atomic< void * ></a></div>
-<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00255.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00441.html">atomic.h</a>></code>
-<p>
-<a href="a00009.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ba6e74163e255b88c497c40db64c5dad"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="ba6e74163e255b88c497c40db64c5dad" args="(void *rhs)" -->
-void * </td><td class="memItemRight" valign="bottom"><b>operator=</b> (void *rhs)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="37979e62d1f88eb45bd3ad7df5a140f8"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="37979e62d1f88eb45bd3ad7df5a140f8" args="(const atomic< void * > &rhs)" -->
-<a class="el" href="a00254.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00254.html">atomic</a>< void * > &rhs)</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- struct tbb::atomic< void * ></h3>
-
-Specialization for <a class="el" href="a00255.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
-<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00441.html">atomic.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00256.html b/doc/html/a00256.html
deleted file mode 100644
index bd57357..0000000
--- a/doc/html/a00256.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::atomic_backoff Class Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>internal</b>::<a class="el" href="a00256.html">atomic_backoff</a></div>
-<h1>tbb::internal::atomic_backoff Class Reference</h1><!-- doxytag: class="tbb::internal::atomic_backoff" -->Class that implements exponential backoff.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00640.html">tbb_machine.h</a>></code>
-<p>
-<a href="a00165.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a174ea93e3bd3d5cce82389c2f28d037"></a><!-- doxytag: member="tbb::internal::atomic_backoff::pause" ref="a174ea93e3bd3d5cce82389c2f28d037" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pause for a while. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6179b19e2e8dedd73a36d523af2fe12"></a><!-- doxytag: member="tbb::internal::atomic_backoff::bounded_pause" ref="c6179b19e2e8dedd73a36d523af2fe12" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>bounded_pause</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45edb535489eb0e76ecc59a19fd952de"></a><!-- doxytag: member="tbb::internal::atomic_backoff::reset" ref="45edb535489eb0e76ecc59a19fd952de" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Class that implements exponential backoff.
-<p>
-See implementation of spin_wait_while_eq for an example.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00640.html">tbb_machine.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00257.html b/doc/html/a00257.html
deleted file mode 100644
index ad7e043..0000000
--- a/doc/html/a00257.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::auto_partitioner Class Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00257.html">auto_partitioner</a></div>
-<h1>tbb::auto_partitioner Class Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::auto_partitioner" -->An auto partitioner.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00575.html">partitioner.h</a>></code>
-<p>
-<a href="a00103.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f730f70d21df405adaebfc2018f59cd"></a><!-- doxytag: member="tbb::auto_partitioner::serial::interface6::start_for" ref="5f730f70d21df405adaebfc2018f59cd" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>serial::interface6::start_for</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a4cd0ffed4fad0d9af2c5efdaf586a8"></a><!-- doxytag: member="tbb::auto_partitioner::interface6::internal::start_for" ref="8a4cd0ffed4fad0d9af2c5efdaf586a8" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_for</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86f0750233dd6c83b65fb684338fd09f"></a><!-- doxytag: member="tbb::auto_partitioner::interface6::internal::start_reduce" ref="86f0750233dd6c83b65fb684338fd09f" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_reduce</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-An auto partitioner.
-<p>
-The range is initial divided into several large chunks. Chunks are further subdivided into smaller pieces if demand detected and they are divisible.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00575.html">partitioner.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00259.html b/doc/html/a00259.html
deleted file mode 100644
index 84c752a..0000000
--- a/doc/html/a00259.html
+++ /dev/null
@@ -1,224 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::blocked_range< Value > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00259.html">blocked_range</a></div>
-<h1>tbb::blocked_range< Value > Class Template Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::blocked_range" -->A range over which to iterate.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00449.html">blocked_range.h</a>></code>
-<p>
-<a href="a00010.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef Value </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of a value. <a href="#1a8d05842c2b3dfc177bc4d347e4cef7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f5707bffea38eee5c9680f37358afb8e"></a><!-- doxytag: member="tbb::blocked_range::size_type" ref="f5707bffea38eee5c9680f37358afb8e" args="" -->
-typedef std::size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of a range. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#94607755c5110d199202234d58d022ac">blocked_range</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range with default-constructed values for begin and end. <a href="#94607755c5110d199202234d58d022ac"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14795a36ead1414b4371dbe1a4656359"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="14795a36ead1414b4371dbe1a4656359" args="(Value begin_, Value end_, size_type grainsize_=1)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range over half-open interval [begin,end), with the given grainsize. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="18d2258400756ac1446dac7676b18df3"></a><!-- doxytag: member="tbb::blocked_range::begin" ref="18d2258400756ac1446dac7676b18df3" args="() const " -->
-<a class="el" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#18d2258400756ac1446dac7676b18df3">begin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Beginning of range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8b929d93ddc13f148b11bceef3a3bdf8"></a><!-- doxytag: member="tbb::blocked_range::end" ref="8b929d93ddc13f148b11bceef3a3bdf8" args="() const " -->
-<a class="el" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">One past last value in range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Size of the range. <a href="#9eaa0b6beff1420f688570bbf6b8c462"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2"></a><!-- doxytag: member="tbb::blocked_range::grainsize" ref="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2" args="() const " -->
-<a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The grain size for this range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f4f02f530eb3f2e7ea26e06f76aef9d"></a><!-- doxytag: member="tbb::blocked_range::empty" ref="8f4f02f530eb3f2e7ea26e06f76aef9d" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible. <a href="#41a58b703d574b6e1ca155df3576f578"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00259.html">blocked_range</a> &r, <a class="el" href="a00335.html">split</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Split range. <a href="#4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="395a514a55017e36d571809f1223389b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range2d" ref="395a514a55017e36d571809f1223389b" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13d172a4da9be197033e64516fff1f4b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range3d" ref="13d172a4da9be197033e64516fff1f4b" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Value><br>
- class tbb::blocked_range< Value ></h3>
-
-A range over which to iterate.
-<p>
-<hr><h2>Member Typedef Documentation</h2>
-<a class="anchor" name="1a8d05842c2b3dfc177bc4d347e4cef7"></a><!-- doxytag: member="tbb::blocked_range::const_iterator" ref="1a8d05842c2b3dfc177bc4d347e4cef7" args="" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname">typedef Value <a class="el" href="a00259.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Type of a value.
-<p>
-Called a const_iterator for sake of algorithms that need to treat a <a class="el" href="a00259.html">blocked_range</a> as an STL container.
-</div>
-</div><p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="94607755c5110d199202234d58d022ac"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="94607755c5110d199202234d58d022ac" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00259.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00259.html">blocked_range</a> </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Construct range with default-constructed values for begin and end.
-<p>
-Requires that Value have a default constructor.
-</div>
-</div><p>
-<a class="anchor" name="4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="4c0efd2be3f96a0ab3ba5085e8b3fcc7" args="(blocked_range &r, split)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00259.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00259.html">blocked_range</a> </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00259.html">blocked_range</a>< Value > & </td>
- <td class="paramname"> <em>r</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="a00335.html">split</a> </td>
- <td class="paramname"></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Split range.
-<p>
-The new Range *this has the second half, the old range r has the first half. Unspecified if <a class="el" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00259.html#18d2258400756ac1446dac7676b18df3">begin()</a> or !is_divisible().
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="41a58b703d574b6e1ca155df3576f578"></a><!-- doxytag: member="tbb::blocked_range::is_divisible" ref="41a58b703d574b6e1ca155df3576f578" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00259.html">tbb::blocked_range</a>< Value >::is_divisible </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-True if range is divisible.
-<p>
-Unspecified if <a class="el" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00259.html#18d2258400756ac1446dac7676b18df3">begin()</a>.
-</div>
-</div><p>
-<a class="anchor" name="9eaa0b6beff1420f688570bbf6b8c462"></a><!-- doxytag: member="tbb::blocked_range::size" ref="9eaa0b6beff1420f688570bbf6b8c462" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00259.html">tbb::blocked_range</a>< Value >::size </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Size of the range.
-<p>
-Unspecified if <a class="el" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00259.html#18d2258400756ac1446dac7676b18df3">begin()</a>.
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00449.html">blocked_range.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00260.html b/doc/html/a00260.html
deleted file mode 100644
index 330e299..0000000
--- a/doc/html/a00260.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00260.html">blocked_range2d</a></div>
-<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::blocked_range2d" -->A 2-dimensional range that models the Range concept.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00450.html">blocked_range2d.h</a>></code>
-<p>
-<a href="a00011.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807a22fe658ec38b8edfd69521d0383"></a><!-- doxytag: member="tbb::blocked_range2d::row_range_type" ref="a807a22fe658ec38b8edfd69521d0383" args="" -->
-typedef <a class="el" href="a00259.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteration range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="750d5c6ac9915443df477a30031c07fd"></a><!-- doxytag: member="tbb::blocked_range2d::col_range_type" ref="750d5c6ac9915443df477a30031c07fd" args="" -->
-typedef <a class="el" href="a00259.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4180bc35d4f8ed9f20045dba4f2a1bdc"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4180bc35d4f8ed9f20045dba4f2a1bdc" args="(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, typename <a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="485434db1609b2074d86cb604f3c674e"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="485434db1609b2074d86cb604f3c674e" args="(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d144cb2d88cef553420311aca8667a44"></a><!-- doxytag: member="tbb::blocked_range2d::empty" ref="d144cb2d88cef553420311aca8667a44" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html#d144cb2d88cef553420311aca8667a44">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad36a9b38e4fef26d376f99552ce2d92"></a><!-- doxytag: member="tbb::blocked_range2d::is_divisible" ref="ad36a9b38e4fef26d376f99552ce2d92" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f80e6db02bfa4e90e2a219de9f17461"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4f80e6db02bfa4e90e2a219de9f17461" args="(blocked_range2d &r, split)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (<a class="el" href="a00260.html">blocked_range2d</a> &r, <a class="el" href="a00335.html">split</a>)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f496e7348a82652fba581203477cc07c"></a><!-- doxytag: member="tbb::blocked_range2d::rows" ref="f496e7348a82652fba581203477cc07c" args="() const " -->
-const <a class="el" href="a00259.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html#f496e7348a82652fba581203477cc07c">rows</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="392a46759af2c884957115771affa7f4"></a><!-- doxytag: member="tbb::blocked_range2d::cols" ref="392a46759af2c884957115771affa7f4" args="() const " -->
-const <a class="el" href="a00259.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html#392a46759af2c884957115771affa7f4">cols</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename RowValue, typename ColValue = RowValue><br>
- class tbb::blocked_range2d< RowValue, ColValue ></h3>
-
-A 2-dimensional range that models the Range concept.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00450.html">blocked_range2d.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00261.html b/doc/html/a00261.html
index b72441d..0537cc6 100644
--- a/doc/html/a00261.html
+++ b/doc/html/a00261.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference</title>
+<title>tbb::affinity_partitioner Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,70 +21,41 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00261.html">blocked_range3d</a></div>
-<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::blocked_range3d" -->A 3-dimensional range that models the Range concept.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00261.html">affinity_partitioner</a></div>
+<h1>tbb::affinity_partitioner Class Reference</h1><!-- doxytag: class="tbb::affinity_partitioner" --><!-- doxytag: inherits="tbb::internal::affinity_partitioner_base_v3" -->An affinity partitioner.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00451.html">blocked_range3d.h</a>></code>
+<code>#include <partitioner.h></code>
<p>
-<a href="a00012.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::affinity_partitioner:
+<p><center><img src="a00261.png" usemap="#tbb::affinity_partitioner_map" border="0" alt=""></center>
+<map name="tbb::affinity_partitioner_map">
+<area href="a00262.html" alt="tbb::internal::affinity_partitioner_base_v3" shape="rect" coords="0,0,240,24">
+</map>
+<a href="a00106.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8ebf17a552ba47825e9b3887855b719"></a><!-- doxytag: member="tbb::blocked_range3d::page_range_type" ref="b8ebf17a552ba47825e9b3887855b719" args="" -->
-typedef <a class="el" href="a00259.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f730f70d21df405adaebfc2018f59cd"></a><!-- doxytag: member="tbb::affinity_partitioner::serial::interface6::start_for" ref="5f730f70d21df405adaebfc2018f59cd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>serial::interface6::start_for</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteration range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4edc39b1a76c84c8f43ea8bff3e88007"></a><!-- doxytag: member="tbb::blocked_range3d::row_range_type" ref="4edc39b1a76c84c8f43ea8bff3e88007" args="" -->
-typedef <a class="el" href="a00259.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><b>row_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a4cd0ffed4fad0d9af2c5efdaf586a8"></a><!-- doxytag: member="tbb::affinity_partitioner::interface6::internal::start_for" ref="8a4cd0ffed4fad0d9af2c5efdaf586a8" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_for</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02229b59d4dc5437bf5fbe72acca7f66"></a><!-- doxytag: member="tbb::blocked_range3d::col_range_type" ref="02229b59d4dc5437bf5fbe72acca7f66" args="" -->
-typedef <a class="el" href="a00259.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86f0750233dd6c83b65fb684338fd09f"></a><!-- doxytag: member="tbb::affinity_partitioner::interface6::internal::start_reduce" ref="86f0750233dd6c83b65fb684338fd09f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_reduce</b></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a762f420ed83a887967cb7dfe337582c"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a762f420ed83a887967cb7dfe337582c" args="(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b4dcf5b059634b95c1671086bf6d4ff"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="0b4dcf5b059634b95c1671086bf6d4ff" args="(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_gr [...]
- </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, typename <a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00259.html#f5707bffea38eee [...]
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="356860e1c977d91711e8216bd55c0b25"></a><!-- doxytag: member="tbb::blocked_range3d::empty" ref="356860e1c977d91711e8216bd55c0b25" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html#356860e1c977d91711e8216bd55c0b25">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39d69191721c488e737ae5d9c5336b9c"></a><!-- doxytag: member="tbb::blocked_range3d::is_divisible" ref="39d69191721c488e737ae5d9c5336b9c" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0d6f0085c9fb364ddcbc2197da6c251"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a0d6f0085c9fb364ddcbc2197da6c251" args="(blocked_range3d &r, split)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (<a class="el" href="a00261.html">blocked_range3d</a> &r, <a class="el" href="a00335.html">split</a>)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf971430aa12361d3ed245344b7c6764"></a><!-- doxytag: member="tbb::blocked_range3d::pages" ref="cf971430aa12361d3ed245344b7c6764" args="() const " -->
-const <a class="el" href="a00259.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html#cf971430aa12361d3ed245344b7c6764">pages</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The pages of the iteration space. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1584623e59ff32a8aa82006827508be4"></a><!-- doxytag: member="tbb::blocked_range3d::rows" ref="1584623e59ff32a8aa82006827508be4" args="() const " -->
-const <a class="el" href="a00259.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html#1584623e59ff32a8aa82006827508be4">rows</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3336ba9480fd6c43e158f9beb024c050"></a><!-- doxytag: member="tbb::blocked_range3d::cols" ref="3336ba9480fd6c43e158f9beb024c050" args="() const " -->
-const <a class="el" href="a00259.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html#3336ba9480fd6c43e158f9beb024c050">cols</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename PageValue, typename RowValue = PageValue, typename ColValue = RowValue><br>
- class tbb::blocked_range3d< PageValue, RowValue, ColValue ></h3>
-
-A 3-dimensional range that models the Range concept.
+An affinity partitioner.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00451.html">blocked_range3d.h</a></ul>
+<li>partitioner.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00249.png b/doc/html/a00261.png
similarity index 100%
rename from doc/html/a00249.png
rename to doc/html/a00261.png
diff --git a/doc/html/a00262.html b/doc/html/a00262.html
index c4b0dd8..50aec7e 100644
--- a/doc/html/a00262.html
+++ b/doc/html/a00262.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::broadcast_node< T > Class Template Reference</title>
+<title>tbb::internal::affinity_partitioner_base_v3 Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,69 +21,35 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00262.html">broadcast_node</a></div>
-<h1>tbb::flow::interface6::broadcast_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::broadcast_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::receiver,tbb::flow::interface6::sender" -->Forwards messages of type T to all successors.
+<a class="el" href="a00428.html">tbb</a>::<b>internal</b>::<a class="el" href="a00262.html">affinity_partitioner_base_v3</a></div>
+<h1>tbb::internal::affinity_partitioner_base_v3 Class Reference</h1><!-- doxytag: class="tbb::internal::affinity_partitioner_base_v3" -->Defines entry point for affinity partitioner into tbb run-time library.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <partitioner.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::broadcast_node< T >:
-<p><center><img src="a00262.png" usemap="#tbb::flow::interface6::broadcast_node< T >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::broadcast_node< T >_map">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,249,24">
-<area href="a00321.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="259,0,508,24">
-<area href="a00327.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="518,0,767,24">
+<p>Inheritance diagram for tbb::internal::affinity_partitioner_base_v3:
+<p><center><img src="a00262.png" usemap="#tbb::internal::affinity_partitioner_base_v3_map" border="0" alt=""></center>
+<map name="tbb::internal::affinity_partitioner_base_v3_map">
+<area href="a00261.html" alt="tbb::affinity_partitioner" shape="rect" coords="0,56,240,80">
</map>
-<a href="a00071.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00101.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="43c775d80e98cc601de69764983319f9"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::input_type" ref="43c775d80e98cc601de69764983319f9" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#43c775d80e98cc601de69764983319f9">input_type</a></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa554f840d8ef010ff2650bac032ec01"></a><!-- doxytag: member="tbb::internal::affinity_partitioner_base_v3::tbb::affinity_partitioner" ref="fa554f840d8ef010ff2650bac032ec01" args="" -->
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#fa554f840d8ef010ff2650bac032ec01">tbb::affinity_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fd8d3075823e08b879be46c1215ab0f"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::output_type" ref="8fd8d3075823e08b879be46c1215ab0f" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6d1d1f136cb6105d06ddbcf67107575"></a><!-- doxytag: member="tbb::internal::affinity_partitioner_base_v3::tbb::interface6::internal::affinity_partition_type" ref="c6d1d1f136cb6105d06ddbcf67107575" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::internal::affinity_partition_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e2ad9a121cb286aa0d0142fef33c646"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::predecessor_type" ref="0e2ad9a121cb286aa0d0142fef33c646" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< <a class="el" href="a00262.html#43c775d80e98cc601de69764983319f9">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#0e2ad9a121cb286aa0d0142fef33c646">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cc6a0eb1c4ee65465770628d8366f055"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::successor_type" ref="cc6a0eb1c4ee65465770628d8366f055" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00262.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#cc6a0eb1c4ee65465770628d8366f055">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="89e20f24ae56d38a5ee52f8d41e1a79c"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::broadcast_node" ref="89e20f24ae56d38a5ee52f8d41e1a79c" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><b>broadcast_node</b> (<a class="el" href="a00288.html">graph</a> &g)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bdcf84bf5b52c3af2d5332dc9d5fec07"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::broadcast_node" ref="bdcf84bf5b52c3af2d5332dc9d5fec07" args="(const broadcast_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><b>broadcast_node</b> (const <a class="el" href="a00262.html">broadcast_node</a> &src)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fd0324c9ddb51fe6f95b3d015d338941"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::register_successor" ref="fd0324c9ddb51fe6f95b3d015d338941" args="(receiver< T > &r)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a> (<a class="el" href="a00321.html">receiver</a>< T > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Adds a successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="366efcc046ec08a104281109801ae629"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::remove_successor" ref="366efcc046ec08a104281109801ae629" args="(receiver< T > &r)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#366efcc046ec08a104281109801ae629">remove_successor</a> (<a class="el" href="a00321.html">receiver</a>< T > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes s as a successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="29eb768c10b377880bbf83d31ee49acf"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::try_put" ref="29eb768c10b377880bbf83d31ee49acf" args="(const T &t)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#29eb768c10b377880bbf83d31ee49acf">try_put</a> (const T &t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Put an item to the receiver. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::flow::interface6::broadcast_node< T ></h3>
-
-Forwards messages of type T to all successors.
+Defines entry point for affinity partitioner into tbb run-time library.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>partitioner.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00262.png b/doc/html/a00262.png
index 5a7b1d5..18c7d58 100644
Binary files a/doc/html/a00262.png and b/doc/html/a00262.png differ
diff --git a/doc/html/a00263.html b/doc/html/a00263.html
index 3eb6bf4..563460b 100644
--- a/doc/html/a00263.html
+++ b/doc/html/a00263.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::buffer_node< T, A > Class Template Reference</title>
+<title>tbb::interface6::aggregator Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,388 +21,58 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00263.html">buffer_node</a></div>
-<h1>tbb::flow::interface6::buffer_node< T, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::buffer_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::receiver,tbb::flow::interface6::sender" -->Forwards messages in arbitrary order.
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00263.html">aggregator</a></div>
+<h1>tbb::interface6::aggregator Class Reference</h1><!-- doxytag: class="tbb::interface6::aggregator" --><!-- doxytag: inherits="tbb::interface6::aggregator_ext" -->Basic aggregator interface.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <aggregator.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::buffer_node< T, A >:
-<p><center><img src="a00263.png" usemap="#tbb::flow::interface6::buffer_node< T, A >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::buffer_node< T, A >_map">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,352,24">
-<area href="a00321.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="362,0,714,24">
-<area href="a00327.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="724,0,1076,24">
-<area href="a00312.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
-<area href="a00313.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
-<area href="a00328.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
+<p>Inheritance diagram for tbb::interface6::aggregator:
+<p><center><img src="a00263.png" usemap="#tbb::interface6::aggregator_map" border="0" alt=""></center>
+<map name="tbb::interface6::aggregator_map">
+<area href="a00264.html" alt="tbb::interface6::aggregator_ext< handler_type >" shape="rect" coords="0,0,281,24">
</map>
-<a href="a00072.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00006.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="334efb81b56a2f2b3ae08a16e8d65620"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::input_type" ref="334efb81b56a2f2b3ae08a16e8d65620" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="089520db81f6a1551dc94c01efbdd7be"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::output_type" ref="089520db81f6a1551dc94c01efbdd7be" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#089520db81f6a1551dc94c01efbdd7be">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fb0ad03a822ca0fc34ad5d56a4093a2"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::predecessor_type" ref="5fb0ad03a822ca0fc34ad5d56a4093a2" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< <a class="el" href="a00263.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#5fb0ad03a822ca0fc34ad5d56a4093a2">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="66f7eda69b75e08f50726e50a11429cd"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::successor_type" ref="66f7eda69b75e08f50726e50a11429cd" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00263.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17ee32d233db52b86256480d5f048e16"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_class" ref="17ee32d233db52b86256480d5f048e16" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A > </td><td class="memItemRight" valign="bottom"><b>my_class</b></td></tr>
-
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fe4b79f780586ff66e002ce32a5c60d"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::buffer_node" ref="5fe4b79f780586ff66e002ce32a5c60d" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a> (<a class="el" href="a00288.html">graph</a> &g)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="03ad7b85a8341437f584af06ad050cdc"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::buffer_node" ref="03ad7b85a8341437f584af06ad050cdc" args="(const buffer_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a> (const <a class="el" href="a00263.html">buffer_node</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#f8bf4944ede4fc106423d67715beb695">register_successor</a> (<a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00263.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Adds a new successor. <a href="#f8bf4944ede4fc106423d67715beb695"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a> (<a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00263.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor. <a href="#2074da0e39b9477c32897d6e5786196f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#aeb8aec46ca99ca022356a792c46735e">try_get</a> (T &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the <a class="el" href="a00263.html">buffer_node</a>. <a href="#aeb8aec46ca99ca022356a792c46735e"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a> (T &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item. <a href="#1cc889bb6c38bcb81757d0ebbc3a5e64"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item. <a href="#2c8e8f2f5f4ff5be27136cc1184a3c3e"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes a reserved item. <a href="#8ef07c434eb763d947a7b4e80c086a49"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#2b02fe332e704bbe14f297802298b63a">try_put</a> (const T &t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Receive an item. <a href="#2b02fe332e704bbe14f297802298b63a"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bdeda814bba6d687b62449e8d7b8001"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::size_type" ref="3bdeda814bba6d687b62449e8d7b8001" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5da41039fc224257fc16df21ea78351c"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_handler" ref="5da41039fc224257fc16df21ea78351c" args="" -->
-typedef internal::aggregating_functor<<br>
- <a class="el" href="a00263.html">my_class</a>, buffer_operation > </td><td class="memItemRight" valign="bottom"><b>my_handler</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579ba61e9d48b022a45d302fb7cc2e99587"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::reg_succ" ref="27ef87d052ece9366a56e5dfd8017579ba61e9d48b022a45d302fb7cc2e99587" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>reg_succ</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579e5c114ade89a63b1d44116994be56f94"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::rem_succ" ref="27ef87d052ece9366a56e5dfd8017579e5c114ade89a63b1d44116994be56f94" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>rem_succ</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579b830235026f7286b15954d74559baeb8"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::req_item" ref="27ef87d052ece9366a56e5dfd8017579b830235026f7286b15954d74559baeb8" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>req_item</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579014be13638194a9fe0b10201be74847e"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::res_item" ref="27ef87d052ece9366a56e5dfd8017579014be13638194a9fe0b10201be74847e" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>res_item</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579d451e6807b6f8238c3fed708789c9fb3"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::rel_res" ref="27ef87d052ece9366a56e5dfd8017579d451e6807b6f8238c3fed708789c9fb3" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>rel_res</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579b2a86824c712d448bd3ff7c6e905fb48"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::con_res" ref="27ef87d052ece9366a56e5dfd8017579b2a86824c712d448bd3ff7c6e905fb48" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>con_res</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd80175799f00b67eaae74451baf63ea2dc0cb94c"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::put_item" ref="27ef87d052ece9366a56e5dfd80175799f00b67eaae74451baf63ea2dc0cb94c" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>put_item</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579ec0df922a8ffd2153f650732611395c9"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_fwd" ref="27ef87d052ece9366a56e5dfd8017579ec0df922a8ffd2153f650732611395c9" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>try_fwd</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca181d774b321a511fd9a9653ce2a60f415a59924de2ce1c447c79a1b278a3a"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::WAIT" ref="0ca181d774b321a511fd9a9653ce2a60f415a59924de2ce1c447c79a1b278a3a" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca181d774b321a511fd9a9653ce2a60159bdd1eb0a3e1245f61a1e3bcca417f"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::SUCCEEDED" ref="0ca181d774b321a511fd9a9653ce2a60159bdd1eb0a3e1245f61a1e3bcca417f" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca181d774b321a511fd9a9653ce2a602c60f32df3cedd3c31dadd0086e5edc4"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::FAILED" ref="0ca181d774b321a511fd9a9653ce2a602c60f32df3cedd3c31dadd0086e5edc4" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>op_type</b> { <br>
- <b>reg_succ</b>,
-<b>rem_succ</b>,
-<b>req_item</b>,
-<b>res_item</b>,
-<br>
- <b>rel_res</b>,
-<b>con_res</b>,
-<b>put_item</b>,
-<b>try_fwd</b>
-<br>
- }</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0,
-<b>SUCCEEDED</b>,
-<b>FAILED</b>
- }</td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c896b8640b606e49f369d1260c041ded"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::handle_operations" ref="c896b8640b606e49f369d1260c041ded" args="(buffer_operation *op_list)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>handle_operations</b> (buffer_operation *op_list)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2648324ce0a38b40132b8502ef250e3a"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::forward" ref="2648324ce0a38b40132b8502ef250e3a" args="()" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#2648324ce0a38b40132b8502ef250e3a">forward</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">This is executed by an enqueued task, the "forwarder". <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="df21388252b8963e839dca29d2c67ea5"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_reg_succ" ref="df21388252b8963e839dca29d2c67ea5" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a> (buffer_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Register successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b6cf76dff80fd679251da93351c1291"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_rem_succ" ref="6b6cf76dff80fd679251da93351c1291" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a> (buffer_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dcbffbae514f4d95205b0845785c0a91"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_forward" ref="dcbffbae514f4d95205b0845785c0a91" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a> (buffer_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="58c70e13ecd40cdaa59cda059e68de51"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_push" ref="58c70e13ecd40cdaa59cda059e68de51" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_push</b> (buffer_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="035cbd758a1a28317ba951e2447e0826"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_pop" ref="035cbd758a1a28317ba951e2447e0826" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (buffer_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4072ad4d1b320d584ea837048d6e4130"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_reserve" ref="4072ad4d1b320d584ea837048d6e4130" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (buffer_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1177d6a157c14cdbfd7d4b05f01605a5"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_consume" ref="1177d6a157c14cdbfd7d4b05f01605a5" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (buffer_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceeec6c56ae8e16effb3fd187e83d958"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_release" ref="ceeec6c56ae8e16effb3fd187e83d958" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_release</b> (buffer_operation *op)</td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28807215994d4c7d3725fac693b37ec1"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_successors" ref="28807215994d4c7d3725fac693b37ec1" args="" -->
-internal::round_robin_cache<<br>
- T, <a class="el" href="a00305.html">null_rw_mutex</a> > </td><td class="memItemRight" valign="bottom"><b>my_successors</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b569eeae467185c45ea78ee1ab41a215"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_parent" ref="b569eeae467185c45ea78ee1ab41a215" args="" -->
-<a class="el" href="a00337.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>my_parent</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e90b3f77cbfac9fd5fb4d53456955d4"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::forwarder_busy" ref="5e90b3f77cbfac9fd5fb4d53456955d4" args="" -->
-bool </td><td class="memItemRight" valign="bottom"><b>forwarder_busy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d008669d152fe291079f097da72ec74"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_aggregator" ref="4d008669d152fe291079f097da72ec74" args="" -->
-internal::aggregator< my_handler,<br>
- buffer_operation > </td><td class="memItemRight" valign="bottom"><b>my_aggregator</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02a18a6a10c05e3f217f0111e0f5fb72"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal::forward_task< buffer_node< T, A > >" ref="02a18a6a10c05e3f217f0111e0f5fb72" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::forward_task< buffer_node< T, A > ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b5526a5033ff7acc64681cff9ad76b0"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal::aggregating_functor< my_class, buffer_operation >" ref="0b5526a5033ff7acc64681cff9ad76b0" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::aggregating_functor< my_class, buffer_operation ></b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>buffer_operation</b></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00263.html#641c8dc43652589d12eefaef130c094d">execute</a> (const Body &b)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">BASIC INTERFACE: Enter a function for exclusvie execution by the aggregator. <a href="#641c8dc43652589d12eefaef130c094d"></a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
- class tbb::flow::interface6::buffer_node< T, A ></h3>
-
-Forwards messages in arbitrary order.
+Basic aggregator interface.
<p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="f8bf4944ede4fc106423d67715beb695"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::register_successor" ref="f8bf4944ede4fc106423d67715beb695" args="(receiver< output_type > &r)" -->
+<a class="anchor" name="641c8dc43652589d12eefaef130c094d"></a><!-- doxytag: member="tbb::interface6::aggregator::execute" ref="641c8dc43652589d12eefaef130c094d" args="(const Body &b)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
+template<typename Body> </div>
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node</a>< T, A >::register_successor </td>
+ <td class="memname">void tbb::interface6::aggregator::execute </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00263.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > & </td>
- <td class="paramname"> <em>r</em> </td>
+ <td class="paramtype">const Body & </td>
+ <td class="paramname"> <em>b</em> </td>
<td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
+ <td width="100%"><code> [inline]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Adds a new successor.
-<p>
-Adds successor r to the list of successors; may forward tasks.
-<p>
-Implements <a class="el" href="a00327.html#68b8941ad77b9303cf3bcb8cf1f2d28a">tbb::flow::interface6::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="2074da0e39b9477c32897d6e5786196f"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::remove_successor" ref="2074da0e39b9477c32897d6e5786196f" args="(receiver< output_type > &r)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node</a>< T, A >::remove_successor </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00263.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > & </td>
- <td class="paramname"> <em>r</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Removes a successor.
-<p>
-Removes successor r from the list of successors. It also calls r.remove_predecessor(*this) to remove this node as a predecessor.
-<p>
-Implements <a class="el" href="a00327.html#82f363bfb1738bb8789e167590b10ef9">tbb::flow::interface6::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="8ef07c434eb763d947a7b4e80c086a49"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_consume" ref="8ef07c434eb763d947a7b4e80c086a49" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_consume </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Consumes a reserved item.
-<p>
-true = item is removed from sender and reservation removed
-<p>
-Reimplemented from <a class="el" href="a00327.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="aeb8aec46ca99ca022356a792c46735e"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_get" ref="aeb8aec46ca99ca022356a792c46735e" args="(T &v)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_get </td>
- <td>(</td>
- <td class="paramtype">T & </td>
- <td class="paramname"> <em>v</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Request an item from the <a class="el" href="a00263.html">buffer_node</a>.
-<p>
-true = v contains the returned item<br>
- false = no item has been returned
-<p>
-Reimplemented from <a class="el" href="a00327.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="2b02fe332e704bbe14f297802298b63a"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_put" ref="2b02fe332e704bbe14f297802298b63a" args="(const T &t)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_put </td>
- <td>(</td>
- <td class="paramtype">const T & </td>
- <td class="paramname"> <em>t</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Receive an item.
-<p>
-true is always returned
-<p>
-Implements <a class="el" href="a00321.html#c6d5d0cb8ebe5771be91933609fe31b8">tbb::flow::interface6::receiver< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="2c8e8f2f5f4ff5be27136cc1184a3c3e"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_release" ref="2c8e8f2f5f4ff5be27136cc1184a3c3e" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_release </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Release a reserved item.
-<p>
-true = item has been released and so remains in sender
-<p>
-Reimplemented from <a class="el" href="a00327.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="1cc889bb6c38bcb81757d0ebbc3a5e64"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_reserve" ref="1cc889bb6c38bcb81757d0ebbc3a5e64" args="(T &v)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00263.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_reserve </td>
- <td>(</td>
- <td class="paramtype">T & </td>
- <td class="paramname"> <em>v</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Reserves an item.
-<p>
-false = no item can be reserved<br>
- true = an item is reserved
+BASIC INTERFACE: Enter a function for exclusvie execution by the aggregator.
<p>
-Reimplemented from <a class="el" href="a00327.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a>.
+The calling thread stores the function object in a basic_operation and places the operation in the aggregator's mailbox
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>aggregator.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00263.png b/doc/html/a00263.png
index 425350b..123e10d 100644
Binary files a/doc/html/a00263.png and b/doc/html/a00263.png differ
diff --git a/doc/html/a00264.html b/doc/html/a00264.html
index fa87fba..f8dda05 100644
--- a/doc/html/a00264.html
+++ b/doc/html/a00264.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::cache_aligned_allocator< T > Class Template Reference</title>
+<title>tbb::interface6::aggregator_ext< handler_type > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,88 +21,90 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00264.html">cache_aligned_allocator</a></div>
-<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::cache_aligned_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00264.html">aggregator_ext</a></div>
+<h1>tbb::interface6::aggregator_ext< handler_type > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::aggregator_ext" -->Aggregator base class and expert interface.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00452.html">cache_aligned_allocator.h</a>></code>
+<code>#include <aggregator.h></code>
<p>
-<a href="a00013.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::interface6::aggregator_ext< handler_type >:
+<p><center><img src="a00264.png" usemap="#tbb::interface6::aggregator_ext< handler_type >_map" border="0" alt=""></center>
+<map name="tbb::interface6::aggregator_ext< handler_type >_map">
+<area href="a00263.html" alt="tbb::interface6::aggregator" shape="rect" coords="0,56,281,80">
+</map>
+<a href="a00005.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f7128452e3c43b5bf1801b61d971d17"></a><!-- doxytag: member="tbb::cache_aligned_allocator::value_type" ref="8f7128452e3c43b5bf1801b61d971d17" args="" -->
-typedef internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b23ef1d76c34fe1c2ebbb2f3df5b5676"></a><!-- doxytag: member="tbb::cache_aligned_allocator::pointer" ref="b23ef1d76c34fe1c2ebbb2f3df5b5676" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d15affd67eafcabbd12bd1cd07372994"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_pointer" ref="d15affd67eafcabbd12bd1cd07372994" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8c4e0d5867a07b1cea21d4fca2998c8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::reference" ref="e8c4e0d5867a07b1cea21d4fca2998c8" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d3d77a39f0852c42f80c6505843f450c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_reference" ref="d3d77a39f0852c42f80c6505843f450c" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90ca6a2979ebee466be771f4c2f9337e"></a><!-- doxytag: member="tbb::cache_aligned_allocator::size_type" ref="90ca6a2979ebee466be771f4c2f9337e" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b73eba293d042333f343d025c26751a4"></a><!-- doxytag: member="tbb::cache_aligned_allocator::difference_type" ref="b73eba293d042333f343d025c26751a4" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74ccd00a29171ddd61a4ea88cfa49c32"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="74ccd00a29171ddd61a4ea88cfa49c32" args="(const cache_aligned_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00264.html">cache_aligned_allocator</a> &) throw ()</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="de57e731c36a51bf39b458c9b8adee58"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="de57e731c36a51bf39b458c9b8adee58" args="(const cache_aligned_allocator< U > &)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00264.html">cache_aligned_allocator</a>< U > &) throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="023e0cc7cf6ebde69e1f2c12182eb12b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="023e0cc7cf6ebde69e1f2c12182eb12b" args="(reference x) const " -->
-pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="882115f59b5a15b2f4fc54178ad66cd9"></a><!-- doxytag: member="tbb::interface6::aggregator_ext::aggregator_ext" ref="882115f59b5a15b2f4fc54178ad66cd9" args="(const handler_type &h)" -->
+ </td><td class="memItemRight" valign="bottom"><b>aggregator_ext</b> (const handler_type &h)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db4f7613b1de12d1e79285c15636cf3b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="db4f7613b1de12d1e79285c15636cf3b" args="(const_reference x) const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html#ccd88bf4333dc100ba97da8e2170277d">process</a> (aggregator_operation *op)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cdeea67af6c1fcd8f1d5e9c4cab61e8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::allocate" ref="4cdeea67af6c1fcd8f1d5e9c4cab61e8" args="(size_type n, const void *hint=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a> (size_type n, const void *hint=0)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects, starting on a cache/sector line. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d4eadf188f7d85d3805ae534e0b8e1c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::deallocate" ref="3d4eadf188f7d85d3805ae534e0b8e1c" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a> (pointer p, size_type)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Free block of memory that starts on a cache line. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb23b687b4c0429dab4c7f8017266cf0"></a><!-- doxytag: member="tbb::cache_aligned_allocator::max_size" ref="fb23b687b4c0429dab4c7f8017266cf0" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a> () const throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="48a7e49dfb0578edc84a90a5ac30793d"></a><!-- doxytag: member="tbb::cache_aligned_allocator::construct" ref="48a7e49dfb0578edc84a90a5ac30793d" args="(pointer p, Args &&...args)" -->
-template<typename... Args> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00264.html#48a7e49dfb0578edc84a90a5ac30793d">construct</a> (pointer p, Args &&...args)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">EXPERT INTERFACE: Enter a user-made operation into the aggregator's mailbox. <a href="#ccd88bf4333dc100ba97da8e2170277d"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html#fdd0a9ce522246b9e14ae5e44bc72d31">execute_impl</a> (aggregator_operation &op)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::cache_aligned_allocator< T ></h3>
+<h3>template<typename handler_type><br>
+ class tbb::interface6::aggregator_ext< handler_type ></h3>
+
+Aggregator base class and expert interface.
+<p>
+An aggregator for collecting operations coming from multiple sources and executing them serially on a single thread.
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="fdd0a9ce522246b9e14ae5e44bc72d31"></a><!-- doxytag: member="tbb::interface6::aggregator_ext::execute_impl" ref="fdd0a9ce522246b9e14ae5e44bc72d31" args="(aggregator_operation &op)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename handler_type> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00264.html">tbb::interface6::aggregator_ext</a>< handler_type >::execute_impl </td>
+ <td>(</td>
+ <td class="paramtype">aggregator_operation & </td>
+ <td class="paramname"> <em>op</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, protected]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Place operation in mailbox, then either handle mailbox or wait for the operation to be completed by a different thread.
+</div>
+</div><p>
+<a class="anchor" name="ccd88bf4333dc100ba97da8e2170277d"></a><!-- doxytag: member="tbb::interface6::aggregator_ext::process" ref="ccd88bf4333dc100ba97da8e2170277d" args="(aggregator_operation *op)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename handler_type> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00264.html">tbb::interface6::aggregator_ext</a>< handler_type >::process </td>
+ <td>(</td>
+ <td class="paramtype">aggregator_operation * </td>
+ <td class="paramname"> <em>op</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<p>
-The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
+EXPERT INTERFACE: Enter a user-made operation into the aggregator's mailbox.
<p>
+Details of user-made operations must be handled by user-provided handler
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00452.html">cache_aligned_allocator.h</a></ul>
+<li>aggregator.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00252.png b/doc/html/a00264.png
similarity index 100%
rename from doc/html/a00252.png
rename to doc/html/a00264.png
diff --git a/doc/html/a00265.html b/doc/html/a00265.html
index 83226cb..4f1fb33 100644
--- a/doc/html/a00265.html
+++ b/doc/html/a00265.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::cache_aligned_allocator< void > Class Template Reference</title>
+<title>tbb::aligned_space< T, N > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,40 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00265.html">cache_aligned_allocator< void ></a></div>
-<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00265.html">aligned_space</a></div>
+<h1>tbb::aligned_space< T, N > Class Template Reference<br>
<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::cache_aligned_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::aligned_space" -->Block of space aligned sufficiently to construct an array T with N elements.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00452.html">cache_aligned_allocator.h</a>></code>
+<code>#include <aligned_space.h></code>
<p>
-<a href="a00015.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00007.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce89776145998f0685a767b4f195272d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::pointer" ref="ce89776145998f0685a767b4f195272d" args="" -->
-typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d702fc6b9e9d061ace3501b3c861cdf"></a><!-- doxytag: member="tbb::aligned_space::begin" ref="0d702fc6b9e9d061ace3501b3c861cdf" args="()" -->
+T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4431fbbe1a8cfeb19c48ad0072078f45"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::const_pointer" ref="4431fbbe1a8cfeb19c48ad0072078f45" args="" -->
-typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ab296f4ecdd75f8e193ff92004a697d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::value_type" ref="2ab296f4ecdd75f8e193ff92004a697d" args="" -->
-typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to beginning of array. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="024be075c23c0394c9a2518d993bcd9e"></a><!-- doxytag: member="tbb::aligned_space::end" ref="024be075c23c0394c9a2518d993bcd9e" args="()" -->
+T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html#024be075c23c0394c9a2518d993bcd9e">end</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to one past last element in array. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- class tbb::cache_aligned_allocator< void ></h3>
+<h3>template<typename T, size_t N><br>
+ class tbb::aligned_space< T, N ></h3>
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+Block of space aligned sufficiently to construct an array T with N elements.
+<p>
+The elements are not constructed or destroyed by this class.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00452.html">cache_aligned_allocator.h</a></ul>
+<li>aligned_space.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00266.html b/doc/html/a00266.html
index aa6a0dc..dbcece6 100644
--- a/doc/html/a00266.html
+++ b/doc/html/a00266.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::captured_exception Class Reference</title>
+<title>tbb::atomic< T > Struct Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,134 +21,41 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00266.html">captured_exception</a></div>
-<h1>tbb::captured_exception Class Reference</h1><!-- doxytag: class="tbb::captured_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->This class is used by TBB to propagate information about unhandled exceptions into the root thread.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00266.html">atomic</a></div>
+<h1>tbb::atomic< T > Struct Template Reference<br>
+<small>
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::atomic" -->Primary template for atomic.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <atomic.h></code>
<p>
-<p>Inheritance diagram for tbb::captured_exception:
-<p><center><img src="a00266.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
-<map name="tbb::captured_exception_map">
-<area href="a00345.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
-</map>
-<a href="a00158.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00008.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b50d9716bcdd281df574ec758a3952f9"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="b50d9716bcdd281df574ec758a3952f9" args="(const captured_exception &src)" -->
- </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const <a class="el" href="a00266.html">captured_exception</a> &src)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="21172c74e0dd2a7d6e732451951df1d4"></a><!-- doxytag: member="tbb::atomic::atomic" ref="21172c74e0dd2a7d6e732451951df1d4" args="(T arg)" -->
+constexpr </td><td class="memItemRight" valign="bottom"><b>atomic</b> (T arg)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="179076f146699724f652a9b1e81bd791"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="179076f146699724f652a9b1e81bd791" args="(const char *name_, const char *info)" -->
- </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const char *name_, const char *info)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e29e03a31436bad5eb1aa5a9d46a2da"></a><!-- doxytag: member="tbb::atomic::operator=" ref="1e29e03a31436bad5eb1aa5a9d46a2da" args="(T rhs)" -->
+T </td><td class="memItemRight" valign="bottom"><b>operator=</b> (T rhs)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e95b8eb99ec9dea22934ac528a08654c"></a><!-- doxytag: member="tbb::captured_exception::operator=" ref="e95b8eb99ec9dea22934ac528a08654c" args="(const captured_exception &src)" -->
-<a class="el" href="a00266.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00266.html">captured_exception</a> &src)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00266.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f">move</a> () throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object. <a href="#837a50b8f6a800bda225c39d1699643f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#93d875d3555502ff6f18513525de204c">destroy</a> () throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f">move()</a> method. <a href="#93d875d3555502ff6f18513525de204c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object. <a href="#2dd1be66ab32fa27e0ddef5707fa67ef"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5af82fd677449c5ca727fa1d7e16f9f5"></a><!-- doxytag: member="tbb::captured_exception::name" ref="5af82fd677449c5ca727fa1d7e16f9f5" args="() const " -->
-const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a> () const throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b5988ef74a1fe2a58998d110b3633e0"></a><!-- doxytag: member="tbb::captured_exception::what" ref="6b5988ef74a1fe2a58998d110b3633e0" args="() const " -->
-const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#6b5988ef74a1fe2a58998d110b3633e0">what</a> () const throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00266.html#6b5988ef74a1fe2a58998d110b3633e0">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="92ed4100413eef26969f8299f6845e18"></a><!-- doxytag: member="tbb::captured_exception::set" ref="92ed4100413eef26969f8299f6845e18" args="(const char *name, const char *info)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set</b> (const char *name, const char *info) throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5f56d05102acdba6c2f09ba6db3baeb"></a><!-- doxytag: member="tbb::captured_exception::clear" ref="d5f56d05102acdba6c2f09ba6db3baeb" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>clear</b> () throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90791297d59b1659cfaf0d93c7cc59ae"></a><!-- doxytag: member="tbb::atomic::operator=" ref="90791297d59b1659cfaf0d93c7cc59ae" args="(const atomic< T > &rhs)" -->
+<a class="el" href="a00266.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00266.html">atomic</a>< T > &rhs)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-This class is used by TBB to propagate information about unhandled exceptions into the root thread.
-<p>
-Exception of this type is thrown by TBB in the root thread (thread that started a parallel algorithm ) if an unhandled exception was intercepted during the algorithm execution in one of the workers. <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00345.html">tbb::tbb_exception</a> </dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="93d875d3555502ff6f18513525de204c"></a><!-- doxytag: member="tbb::captured_exception::destroy" ref="93d875d3555502ff6f18513525de204c" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::captured_exception::destroy </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ struct tbb::atomic< T ></h3>
+Primary template for atomic.
<p>
-Destroys objects created by the <a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f">move()</a> method.
-<p>
-Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
-<p>
-Implements <a class="el" href="a00345.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="837a50b8f6a800bda225c39d1699643f"></a><!-- doxytag: member="tbb::captured_exception::move" ref="837a50b8f6a800bda225c39d1699643f" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00266.html">captured_exception</a>* __TBB_EXPORTED_METHOD tbb::captured_exception::move </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Creates and returns pointer to the deep copy of this exception object.
-<p>
-Move semantics is allowed.
-<p>
-Implements <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="2dd1be66ab32fa27e0ddef5707fa67ef"></a><!-- doxytag: member="tbb::captured_exception::throw_self" ref="2dd1be66ab32fa27e0ddef5707fa67ef" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::captured_exception::throw_self </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Throws this exception object.
-<p>
-Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
+See the Reference for details.
<p>
-Implements <a class="el" href="a00345.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li>atomic.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00266.png b/doc/html/a00266.png
deleted file mode 100644
index 2470bea..0000000
Binary files a/doc/html/a00266.png and /dev/null differ
diff --git a/doc/html/a00267.html b/doc/html/a00267.html
index aca2732..3bd7269 100644
--- a/doc/html/a00267.html
+++ b/doc/html/a00267.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::combinable< T > Class Template Reference</title>
+<title>tbb::atomic< void * > Struct Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,61 +21,36 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00267.html">combinable</a></div>
-<h1>tbb::combinable< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00427.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::combinable" -->Thread-local storage with optional reduction.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00267.html">atomic< void * ></a></div>
+<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00267.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00454.html">combinable.h</a>></code>
+<code>#include <atomic.h></code>
<p>
-<a href="a00017.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00009.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d03619e90e62555aa5634fcc8adadcc9"></a><!-- doxytag: member="tbb::combinable::combinable" ref="d03619e90e62555aa5634fcc8adadcc9" args="(finit _finit)" -->
-template<typename finit> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>combinable</b> (finit _finit)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3529c5cc8a97732321719ef0b99e2ded"></a><!-- doxytag: member="tbb::atomic< void * >::atomic" ref="3529c5cc8a97732321719ef0b99e2ded" args="(void *arg)" -->
+constexpr </td><td class="memItemRight" valign="bottom"><b>atomic</b> (void *arg)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c87e79ae98588a5780f708773388843"></a><!-- doxytag: member="tbb::combinable::~combinable" ref="2c87e79ae98588a5780f708773388843" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html#2c87e79ae98588a5780f708773388843">~combinable</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ba6e74163e255b88c497c40db64c5dad"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="ba6e74163e255b88c497c40db64c5dad" args="(void *rhs)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>operator=</b> (void *rhs)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">destructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57012803b7bc7416452cb930121ff210"></a><!-- doxytag: member="tbb::combinable::combinable" ref="57012803b7bc7416452cb930121ff210" args="(const combinable &other)" -->
- </td><td class="memItemRight" valign="bottom"><b>combinable</b> (const <a class="el" href="a00267.html">combinable</a> &other)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c9650d59f65b1042afa232ede57dfca9"></a><!-- doxytag: member="tbb::combinable::operator=" ref="c9650d59f65b1042afa232ede57dfca9" args="(const combinable &other)" -->
-<a class="el" href="a00267.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00267.html">combinable</a> &other)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09233cccb9b5e8a58874e43a703cac2"></a><!-- doxytag: member="tbb::combinable::clear" ref="f09233cccb9b5e8a58874e43a703cac2" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d7550204bcb88fa8810b5a39e9cad24"></a><!-- doxytag: member="tbb::combinable::local" ref="2d7550204bcb88fa8810b5a39e9cad24" args="()" -->
-T & </td><td class="memItemRight" valign="bottom"><b>local</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93a42052881ecccdd8ddff16a1b1cca1"></a><!-- doxytag: member="tbb::combinable::local" ref="93a42052881ecccdd8ddff16a1b1cca1" args="(bool &exists)" -->
-T & </td><td class="memItemRight" valign="bottom"><b>local</b> (bool &exists)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9be306b4a073066dcac4043dc189c514"></a><!-- doxytag: member="tbb::combinable::combine" ref="9be306b4a073066dcac4043dc189c514" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="dcd23283834149c87c345c0e476dfee8"></a><!-- doxytag: member="tbb::combinable::combine_each" ref="dcd23283834149c87c345c0e476dfee8" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="37979e62d1f88eb45bd3ad7df5a140f8"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="37979e62d1f88eb45bd3ad7df5a140f8" args="(const atomic< void * > &rhs)" -->
+<a class="el" href="a00266.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00266.html">atomic</a>< void * > &rhs)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::combinable< T ></h3>
+<h3>template<><br>
+ struct tbb::atomic< void * ></h3>
-Thread-local storage with optional reduction.
+Specialization for <a class="el" href="a00267.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00454.html">combinable.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li>atomic.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00268.html b/doc/html/a00268.html
index 04afb29..ee69194 100644
--- a/doc/html/a00268.html
+++ b/doc/html/a00268.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::concurrent_bounded_queue< T, A > Class Template Reference</title>
+<title>tbb::internal::atomic_backoff Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,287 +21,36 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00268.html">concurrent_bounded_queue</a></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00427.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.
+<a class="el" href="a00428.html">tbb</a>::<b>internal</b>::<a class="el" href="a00268.html">atomic_backoff</a></div>
+<h1>tbb::internal::atomic_backoff Class Reference</h1><!-- doxytag: class="tbb::internal::atomic_backoff" -->Class that implements exponential backoff.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00476.html">concurrent_queue.h</a>></code>
+<code>#include <tbb_machine.h></code>
<p>
-<p>Inheritance diagram for tbb::concurrent_bounded_queue< T, A >:
-<p><center><img src="a00268.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::concurrent_bounded_queue< T, A >_map">
-<area href="a00275.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
-</map>
-<a href="a00036.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00169.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245517a931e5893f6601e66c51fc75"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::value_type" ref="98245517a931e5893f6601e66c51fc75" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#98245517a931e5893f6601e66c51fc75">value_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e2726fccf6d975dc1071608cc0bbf90"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::allocator_type" ref="2e2726fccf6d975dc1071608cc0bbf90" args="" -->
-typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dcd44ca6a88c0dc7a847a47a10811f0c"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::reference" ref="dcd44ca6a88c0dc7a847a47a10811f0c" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="796713d0b9ba93a4721cbe13e4474068"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_reference" ref="796713d0b9ba93a4721cbe13e4474068" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <a href="#a80e4c11dbb324e4b92a24a77bbcde68"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b45c91297e69515d83d5eef85ae1f49"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::difference_type" ref="4b45c91297e69515d83d5eef85ae1f49" args="" -->
-typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aeea2ad38b7e7fc2866f063dfed24c52"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::iterator" ref="aeea2ad38b7e7fc2866f063dfed24c52" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00268.html">concurrent_bounded_queue</a>,<br>
- T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0edd1a90e6ffa503bac1c4027116dbff"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_iterator" ref="0edd1a90e6ffa503bac1c4027116dbff" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00268.html">concurrent_bounded_queue</a>,<br>
- const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3525226732963ff0f13e89d8e6dab5b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="e3525226732963ff0f13e89d8e6dab5b" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b7fb414d2eaa8a7f5d68fc4cd63ac50"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="7b7fb414d2eaa8a7f5d68fc4cd63ac50" args="(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00268.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a5e04dcd7db9fd9b583b4e7df832246a"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="a5e04dcd7db9fd9b583b4e7df832246a" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00268.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acaf5b510dc0dfc7780b8c956cf773cf"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::~concurrent_bounded_queue" ref="acaf5b510dc0dfc7780b8c956cf773cf" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceb08c743b11ba88c878e73fff8af20b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::push" ref="ceb08c743b11ba88c878e73fff8af20b" args="(const T &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#ceb08c743b11ba88c878e73fff8af20b">push</a> (const T &source)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a> (T &destination)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dequeue item from head of queue. <a href="#41f4c6bd7a82ab070e840bbf81b0b123"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86c77a6c1317239405968f5afc7b10d3"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::abort" ref="86c77a6c1317239405968f5afc7b10d3" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#86c77a6c1317239405968f5afc7b10d3">abort</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Abort all pending queue operations. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#2bd6232531279fb3ccbd296bea23066b">try_push</a> (const T &source)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full. <a href="#2bd6232531279fb3ccbd296bea23066b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a> (T &destination)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#0ca487019bbb00a196442aff78a1e4f7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#7dc14d1a579a4cccda9f857585e1768d">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return number of pushes minus number of pops. <a href="#7dc14d1a579a4cccda9f857585e1768d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f64924f2ee9225c368a270fc3c394db9"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::empty" ref="f64924f2ee9225c368a270fc3c394db9" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00268.html#7dc14d1a579a4cccda9f857585e1768d">size()</a><=0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2888b3e4e837d7e03f2c731963a402b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::capacity" ref="b2888b3e4e837d7e03f2c731963a402b" args="() const " -->
-<a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum number of allowed elements. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a> (<a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the capacity. <a href="#f3c6c934f85fd02aedbc83a16943193b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="415eb87e53b1c6a266de06ecbc490d16"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::get_allocator" ref="415eb87e53b1c6a266de06ecbc490d16" args="() const " -->
-<a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90b31e2954c6e4596c7900435a5f4bc1"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::clear" ref="90b31e2954c6e4596c7900435a5f4bc1" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">clear the queue. not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a2637188e104503ac2c0dff633014e8"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="5a2637188e104503ac2c0dff633014e8" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a174ea93e3bd3d5cce82389c2f28d037"></a><!-- doxytag: member="tbb::internal::atomic_backoff::pause" ref="a174ea93e3bd3d5cce82389c2f28d037" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7267334ef11087c76c810abb9d5cbc2"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="c7267334ef11087c76c810abb9d5cbc2" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pause for a while. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6179b19e2e8dedd73a36d523af2fe12"></a><!-- doxytag: member="tbb::internal::atomic_backoff::bounded_pause" ref="c6179b19e2e8dedd73a36d523af2fe12" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>bounded_pause</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8be757841d0bbf7744508aaf6a141d08"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="8be757841d0bbf7744508aaf6a141d08" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45edb535489eb0e76ecc59a19fd952de"></a><!-- doxytag: member="tbb::internal::atomic_backoff::reset" ref="45edb535489eb0e76ecc59a19fd952de" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3aac91d288bf227d9d06717b44ef28f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="3aac91d288bf227d9d06717b44ef28f7" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>destroyer</b></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class used to ensure exception-safety of method "pop". <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
- class tbb::concurrent_bounded_queue< T, A ></h3>
-
-A high-performance thread-safe blocking concurrent bounded queue.
-<p>
-This is the pre-PPL TBB concurrent queue which supports boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
-<p>
-<hr><h2>Member Typedef Documentation</h2>
-<a class="anchor" name="a80e4c11dbb324e4b92a24a77bbcde68"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size_type" ref="a80e4c11dbb324e4b92a24a77bbcde68" args="" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">typedef std::ptrdiff_t <a class="el" href="a00268.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Integral type for representing size of the queue.
-<p>
-Note that the size_type is a signed integral type. This is because the size can be negative if there are pending pops without corresponding pushes.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="41f4c6bd7a82ab070e840bbf81b0b123"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::pop" ref="41f4c6bd7a82ab070e840bbf81b0b123" args="(T &destination)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00268.html">tbb::concurrent_bounded_queue</a>< T, A >::pop </td>
- <td>(</td>
- <td class="paramtype">T & </td>
- <td class="paramname"> <em>destination</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Dequeue item from head of queue.
-<p>
-Block until an item becomes available, and then dequeue it.
-</div>
-</div><p>
-<a class="anchor" name="f3c6c934f85fd02aedbc83a16943193b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::set_capacity" ref="f3c6c934f85fd02aedbc83a16943193b" args="(size_type new_capacity)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00268.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
- <td class="paramname"> <em>new_capacity</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Set the capacity.
-<p>
-Setting the capacity to 0 causes subsequent try_push operations to always fail, and subsequent push operations to block forever.
-</div>
-</div><p>
-<a class="anchor" name="7dc14d1a579a4cccda9f857585e1768d"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size" ref="7dc14d1a579a4cccda9f857585e1768d" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00268.html">tbb::concurrent_bounded_queue</a>< T, A >::size </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Return number of pushes minus number of pops.
-<p>
-Note that the result can be negative if there are pops waiting for the corresponding pushes. The result can also exceed <a class="el" href="a00268.html#b2888b3e4e837d7e03f2c731963a402b">capacity()</a> if there are push operations in flight.
-</div>
-</div><p>
-<a class="anchor" name="0ca487019bbb00a196442aff78a1e4f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_pop" ref="0ca487019bbb00a196442aff78a1e4f7" args="(T &destination)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00268.html">tbb::concurrent_bounded_queue</a>< T, A >::try_pop </td>
- <td>(</td>
- <td class="paramtype">T & </td>
- <td class="paramname"> <em>destination</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Attempt to dequeue an item from head of queue.
-<p>
-Does not wait for item to become available. Returns true if successful; false otherwise.
-</div>
-</div><p>
-<a class="anchor" name="2bd6232531279fb3ccbd296bea23066b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_push" ref="2bd6232531279fb3ccbd296bea23066b" args="(const T &source)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00268.html">tbb::concurrent_bounded_queue</a>< T, A >::try_push </td>
- <td>(</td>
- <td class="paramtype">const T & </td>
- <td class="paramname"> <em>source</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+Class that implements exponential backoff.
<p>
-Enqueue an item at tail of queue if queue is not already full.
+See implementation of spin_wait_while_eq for an example.
<p>
-Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00476.html">concurrent_queue.h</a></ul>
+<li>tbb_machine.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00268.png b/doc/html/a00268.png
deleted file mode 100644
index e9d90a2..0000000
Binary files a/doc/html/a00268.png and /dev/null differ
diff --git a/doc/html/a00269.html b/doc/html/a00269.html
index e0f8d9e..2dc0edc 100644
--- a/doc/html/a00269.html
+++ b/doc/html/a00269.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference</title>
+<title>tbb::auto_partitioner Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,623 +21,41 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00269.html">concurrent_hash_map</a></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00269.html">auto_partitioner</a></div>
+<h1>tbb::auto_partitioner Class Reference<br>
<small>
-[<a class="el" href="a00427.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map" -->Unordered map from Key to T.
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::auto_partitioner" -->An auto partitioner.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00455.html">concurrent_hash_map.h</a>></code>
+<code>#include <partitioner.h></code>
<p>
-<a href="a00019.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00105.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e664e41a5b735a677f2ebbbcca0fcd80"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::key_type" ref="e664e41a5b735a677f2ebbbcca0fcd80" args="" -->
-typedef Key </td><td class="memItemRight" valign="bottom"><b>key_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="616243d5a0b6159299f2a34413e077e4"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::mapped_type" ref="616243d5a0b6159299f2a34413e077e4" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>mapped_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ece048b19778bc31377185392ecf312b"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::value_type" ref="ece048b19778bc31377185392ecf312b" args="" -->
-typedef std::pair< const Key,<br>
- T > </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="549109620a3331c83e46b8fe0636b883"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::size_type" ref="549109620a3331c83e46b8fe0636b883" args="" -->
-typedef hash_map_base::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0a4ffc8ac85bb2eb80a4e1909a373e2c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::difference_type" ref="0a4ffc8ac85bb2eb80a4e1909a373e2c" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="341d2ae1e5e9d8ba05e5306a3933f31a"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::pointer" ref="341d2ae1e5e9d8ba05e5306a3933f31a" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b401731d22f457617f950416fde9bff"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_pointer" ref="4b401731d22f457617f950416fde9bff" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2765bbab7bac8b74cfd79d269a2008b8"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::reference" ref="2765bbab7bac8b74cfd79d269a2008b8" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3b62b1930b2b88c98cb617f67bb9545"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_reference" ref="a3b62b1930b2b88c98cb617f67bb9545" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83603b64f2507ee6560133d79a001eb2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::iterator" ref="83603b64f2507ee6560133d79a001eb2" args="" -->
-typedef internal::hash_map_iterator<<br>
- <a class="el" href="a00269.html">concurrent_hash_map</a>, value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d47cbc7e0b0999b849187040f02557f5"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_iterator" ref="d47cbc7e0b0999b849187040f02557f5" args="" -->
-typedef internal::hash_map_iterator<<br>
- <a class="el" href="a00269.html">concurrent_hash_map</a>, const <br>
-value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="baeed4327d9c77f084bfb5ac8d519c96"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range_type" ref="baeed4327d9c77f084bfb5ac8d519c96" args="" -->
-typedef internal::hash_map_range<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e7700e8872566a5dc6d1c702b7949f4"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_range_type" ref="1e7700e8872566a5dc6d1c702b7949f4" args="" -->
-typedef internal::hash_map_range<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf2a3ebce78da6d8be3b1803eb31a2e3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::allocator_type" ref="bf2a3ebce78da6d8be3b1803eb31a2e3" args="" -->
-typedef Allocator </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ad413f5b666176e7669bf4c87d1ff3f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="1ad413f5b666176e7669bf4c87d1ff3f" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a> (const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="46b9896317662c3cfa3c876ad7592a7c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="46b9896317662c3cfa3c876ad7592a7c" args="(size_type n, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a> (size_type n, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table with n preallocated buckets. This number serves also as initial concurrency level. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6fb14710893308fb47aaeee55ee30dc3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="6fb14710893308fb47aaeee55ee30dc3" args="(const concurrent_hash_map &table, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a> (const <a class="el" href="a00269.html">concurrent_hash_map</a> &table, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="83c40f2053f208861b90390e12a36436"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="83c40f2053f208861b90390e12a36436" args="(I first, I last, const allocator_type &a=allocator_type())" -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00269.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="088d1aaccc816884a49e38f7065622c8"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::operator=" ref="088d1aaccc816884a49e38f7065622c8" args="(const concurrent_hash_map &table)" -->
-<a class="el" href="a00269.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#088d1aaccc816884a49e38f7065622c8">operator=</a> (const <a class="el" href="a00269.html">concurrent_hash_map</a> &table)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#94758113d8993cfe5afdf2d63a728869">rehash</a> (size_type n=0)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Rehashes and optionally resizes the whole table. <a href="#94758113d8993cfe5afdf2d63a728869"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="220686fe17b197eedf19dd856cd02e36"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::clear" ref="220686fe17b197eedf19dd856cd02e36" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#220686fe17b197eedf19dd856cd02e36">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2aa8e2d28d5af1284cf78d20a9c22731"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::~concurrent_hash_map" ref="2aa8e2d28d5af1284cf78d20a9c22731" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table and destroy it. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ee6b69f390111c92318a85600dd9c559"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range" ref="ee6b69f390111c92318a85600dd9c559" args="(size_type grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d9a834a345415581bd801647945ea96b"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range" ref="d9a834a345415581bd801647945ea96b" args="(size_type grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35a8c373fc3d52099ae18f0553162491"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::begin" ref="35a8c373fc3d52099ae18f0553162491" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67c50bddda53b9a10318f8981e4fc4fa"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::end" ref="67c50bddda53b9a10318f8981e4fc4fa" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8ad3d9bb833063b3d09164199b8f7de"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::begin" ref="c8ad3d9bb833063b3d09164199b8f7de" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="75e7c0fb6addae180b6cc483b771fded"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::end" ref="75e7c0fb6addae180b6cc483b771fded" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8262e9ef1208a39e7ea087487fbe8368"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::equal_range" ref="8262e9ef1208a39e7ea087487fbe8368" args="(const Key &key)" -->
-std::pair< iterator, iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b94bf1d3724f26299640e8b82787a75c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::equal_range" ref="b94bf1d3724f26299640e8b82787a75c" args="(const Key &key) const " -->
-std::pair< const_iterator,<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6aa56a8b5a25e61a97fa0b54fe2b5659"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::size" ref="6aa56a8b5a25e61a97fa0b54fe2b5659" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Number of items in table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61ff2e5bb44e5469366fd5295e5d0ebe"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::empty" ref="61ff2e5bb44e5469366fd5295e5d0ebe" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if <a class="el" href="a00269.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size()</a>==0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bce57fe9b594abe1e6d2568aea8b357"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::max_size" ref="2bce57fe9b594abe1e6d2568aea8b357" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on size. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af34cb91b1d0f36a885a1a3432dd9af1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_count" ref="af34cb91b1d0f36a885a1a3432dd9af1" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of buckets. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6cbcacb4a256a85bf89576c101373ca7"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::get_allocator" ref="6cbcacb4a256a85bf89576c101373ca7" args="() const " -->
-allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="076f8d9e16110aac5f558777aa744eb6"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::swap" ref="076f8d9e16110aac5f558777aa744eb6" args="(concurrent_hash_map &table)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#076f8d9e16110aac5f558777aa744eb6">swap</a> (<a class="el" href="a00269.html">concurrent_hash_map</a> &table)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances. Iterators are invalidated <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6968eb6feed2df36be421df0464297af"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::count" ref="6968eb6feed2df36be421df0464297af" args="(const Key &key) const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#6968eb6feed2df36be421df0464297af">count</a> (const Key &key) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return count of items (0 or 1). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#2afcc33dade7bb24e008d60c0df38230">find</a> (<a class="el" href="a00272.html">const_accessor</a> &result, const Key &key) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a read lock on the item. <a href="#2afcc33dade7bb24e008d60c0df38230"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a> (<a class="el" href="a00270.html">accessor</a> &result, const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a write lock on the item. <a href="#7bc475d1968f7f0af3d736d7e8a0d7df"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#47fe0e60151a9bd7a444db827772a4e6">insert</a> (<a class="el" href="a00272.html">const_accessor</a> &result, const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a read lock on the item. <a href="#47fe0e60151a9bd7a444db827772a4e6"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#54e0955ecd11575b4c07166838a72893">insert</a> (<a class="el" href="a00270.html">accessor</a> &result, const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a write lock on the item. <a href="#54e0955ecd11575b4c07166838a72893"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a> (<a class="el" href="a00272.html">const_accessor</a> &result, const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a read lock on the item. <a href="#091efd2d12fdad4fe9e54d9629a9dfc3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#39183d78d6e8425917555ab542ab92de">insert</a> (<a class="el" href="a00270.html">accessor</a> &result, const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a write lock on the item. <a href="#39183d78d6e8425917555ab542ab92de"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#3f121a316af8135de476a30fae6d7c07">insert</a> (const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already. <a href="#3f121a316af8135de476a30fae6d7c07"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1dd37fad87e561151ba1e242ca94bcc1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="1dd37fad87e561151ba1e242ca94bcc1" args="(I first, I last)" -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00269.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a> (I first, I last)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert range [first, last). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a> (const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item. <a href="#f27802b3a8d1863c29e743e9c6b4e870"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a> (<a class="el" href="a00272.html">const_accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00272.html">const_accessor</a>. <a href="#e698ef3d70b2d1a29a7a5551784d3653"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#5f12d150d421420965db07368666a84f">erase</a> (<a class="el" href="a00270.html">accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by accessor. <a href="#5f12d150d421420965db07368666a84f"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2066e7e0fec7813db8fe9c8b9368c9e5"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::node_allocator_type" ref="2066e7e0fec7813db8fe9c8b9368c9e5" args="" -->
-typedef Allocator::template <br>
-rebind< node >::other </td><td class="memItemRight" valign="bottom"><b>node_allocator_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="559190b7953177b4967a3312f557318f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::delete_node" ref="559190b7953177b4967a3312f557318f" args="(node_base *n)" -->
-void </td><td class="memItemRight" valign="bottom"><b>delete_node</b> (node_base *n)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="32ec82223d843f1c2b95fa37acb7f4bb"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::search_bucket" ref="32ec82223d843f1c2b95fa37acb7f4bb" args="(const key_type &key, bucket *b) const " -->
-node * </td><td class="memItemRight" valign="bottom"><b>search_bucket</b> (const key_type &key, bucket *b) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4962c7da24793ccc05524cc3bbcf1efa"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::rehash_bucket" ref="4962c7da24793ccc05524cc3bbcf1efa" args="(bucket *b_new, const hashcode_t h)" -->
-void </td><td class="memItemRight" valign="bottom"><b>rehash_bucket</b> (bucket *b_new, const hashcode_t h)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3f3413264a99174a224ef96f6c4ea769"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::lookup" ref="3f3413264a99174a224ef96f6c4ea769" args="(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#3f3413264a99174a224ef96f6c4ea769">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00272.html">const_accessor</a> *result, bool write)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert or find item and optionally acquire a lock on the item. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c964214eb38f54603aa75fdff6d2709"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::exclude" ref="0c964214eb38f54603aa75fdff6d2709" args="(const_accessor &item_accessor)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#0c964214eb38f54603aa75fdff6d2709">exclude</a> (<a class="el" href="a00272.html">const_accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">delete item by accessor <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8f5373b8e1864619d1ffcf3bf3f1f13d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_equal_range" ref="8f5373b8e1864619d1ffcf3bf3f1f13d" args="(const Key &key, I end) const " -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">std::pair< I, I > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00269.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a> (const Key &key, I end) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns an iterator for an item defined by the key, or for the next item after it (if upper==true). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72c9c9e9655fcf096f5f0ed9c8ba6669"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_copy" ref="72c9c9e9655fcf096f5f0ed9c8ba6669" args="(const concurrent_hash_map &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a> (const <a class="el" href="a00269.html">concurrent_hash_map</a> &source)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy "source" to *this, where *this must start out empty. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1ec1fe8dfa2d7894bf0589bfdbcb1f96"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_copy" ref="1ec1fe8dfa2d7894bf0589bfdbcb1f96" args="(I first, I last)" -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>internal_copy</b> (I first, I last)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a> (const Key &key) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast find when no concurrent erasure is used. For internal use inside TBB only! <a href="#2f76ed101a0ccc8875b846c2f747897e"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a72cb6e9873e5541295682179e5a7f74"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::my_allocator" ref="a72cb6e9873e5541295682179e5a7f74" args="" -->
-node_allocator_type </td><td class="memItemRight" valign="bottom"><b>my_allocator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="53c747a3f2d2d2c85aec866e19c31c29"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::my_hash_compare" ref="53c747a3f2d2d2c85aec866e19c31c29" args="" -->
-HashCompare </td><td class="memItemRight" valign="bottom"><b>my_hash_compare</b></td></tr>
-
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e24acd2f6849db3377a3942807639758"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal::hash_map_iterator" ref="e24acd2f6849db3377a3942807639758" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c94f21746c8902f7e0b5115a8d4da1d2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal::hash_map_range" ref="c94f21746c8902f7e0b5115a8d4da1d2" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_range</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f730f70d21df405adaebfc2018f59cd"></a><!-- doxytag: member="tbb::auto_partitioner::serial::interface6::start_for" ref="5f730f70d21df405adaebfc2018f59cd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>serial::interface6::start_for</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c0028dfa75a6baa14007355ab1ef7fc"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor" ref="2c0028dfa75a6baa14007355ab1ef7fc" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>const_accessor</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a4cd0ffed4fad0d9af2c5efdaf586a8"></a><!-- doxytag: member="tbb::auto_partitioner::interface6::internal::start_for" ref="8a4cd0ffed4fad0d9af2c5efdaf586a8" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_for</b></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html">accessor</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86f0750233dd6c83b65fb684338fd09f"></a><!-- doxytag: member="tbb::auto_partitioner::interface6::internal::start_reduce" ref="86f0750233dd6c83b65fb684338fd09f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_reduce</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allows write access to elements and combines data access, locking, and garbage collection. <a href="a00270.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html">bucket_accessor</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">bucket accessor is to find, rehash, acquire a lock, and access a bucket <a href="a00271.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html">const_accessor</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection. <a href="a00272.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>node</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></h3>
-
-Unordered map from Key to T.
-<p>
-<a class="el" href="a00269.html">concurrent_hash_map</a> is associative container with concurrent access.<p>
-<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1).</dd></dl>
-<dl compact><dt><b>Exception Safety</b></dt><dd><ul>
-<li>Hash function is not permitted to throw an exception. User-defined types Key and T are forbidden from throwing an exception in destructors.</li><li>If exception happens during <a class="el" href="a00269.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> operations, it has no effect (unless exception raised by HashCompare::hash() function during grow_segment).</li><li>If exception happens during <a class="el" href="a00269.html#088d1aaccc816884a49e38f7065622c8">operator=()</a> operati [...]
-</dd></dl>
-<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
-<li>Replaced internal algorithm and data structure. Patent is pending.</li><li>Added buckets number argument for constructor</li></ul>
-</dd></dl>
-<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
-<li>Fixed exception-safety</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Added constructor from a range of iterators</li><li>Added several new overloaded <a class="el" href="a00269.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> methods</li><li>Added <a class="el" href="a00269.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator()</a></li><li>Added <a class="el" href="a00269.html#076f8d9e16110aac5f558777aa744eb6">swap()</a></li [...]
-</dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="5f12d150d421420965db07368666a84f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="5f12d150d421420965db07368666a84f" args="(accessor &item_accessor)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00270.html">accessor</a> & </td>
- <td class="paramname"> <em>item_accessor</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Erase item by accessor.
-<p>
-Return true if item was erased by particularly this call.
-</div>
-</div><p>
-<a class="anchor" name="e698ef3d70b2d1a29a7a5551784d3653"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="e698ef3d70b2d1a29a7a5551784d3653" args="(const_accessor &item_accessor)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00272.html">const_accessor</a> & </td>
- <td class="paramname"> <em>item_accessor</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Erase item by <a class="el" href="a00272.html">const_accessor</a>.
-<p>
-Return true if item was erased by particularly this call.
-</div>
-</div><p>
-<a class="anchor" name="f27802b3a8d1863c29e743e9c6b4e870"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="f27802b3a8d1863c29e743e9c6b4e870" args="(const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename A> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, A >::erase </td>
- <td>(</td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Erase item.
-<p>
-Return true if item was erased by particularly this call.
-</div>
-</div><p>
-<a class="anchor" name="7bc475d1968f7f0af3d736d7e8a0d7df"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::find" ref="7bc475d1968f7f0af3d736d7e8a0d7df" args="(accessor &result, const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00270.html">accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Find item and acquire a write lock on the item.
-<p>
-Return true if item is found, false otherwise.
-</div>
-</div><p>
-<a class="anchor" name="2afcc33dade7bb24e008d60c0df38230"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::find" ref="2afcc33dade7bb24e008d60c0df38230" args="(const_accessor &result, const Key &key) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00272.html">const_accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Find item and acquire a read lock on the item.
-<p>
-Return true if item is found, false otherwise.
-</div>
-</div><p>
-<a class="anchor" name="3f121a316af8135de476a30fae6d7c07"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="3f121a316af8135de476a30fae6d7c07" args="(const value_type &value)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype">const value_type & </td>
- <td class="paramname"> <em>value</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item by copying if there is no such key present already.
-<p>
-Returns true if item is inserted.
-</div>
-</div><p>
-<a class="anchor" name="39183d78d6e8425917555ab542ab92de"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="39183d78d6e8425917555ab542ab92de" args="(accessor &result, const value_type &value)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00270.html">accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const value_type & </td>
- <td class="paramname"> <em>value</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item by copying if there is no such key present already and acquire a write lock on the item.
-<p>
-Returns true if item is new.
-</div>
-</div><p>
-<a class="anchor" name="091efd2d12fdad4fe9e54d9629a9dfc3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="091efd2d12fdad4fe9e54d9629a9dfc3" args="(const_accessor &result, const value_type &value)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00272.html">const_accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const value_type & </td>
- <td class="paramname"> <em>value</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item by copying if there is no such key present already and acquire a read lock on the item.
-<p>
-Returns true if item is new.
-</div>
-</div><p>
-<a class="anchor" name="54e0955ecd11575b4c07166838a72893"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="54e0955ecd11575b4c07166838a72893" args="(accessor &result, const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00270.html">accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item (if not already present) and acquire a write lock on the item.
-<p>
-Returns true if item is new.
-</div>
-</div><p>
-<a class="anchor" name="47fe0e60151a9bd7a444db827772a4e6"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="47fe0e60151a9bd7a444db827772a4e6" args="(const_accessor &result, const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00272.html">const_accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item (if not already present) and acquire a read lock on the item.
-<p>
-Returns true if item is new.
-</div>
-</div><p>
-<a class="anchor" name="2f76ed101a0ccc8875b846c2f747897e"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_fast_find" ref="2f76ed101a0ccc8875b846c2f747897e" args="(const Key &key) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">const_pointer <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::internal_fast_find </td>
- <td>(</td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline, protected]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Fast find when no concurrent erasure is used. For internal use inside TBB only!
-<p>
-Return pointer to item with given key, or NULL if no such item exists. Must not be called concurrently with erasure operations.
-</div>
-</div><p>
-<a class="anchor" name="94758113d8993cfe5afdf2d63a728869"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::rehash" ref="94758113d8993cfe5afdf2d63a728869" args="(size_type n=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename A> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, A >::rehash </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>n</em> = <code>0</code> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+An auto partitioner.
<p>
-Rehashes and optionally resizes the whole table.
+The range is initial divided into several large chunks. Chunks are further subdivided into smaller pieces if demand detected and they are divisible.
<p>
-Useful to optimize performance before or after concurrent operations. Also enables using of <a class="el" href="a00269.html#2afcc33dade7bb24e008d60c0df38230">find()</a> and <a class="el" href="a00269.html#6968eb6feed2df36be421df0464297af">count()</a> concurrent methods in serial context.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00455.html">concurrent_hash_map.h</a></ul>
+<li>partitioner.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00270.html b/doc/html/a00270.html
index adfa37b..3dd0678 100644
--- a/doc/html/a00270.html
+++ b/doc/html/a00270.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</title>
+<title>tbb::bad_last_alloc Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,45 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00269.html">concurrent_hash_map</a>::<a class="el" href="a00270.html">accessor</a></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::accessor" --><!-- doxytag: inherits="tbb::interface5::concurrent_hash_map::const_accessor" -->Allows write access to elements and combines data access, locking, and garbage collection.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00270.html">bad_last_alloc</a></div>
+<h1>tbb::bad_last_alloc Class Reference</h1><!-- doxytag: class="tbb::bad_last_alloc" -->Exception for concurrent containers.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00455.html">concurrent_hash_map.h</a>></code>
+<code>#include <tbb_exception.h></code>
<p>
-<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
-<p><center><img src="a00270.png" usemap="#tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map" border="0" alt=""></center>
-<map name="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map">
-<area href="a00272.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,530,24">
-</map>
-<a href="a00023.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00156.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b648be7a95a8fb2971042c15eb112c1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::value_type" ref="0b648be7a95a8fb2971042c15eb112c1" args="" -->
-typedef concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="170280ea807a22e742095de3e8c5ea38"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::operator *" ref="170280ea807a22e742095de3e8c5ea38" args="() const " -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#170280ea807a22e742095de3e8c5ea38">operator *</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807920cdffe3ec5c5e282b4d1ff92a2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::operator->" ref="a807920cdffe3ec5c5e282b4d1ff92a2" args="() const " -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec7a57742ff4dc214266179d88984015"></a><!-- doxytag: member="tbb::bad_last_alloc::what" ref="ec7a57742ff4dc214266179d88984015" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</h3>
-
-Allows write access to elements and combines data access, locking, and garbage collection.
+Exception for concurrent containers.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00455.html">concurrent_hash_map.h</a></ul>
+<li>tbb_exception.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00270.png b/doc/html/a00270.png
deleted file mode 100644
index 9fd6a57..0000000
Binary files a/doc/html/a00270.png and /dev/null differ
diff --git a/doc/html/a00271.html b/doc/html/a00271.html
index 05c048d..3e71a00 100644
--- a/doc/html/a00271.html
+++ b/doc/html/a00271.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</title>
+<title>tbb::blocked_range< Value > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,201 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00269.html">concurrent_hash_map</a>::<a class="el" href="a00271.html">bucket_accessor</a></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::bucket_accessor" -->bucket accessor is to find, rehash, acquire a lock, and access a bucket
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00271.html">blocked_range</a></div>
+<h1>tbb::blocked_range< Value > Class Template Reference<br>
+<small>
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::blocked_range" -->A range over which to iterate.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00455.html">concurrent_hash_map.h</a>></code>
+<code>#include <blocked_range.h></code>
<p>
-<a href="a00021.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00010.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef Value </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of a value. <a href="#1a8d05842c2b3dfc177bc4d347e4cef7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f5707bffea38eee5c9680f37358afb8e"></a><!-- doxytag: member="tbb::blocked_range::size_type" ref="f5707bffea38eee5c9680f37358afb8e" args="" -->
+typedef std::size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of a range. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b1dcb174ab54b8612b25b6126d18d6c3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::bucket_accessor" ref="b1dcb174ab54b8612b25b6126d18d6c3" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
- </td><td class="memItemRight" valign="bottom"><b>bucket_accessor</b> (<a class="el" href="a00269.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#94607755c5110d199202234d58d022ac">blocked_range</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range with default-constructed values for begin and end. <a href="#94607755c5110d199202234d58d022ac"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14795a36ead1414b4371dbe1a4656359"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="14795a36ead1414b4371dbe1a4656359" args="(Value begin_, Value end_, size_type grainsize_=1)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range over half-open interval [begin,end), with the given grainsize. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="18d2258400756ac1446dac7676b18df3"></a><!-- doxytag: member="tbb::blocked_range::begin" ref="18d2258400756ac1446dac7676b18df3" args="() const " -->
+<a class="el" href="a00271.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#18d2258400756ac1446dac7676b18df3">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Beginning of range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8b929d93ddc13f148b11bceef3a3bdf8"></a><!-- doxytag: member="tbb::blocked_range::end" ref="8b929d93ddc13f148b11bceef3a3bdf8" args="() const " -->
+<a class="el" href="a00271.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">One past last value in range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#9eaa0b6beff1420f688570bbf6b8c462">size</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d11c77f4d70a94d4fb344492bbf18007"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::acquire" ref="d11c77f4d70a94d4fb344492bbf18007" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a> (<a class="el" href="a00269.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Size of the range. <a href="#9eaa0b6beff1420f688570bbf6b8c462"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2"></a><!-- doxytag: member="tbb::blocked_range::grainsize" ref="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2" args="() const " -->
+<a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">find a bucket by masked hashcode, optionally rehash, and acquire the lock <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="07d958f151a0eaa92f50fd56ad6440e2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::is_writer" ref="07d958f151a0eaa92f50fd56ad6440e2" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The grain size for this range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f4f02f530eb3f2e7ea26e06f76aef9d"></a><!-- doxytag: member="tbb::blocked_range::empty" ref="8f4f02f530eb3f2e7ea26e06f76aef9d" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">check whether bucket is locked for write <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa6314b861c574f86ed189b124cf5853"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::operator()" ref="fa6314b861c574f86ed189b124cf5853" args="()" -->
-bucket * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#fa6314b861c574f86ed189b124cf5853">operator()</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible. <a href="#41a58b703d574b6e1ca155df3576f578"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00271.html">blocked_range</a> &r, <a class="el" href="a00347.html">split</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Split range. <a href="#4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="395a514a55017e36d571809f1223389b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range2d" ref="395a514a55017e36d571809f1223389b" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13d172a4da9be197033e64516fff1f4b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range3d" ref="13d172a4da9be197033e64516fff1f4b" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">get bucket pointer <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</h3>
+<h3>template<typename Value><br>
+ class tbb::blocked_range< Value ></h3>
+
+A range over which to iterate.
+<p>
+<hr><h2>Member Typedef Documentation</h2>
+<a class="anchor" name="1a8d05842c2b3dfc177bc4d347e4cef7"></a><!-- doxytag: member="tbb::blocked_range::const_iterator" ref="1a8d05842c2b3dfc177bc4d347e4cef7" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef Value <a class="el" href="a00271.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00271.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Type of a value.
+<p>
+Called a const_iterator for sake of algorithms that need to treat a <a class="el" href="a00271.html">blocked_range</a> as an STL container.
+</div>
+</div><p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="94607755c5110d199202234d58d022ac"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="94607755c5110d199202234d58d022ac" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00271.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00271.html">blocked_range</a> </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Construct range with default-constructed values for begin and end.
+<p>
+Requires that Value have a default constructor.
+</div>
+</div><p>
+<a class="anchor" name="4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="4c0efd2be3f96a0ab3ba5085e8b3fcc7" args="(blocked_range &r, split)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00271.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00271.html">blocked_range</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00271.html">blocked_range</a>< Value > & </td>
+ <td class="paramname"> <em>r</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="a00347.html">split</a> </td>
+ <td class="paramname"></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Split range.
+<p>
+The new Range *this has the second half, the old range r has the first half. Unspecified if <a class="el" href="a00271.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00271.html#18d2258400756ac1446dac7676b18df3">begin()</a> or !is_divisible().
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="41a58b703d574b6e1ca155df3576f578"></a><!-- doxytag: member="tbb::blocked_range::is_divisible" ref="41a58b703d574b6e1ca155df3576f578" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00271.html">tbb::blocked_range</a>< Value >::is_divisible </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+True if range is divisible.
+<p>
+Unspecified if <a class="el" href="a00271.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00271.html#18d2258400756ac1446dac7676b18df3">begin()</a>.
+</div>
+</div><p>
+<a class="anchor" name="9eaa0b6beff1420f688570bbf6b8c462"></a><!-- doxytag: member="tbb::blocked_range::size" ref="9eaa0b6beff1420f688570bbf6b8c462" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00271.html">tbb::blocked_range</a>< Value >::size </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-bucket accessor is to find, rehash, acquire a lock, and access a bucket
<p>
+Size of the range.
+<p>
+Unspecified if <a class="el" href="a00271.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00271.html#18d2258400756ac1446dac7676b18df3">begin()</a>.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00455.html">concurrent_hash_map.h</a></ul>
+<li>blocked_range.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00272.html b/doc/html/a00272.html
index 1f6148c..ef878e0 100644
--- a/doc/html/a00272.html
+++ b/doc/html/a00272.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</title>
+<title>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,79 +21,63 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00269.html">concurrent_hash_map</a>::<a class="el" href="a00272.html">const_accessor</a></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::const_accessor" -->Combines data access, locking, and garbage collection.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00272.html">blocked_range2d</a></div>
+<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
+<small>
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::blocked_range2d" -->A 2-dimensional range that models the Range concept.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00455.html">concurrent_hash_map.h</a>></code>
+<code>#include <blocked_range2d.h></code>
<p>
-<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor:
-<p><center><img src="a00272.png" usemap="#tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map" border="0" alt=""></center>
-<map name="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map">
-<area href="a00270.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor" shape="rect" coords="0,56,530,80">
-</map>
-<a href="a00022.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00011.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8e50238483ba451363dccebd981d346"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::value_type" ref="a8e50238483ba451363dccebd981d346" args="" -->
-typedef const concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#a8e50238483ba451363dccebd981d346">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807a22fe658ec38b8edfd69521d0383"></a><!-- doxytag: member="tbb::blocked_range2d::row_range_type" ref="a807a22fe658ec38b8edfd69521d0383" args="" -->
+typedef <a class="el" href="a00271.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84c3080d0c6124d55c8bb4cf6055e65f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::empty" ref="84c3080d0c6124d55c8bb4cf6055e65f" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if result is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7db006d41b49dc5f1716a913769d4698"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::release" ref="7db006d41b49dc5f1716a913769d4698" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set to null. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9411df8197ceb4881ec4c7368a0a7f88"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::operator *" ref="9411df8197ceb4881ec4c7368a0a7f88" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteration range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="750d5c6ac9915443df477a30031c07fd"></a><!-- doxytag: member="tbb::blocked_range2d::col_range_type" ref="750d5c6ac9915443df477a30031c07fd" args="" -->
+typedef <a class="el" href="a00271.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d03a48ecb8cd9549bd8be64b09c9b0d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::operator->" ref="3d03a48ecb8cd9549bd8be64b09c9b0d" args="() const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27399c613eb1aecd4660803955dda09d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::const_accessor" ref="27399c613eb1aecd4660803955dda09d" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#27399c613eb1aecd4660803955dda09d">const_accessor</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4180bc35d4f8ed9f20045dba4f2a1bdc"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4180bc35d4f8ed9f20045dba4f2a1bdc" args="(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, typename <a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Create empty result. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="928769b139d53427e7075c1f86148e4c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::~const_accessor" ref="928769b139d53427e7075c1f86148e4c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="485434db1609b2074d86cb604f3c674e"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="485434db1609b2074d86cb604f3c674e" args="(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy result after releasing the underlying reference. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45ab59454c6f11fe938bbcab637cdd73"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::is_writer" ref="45ab59454c6f11fe938bbcab637cdd73" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>is_writer</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d144cb2d88cef553420311aca8667a44"></a><!-- doxytag: member="tbb::blocked_range2d::empty" ref="d144cb2d88cef553420311aca8667a44" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#d144cb2d88cef553420311aca8667a44">empty</a> () const </td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="21856da696b0765cc3db90663160d95e"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::my_node" ref="21856da696b0765cc3db90663160d95e" args="" -->
-node * </td><td class="memItemRight" valign="bottom"><b>my_node</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad36a9b38e4fef26d376f99552ce2d92"></a><!-- doxytag: member="tbb::blocked_range2d::is_divisible" ref="ad36a9b38e4fef26d376f99552ce2d92" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4936cc9432926ed38f0207828b388e24"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::my_hash" ref="4936cc9432926ed38f0207828b388e24" args="" -->
-hashcode_t </td><td class="memItemRight" valign="bottom"><b>my_hash</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f80e6db02bfa4e90e2a219de9f17461"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4f80e6db02bfa4e90e2a219de9f17461" args="(blocked_range2d &r, split)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (<a class="el" href="a00272.html">blocked_range2d</a> &r, <a class="el" href="a00347.html">split</a>)</td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d062d8ecb243a6ec62fa30bca52a1bcf"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::concurrent_hash_map< Key, T, HashCompare, Allocator >" ref="d062d8ecb243a6ec62fa30bca52a1bcf" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f496e7348a82652fba581203477cc07c"></a><!-- doxytag: member="tbb::blocked_range2d::rows" ref="f496e7348a82652fba581203477cc07c" args="() const " -->
+const <a class="el" href="a00271.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#f496e7348a82652fba581203477cc07c">rows</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ddd77aff56c12366acc02d0f1588a706"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::accessor" ref="ddd77aff56c12366acc02d0f1588a706" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>accessor</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="392a46759af2c884957115771affa7f4"></a><!-- doxytag: member="tbb::blocked_range2d::cols" ref="392a46759af2c884957115771affa7f4" args="() const " -->
+const <a class="el" href="a00271.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#392a46759af2c884957115771affa7f4">cols</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</h3>
+<h3>template<typename RowValue, typename ColValue = RowValue><br>
+ class tbb::blocked_range2d< RowValue, ColValue ></h3>
-Combines data access, locking, and garbage collection.
+A 2-dimensional range that models the Range concept.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00455.html">concurrent_hash_map.h</a></ul>
+<li>blocked_range2d.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00273.html b/doc/html/a00273.html
index 2b9bf6b..a4e32cb 100644
--- a/doc/html/a00273.html
+++ b/doc/html/a00273.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_priority_queue< T, Compare, A > Class Template Reference</title>
+<title>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,325 +21,70 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00273.html">concurrent_priority_queue</a></div>
-<h1>tbb::interface5::concurrent_priority_queue< T, Compare, A > Class Template Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_priority_queue" -->Concurrent priority queue.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00273.html">blocked_range3d</a></div>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
+<small>
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::blocked_range3d" -->A 3-dimensional range that models the Range concept.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00473.html">concurrent_priority_queue.h</a>></code>
+<code>#include <blocked_range3d.h></code>
<p>
-<a href="a00031.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00012.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c611a6b5b8f94b0e7f2afc97e31efb1"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::value_type" ref="7c611a6b5b8f94b0e7f2afc97e31efb1" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8ebf17a552ba47825e9b3887855b719"></a><!-- doxytag: member="tbb::blocked_range3d::page_range_type" ref="b8ebf17a552ba47825e9b3887855b719" args="" -->
+typedef <a class="el" href="a00271.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5804b3c708ef4e50d603f918ef2b9e58"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::reference" ref="5804b3c708ef4e50d603f918ef2b9e58" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteration range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4edc39b1a76c84c8f43ea8bff3e88007"></a><!-- doxytag: member="tbb::blocked_range3d::row_range_type" ref="4edc39b1a76c84c8f43ea8bff3e88007" args="" -->
+typedef <a class="el" href="a00271.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><b>row_range_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4ded8601a434098605be0dcc4febc60"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::const_reference" ref="a4ded8601a434098605be0dcc4febc60" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#a4ded8601a434098605be0dcc4febc60">const_reference</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02229b59d4dc5437bf5fbe72acca7f66"></a><!-- doxytag: member="tbb::blocked_range3d::col_range_type" ref="02229b59d4dc5437bf5fbe72acca7f66" args="" -->
+typedef <a class="el" href="a00271.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b679eea8d01d041625a39f719ca2b7ed"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::size_type" ref="b679eea8d01d041625a39f719ca2b7ed" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77399bc76b3ecd60e33f7e35a5becd87"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::difference_type" ref="77399bc76b3ecd60e33f7e35a5becd87" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1712cb3a46bc1821fccc5e2cd83d5cd7"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::allocator_type" ref="1712cb3a46bc1821fccc5e2cd83d5cd7" args="" -->
-typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eefa40599afe00ea393897d8f5662e65"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="eefa40599afe00ea393897d8f5662e65" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a> (const <a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00273.html">concurrent_priority_queue</a> with default capacity. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4555b4a55415a70024c4004b51e9f385"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="4555b4a55415a70024c4004b51e9f385" args="(size_type init_capacity, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a> (<a class="el" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, const <a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00273.html">concurrent_priority_queue</a> with init_sz capacity. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9147cb4207017c260a0c3929c12cd40f"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="9147cb4207017c260a0c3929c12cd40f" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00273.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a> (const <a class="el" href="a00273.html">concurrent_priority_queue</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <a href="#509419e320f200456d89dc54a65140b3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#c8b20e7430c5302936030bef59a562be">concurrent_priority_queue</a> (const <a class="el" href="a00273.html">concurrent_priority_queue</a> &src, const <a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor with specific allocator. <a href="#c8b20e7430c5302936030bef59a562be"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00273.html">concurrent_priority_queue</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a> (const <a class="el" href="a00273.html">concurrent_priority_queue</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment operator. <a href="#2ab7f7808891027ac0f0f5b3a4be51e9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#317c508fa92df218be5d014c26c09bb7">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if empty, false otherwise. <a href="#317c508fa92df218be5d014c26c09bb7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a762f420ed83a887967cb7dfe337582c"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a762f420ed83a887967cb7dfe337582c" args="(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of elements contained in the queue. <a href="#8b2ae25c61338c6fd59e94fe09822ba5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#d905af7b8f6defff562f5ae9c3275763">push</a> (<a class="el" href="a00273.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> elem)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b4dcf5b059634b95c1671086bf6d4ff"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="0b4dcf5b059634b95c1671086bf6d4ff" args="(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_gr [...]
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, typename <a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00271.html#f5707bffea38eee [...]
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pushes elem onto the queue, increasing capacity of queue if necessary. <a href="#d905af7b8f6defff562f5ae9c3275763"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a> (<a class="el" href="a00273.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> elem)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="356860e1c977d91711e8216bd55c0b25"></a><!-- doxytag: member="tbb::blocked_range3d::empty" ref="356860e1c977d91711e8216bd55c0b25" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#356860e1c977d91711e8216bd55c0b25">empty</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Gets a reference to and removes highest priority element. <a href="#e036461a29cc40902a2bb79abf9f5146"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39d69191721c488e737ae5d9c5336b9c"></a><!-- doxytag: member="tbb::blocked_range3d::is_divisible" ref="39d69191721c488e737ae5d9c5336b9c" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue; not thread-safe. <a href="#0bdcdf7cde9fd369edca845bec34ca94"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#0ecdc6a04aa259374425d424ca2a6082">swap</a> (<a class="el" href="a00273.html">concurrent_priority_queue</a> &q)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0d6f0085c9fb364ddcbc2197da6c251"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a0d6f0085c9fb364ddcbc2197da6c251" args="(blocked_range3d &r, split)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (<a class="el" href="a00273.html">blocked_range3d</a> &r, <a class="el" href="a00347.html">split</a>)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Swap this queue with another; not thread-safe. <a href="#0ecdc6a04aa259374425d424ca2a6082"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d545d444fb0d16148f9b61fd89f9a337"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::get_allocator" ref="d545d444fb0d16148f9b61fd89f9a337" args="() const " -->
-<a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf971430aa12361d3ed245344b7c6764"></a><!-- doxytag: member="tbb::blocked_range3d::pages" ref="cf971430aa12361d3ed245344b7c6764" args="() const " -->
+const <a class="el" href="a00271.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#cf971430aa12361d3ed245344b7c6764">pages</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>cpq_operation</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The pages of the iteration space. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1584623e59ff32a8aa82006827508be4"></a><!-- doxytag: member="tbb::blocked_range3d::rows" ref="1584623e59ff32a8aa82006827508be4" args="() const " -->
+const <a class="el" href="a00271.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#1584623e59ff32a8aa82006827508be4">rows</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>my_functor_t</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3336ba9480fd6c43e158f9beb024c050"></a><!-- doxytag: member="tbb::blocked_range3d::cols" ref="3336ba9480fd6c43e158f9beb024c050" args="() const " -->
+const <a class="el" href="a00271.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#3336ba9480fd6c43e158f9beb024c050">cols</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>><br>
- class tbb::interface5::concurrent_priority_queue< T, Compare, A ></h3>
+<h3>template<typename PageValue, typename RowValue = PageValue, typename ColValue = RowValue><br>
+ class tbb::blocked_range3d< PageValue, RowValue, ColValue ></h3>
-Concurrent priority queue.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="509419e320f200456d89dc54a65140b3"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="509419e320f200456d89dc54a65140b3" args="(const concurrent_priority_queue &src)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00273.html">concurrent_priority_queue</a> </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="a00273.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
- <td class="paramname"> <em>src</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, explicit]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Copy constructor.
-<p>
-This operation is unsafe if there are pending concurrent operations on the src queue.
-</div>
-</div><p>
-<a class="anchor" name="c8b20e7430c5302936030bef59a562be"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="c8b20e7430c5302936030bef59a562be" args="(const concurrent_priority_queue &src, const allocator_type &a)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00273.html">concurrent_priority_queue</a> </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="a00273.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
- <td class="paramname"> <em>src</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const <a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> & </td>
- <td class="paramname"> <em>a</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Copy constructor with specific allocator.
-<p>
-This operation is unsafe if there are pending concurrent operations on the src queue.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="0bdcdf7cde9fd369edca845bec34ca94"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::clear" ref="0bdcdf7cde9fd369edca845bec34ca94" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::clear </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Clear the queue; not thread-safe.
-<p>
-This operation is unsafe if there are pending concurrent operations on the queue. Resets size, effectively emptying queue; does not free space. May not clear elements added in pending operations.
-</div>
-</div><p>
-<a class="anchor" name="317c508fa92df218be5d014c26c09bb7"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::empty" ref="317c508fa92df218be5d014c26c09bb7" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::empty </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns true if empty, false otherwise.
-<p>
-Returned value may not reflect results of pending operations. This operation reads shared data and will trigger a race condition.
-</div>
-</div><p>
-<a class="anchor" name="2ab7f7808891027ac0f0f5b3a4be51e9"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::operator=" ref="2ab7f7808891027ac0f0f5b3a4be51e9" args="(const concurrent_priority_queue &src)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00273.html">concurrent_priority_queue</a>& <a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::operator= </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="a00273.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
- <td class="paramname"> <em>src</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Assignment operator.
-<p>
-This operation is unsafe if there are pending concurrent operations on the src queue.
-</div>
-</div><p>
-<a class="anchor" name="d905af7b8f6defff562f5ae9c3275763"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::push" ref="d905af7b8f6defff562f5ae9c3275763" args="(const_reference elem)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::push </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00273.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> </td>
- <td class="paramname"> <em>elem</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Pushes elem onto the queue, increasing capacity of queue if necessary.
-<p>
-This operation can be safely used concurrently with other push, try_pop or reserve operations.
-</div>
-</div><p>
-<a class="anchor" name="8b2ae25c61338c6fd59e94fe09822ba5"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::size" ref="8b2ae25c61338c6fd59e94fe09822ba5" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::size </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the current number of elements contained in the queue.
-<p>
-Returned value may not reflect results of pending operations. This operation reads shared data and will trigger a race condition.
-</div>
-</div><p>
-<a class="anchor" name="0ecdc6a04aa259374425d424ca2a6082"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::swap" ref="0ecdc6a04aa259374425d424ca2a6082" args="(concurrent_priority_queue &q)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::swap </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00273.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
- <td class="paramname"> <em>q</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Swap this queue with another; not thread-safe.
-<p>
-This operation is unsafe if there are pending concurrent operations on the queue.
-</div>
-</div><p>
-<a class="anchor" name="e036461a29cc40902a2bb79abf9f5146"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::try_pop" ref="e036461a29cc40902a2bb79abf9f5146" args="(reference elem)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::try_pop </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00273.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> </td>
- <td class="paramname"> <em>elem</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Gets a reference to and removes highest priority element.
+A 3-dimensional range that models the Range concept.
<p>
-If a highest priority element was found, sets elem and returns true, otherwise returns false. This operation can be safely used concurrently with other push, try_pop or reserve operations.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00473.html">concurrent_priority_queue.h</a></ul>
+<li>blocked_range3d.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00274.html b/doc/html/a00274.html
index ddc0616..2964595 100644
--- a/doc/html/a00274.html
+++ b/doc/html/a00274.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference</title>
+<title>tbb::flow::interface6::broadcast_node< T > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,146 +21,87 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>strict_ppl</b>::<a class="el" href="a00274.html">concurrent_queue</a></div>
-<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00427.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::strict_ppl::concurrent_queue" -->A high-performance thread-safe non-blocking concurrent queue.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00274.html">broadcast_node</a></div>
+<h1>tbb::flow::interface6::broadcast_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::broadcast_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::receiver,tbb::flow::interface6::sender" -->Forwards messages of type T to all successors.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00476.html">concurrent_queue.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<a href="a00035.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::broadcast_node< T >:
+<p><center><img src="a00274.png" usemap="#tbb::flow::interface6::broadcast_node< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::broadcast_node< T >_map">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,249,24">
+<area href="a00333.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="259,0,508,24">
+<area href="a00339.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="518,0,767,24">
+</map>
+<a href="a00073.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="682c3978d5cb0620000994f11c44a476"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::value_type" ref="682c3978d5cb0620000994f11c44a476" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#682c3978d5cb0620000994f11c44a476">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="43c775d80e98cc601de69764983319f9"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::input_type" ref="43c775d80e98cc601de69764983319f9" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#43c775d80e98cc601de69764983319f9">input_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8d725c50a9834bb7af5b67c0aff92b8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::reference" ref="a8d725c50a9834bb7af5b67c0aff92b8" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fd8d3075823e08b879be46c1215ab0f"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::output_type" ref="8fd8d3075823e08b879be46c1215ab0f" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d48e7ff93f81636bca2c74f7da34750"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_reference" ref="4d48e7ff93f81636bca2c74f7da34750" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e2ad9a121cb286aa0d0142fef33c646"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::predecessor_type" ref="0e2ad9a121cb286aa0d0142fef33c646" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< <a class="el" href="a00274.html#43c775d80e98cc601de69764983319f9">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#0e2ad9a121cb286aa0d0142fef33c646">predecessor_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fc30e93f8342a1960357f71e4fe8a2b"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::size_type" ref="8fc30e93f8342a1960357f71e4fe8a2b" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="068576d16c7e4e05d52f9db7a45b5b65"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::difference_type" ref="068576d16c7e4e05d52f9db7a45b5b65" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a3956341728eaa558d8827063718cac"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::allocator_type" ref="5a3956341728eaa558d8827063718cac" args="" -->
-typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9736ac047d6da3363895c7e5b121d0c4"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::iterator" ref="9736ac047d6da3363895c7e5b121d0c4" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00274.html">concurrent_queue</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9cd76d19af8c78be1bafc6ca0123ac0d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_iterator" ref="9cd76d19af8c78be1bafc6ca0123ac0d" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00274.html">concurrent_queue</a>, const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cc6a0eb1c4ee65465770628d8366f055"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::successor_type" ref="cc6a0eb1c4ee65465770628d8366f055" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00274.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#cc6a0eb1c4ee65465770628d8366f055">successor_type</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c48a05a94a1f4f98fdfadfbef98ecf6"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="7c48a05a94a1f4f98fdfadfbef98ecf6" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="25209656c84f2f9b030e2f9162713341"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="25209656c84f2f9b030e2f9162713341" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a6b98ea11a867db8ac868f0113ca429"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="8a6b98ea11a867db8ac868f0113ca429" args="(const concurrent_queue &src, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00274.html">concurrent_queue</a> &src, const <a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="830b33753d6b149c366344e29b2edd8c"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::~concurrent_queue" ref="830b33753d6b149c366344e29b2edd8c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="73c47563ffcc4c2f6452f25a04ebe2e2"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::push" ref="73c47563ffcc4c2f6452f25a04ebe2e2" args="(const T &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a> (const T &source)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="89e20f24ae56d38a5ee52f8d41e1a79c"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::broadcast_node" ref="89e20f24ae56d38a5ee52f8d41e1a79c" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><b>broadcast_node</b> (<a class="el" href="a00300.html">graph</a> &g)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a> (T &result)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bdcf84bf5b52c3af2d5332dc9d5fec07"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::broadcast_node" ref="bdcf84bf5b52c3af2d5332dc9d5fec07" args="(const broadcast_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>broadcast_node</b> (const <a class="el" href="a00274.html">broadcast_node</a> &src)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#ae31ca0db34ef96ef1e74aa0d28c95f8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eaa35a5274606779802e9a669a706260"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_size" ref="eaa35a5274606779802e9a669a706260" args="() const " -->
-<a class="el" href="a00274.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#eaa35a5274606779802e9a669a706260">unsafe_size</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fd0324c9ddb51fe6f95b3d015d338941"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::register_successor" ref="fd0324c9ddb51fe6f95b3d015d338941" args="(receiver< T > &r)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a> (<a class="el" href="a00333.html">receiver</a>< T > &r)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the number of items in the queue; thread unsafe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3f6fce0cfa2d581d6f3b47e0613ad64"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::empty" ref="f3f6fce0cfa2d581d6f3b47e0613ad64" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Adds a successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="366efcc046ec08a104281109801ae629"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::remove_successor" ref="366efcc046ec08a104281109801ae629" args="(receiver< T > &r)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#366efcc046ec08a104281109801ae629">remove_successor</a> (<a class="el" href="a00333.html">receiver</a>< T > &r)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to size()==0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c32e8e84c0524155133b4aae32d2a827"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::clear" ref="c32e8e84c0524155133b4aae32d2a827" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#c32e8e84c0524155133b4aae32d2a827">clear</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes s as a successor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b4804d99e0fb0576f1061ab7269e5939"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::try_put_task" ref="b4804d99e0fb0576f1061ab7269e5939" args="(const T &t)" -->
+<a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#b4804d99e0fb0576f1061ab7269e5939">try_put_task</a> (const T &t)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue. not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f034f70caef445fe8abc9113ec926a8d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::get_allocator" ref="f034f70caef445fe8abc9113ec926a8d" args="() const " -->
-<a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">build a task to run the successor if possible. Default is old behavior. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0f6d6d9e50a9cebe40df876a3c7a8804"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::reset" ref="0f6d6d9e50a9cebe40df876a3c7a8804" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6297f48808dd7c14e6c2fe81559ca190"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="6297f48808dd7c14e6c2fe81559ca190" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4e216903c618e25d2e3780483c763f67"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::reset_receiver" ref="4e216903c618e25d2e3780483c763f67" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset_receiver</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1569f70e70521fe71944a5b0138c6ef5"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="1569f70e70521fe71944a5b0138c6ef5" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3e6746f7b6ecfbc16f781665ac51112"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="e3e6746f7b6ecfbc16f781665ac51112" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621bab40a858d214db69ef08d88b67c1"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::run_and_put_task" ref="621bab40a858d214db69ef08d88b67c1" args="" -->
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83bf90849c08f44d25dd7a3b207a8956"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="83bf90849c08f44d25dd7a3b207a8956" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">put item to successor; return task to run the successor if possible. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4fa30d87bc0bfa80942f97a8d58f1bd"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::internal::broadcast_cache" ref="e4fa30d87bc0bfa80942f97a8d58f1bd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::broadcast_cache</b></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31ba00ea3e3e5a421b38840bd0dc2589"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::internal::round_robin_cache" ref="31ba00ea3e3e5a421b38840bd0dc2589" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::round_robin_cache</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
- class tbb::strict_ppl::concurrent_queue< T, A ></h3>
+<h3>template<typename T><br>
+ class tbb::flow::interface6::broadcast_node< T ></h3>
-A high-performance thread-safe non-blocking concurrent queue.
-<p>
-Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="ae31ca0db34ef96ef1e74aa0d28c95f8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::try_pop" ref="ae31ca0db34ef96ef1e74aa0d28c95f8" args="(T &result)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue</a>< T, A >::try_pop </td>
- <td>(</td>
- <td class="paramtype">T & </td>
- <td class="paramname"> <em>result</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Attempt to dequeue an item from head of queue.
+Forwards messages of type T to all successors.
<p>
-Does not wait for item to become available. Returns true if successful; false otherwise.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00476.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00262.png b/doc/html/a00274.png
similarity index 100%
copy from doc/html/a00262.png
copy to doc/html/a00274.png
diff --git a/doc/html/a00275.html b/doc/html/a00275.html
index 4917221..879508f 100644
--- a/doc/html/a00275.html
+++ b/doc/html/a00275.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::deprecated::concurrent_queue< T, A > Class Template Reference</title>
+<title>tbb::flow::interface6::buffer_node< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,131 +21,385 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00275.html">concurrent_queue</a></div>
-<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00427.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::deprecated::concurrent_queue" --><!-- doxytag: inherits="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00275.html">buffer_node</a></div>
+<h1>tbb::flow::interface6::buffer_node< T, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::buffer_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::receiver,tbb::flow::interface6::sender" -->Forwards messages in arbitrary order.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00476.html">concurrent_queue.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
-<p><center><img src="a00275.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::deprecated::concurrent_queue< T, A >_map">
-<area href="a00268.html" alt="tbb::concurrent_bounded_queue< T, A >" shape="rect" coords="0,0,257,24">
+<p>Inheritance diagram for tbb::flow::interface6::buffer_node< T, A >:
+<p><center><img src="a00275.png" usemap="#tbb::flow::interface6::buffer_node< T, A >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::buffer_node< T, A >_map">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,352,24">
+<area href="a00333.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="362,0,714,24">
+<area href="a00339.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="724,0,1076,24">
+<area href="a00324.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
+<area href="a00325.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
+<area href="a00340.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
</map>
-<a href="a00038.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00074.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8861a9cdf232a20b5f2569754a281871"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::iterator" ref="8861a9cdf232a20b5f2569754a281871" args="" -->
-typedef <a class="el" href="a00268.html">concurrent_bounded_queue</a><<br>
- T, A >::iterator </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="334efb81b56a2f2b3ae08a16e8d65620"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::input_type" ref="334efb81b56a2f2b3ae08a16e8d65620" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7117842ce3ed7c5147d3c886922e64d0"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::const_iterator" ref="7117842ce3ed7c5147d3c886922e64d0" args="" -->
-typedef <a class="el" href="a00268.html">concurrent_bounded_queue</a><<br>
- T, A >::const_iterator </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="089520db81f6a1551dc94c01efbdd7be"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::output_type" ref="089520db81f6a1551dc94c01efbdd7be" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#089520db81f6a1551dc94c01efbdd7be">output_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fb0ad03a822ca0fc34ad5d56a4093a2"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::predecessor_type" ref="5fb0ad03a822ca0fc34ad5d56a4093a2" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< <a class="el" href="a00275.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#5fb0ad03a822ca0fc34ad5d56a4093a2">predecessor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="66f7eda69b75e08f50726e50a11429cd"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::successor_type" ref="66f7eda69b75e08f50726e50a11429cd" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00275.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17ee32d233db52b86256480d5f048e16"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_class" ref="17ee32d233db52b86256480d5f048e16" args="" -->
+typedef <a class="el" href="a00275.html">buffer_node</a>< T, A > </td><td class="memItemRight" valign="bottom"><b>my_class</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aaf19bd7337b72f3131ece60f7315ef7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="aaf19bd7337b72f3131ece60f7315ef7" args="(const A &a=A())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a> (const A &a=A())</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fe4b79f780586ff66e002ce32a5c60d"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::buffer_node" ref="5fe4b79f780586ff66e002ce32a5c60d" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a> (<a class="el" href="a00300.html">graph</a> &g)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fc092b9082f233482f3513fc3bb670f7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="fc092b9082f233482f3513fc3bb670f7" args="(const concurrent_queue &src, const A &a=A())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00275.html">concurrent_queue</a> &src, const A &a=A())</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="03ad7b85a8341437f584af06ad050cdc"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::buffer_node" ref="03ad7b85a8341437f584af06ad050cdc" args="(const buffer_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a> (const <a class="el" href="a00275.html">buffer_node</a> &src)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9102b897776bd2d9e908e6604ff16b5f"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="9102b897776bd2d9e908e6604ff16b5f" args="(InputIterator b, InputIterator e, const A &a=A())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a> (InputIterator b, InputIterator e, const A &a=A())</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#f8bf4944ede4fc106423d67715beb695">register_successor</a> (<a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00275.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > &r)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Adds a new successor. <a href="#f8bf4944ede4fc106423d67715beb695"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a> (<a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00275.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > &r)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor. <a href="#2074da0e39b9477c32897d6e5786196f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#aeb8aec46ca99ca022356a792c46735e">try_get</a> (T &v)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the <a class="el" href="a00275.html">buffer_node</a>. <a href="#aeb8aec46ca99ca022356a792c46735e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a> (T &v)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item. <a href="#1cc889bb6c38bcb81757d0ebbc3a5e64"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item. <a href="#2c8e8f2f5f4ff5be27136cc1184a3c3e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes a reserved item. <a href="#8ef07c434eb763d947a7b4e80c086a49"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bdeda814bba6d687b62449e8d7b8001"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::size_type" ref="3bdeda814bba6d687b62449e8d7b8001" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5da41039fc224257fc16df21ea78351c"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_handler" ref="5da41039fc224257fc16df21ea78351c" args="" -->
+typedef internal::aggregating_functor<<br>
+ <a class="el" href="a00275.html">my_class</a>, buffer_operation > </td><td class="memItemRight" valign="bottom"><b>my_handler</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579ba61e9d48b022a45d302fb7cc2e99587"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::reg_succ" ref="27ef87d052ece9366a56e5dfd8017579ba61e9d48b022a45d302fb7cc2e99587" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>reg_succ</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579e5c114ade89a63b1d44116994be56f94"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::rem_succ" ref="27ef87d052ece9366a56e5dfd8017579e5c114ade89a63b1d44116994be56f94" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>rem_succ</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579b830235026f7286b15954d74559baeb8"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::req_item" ref="27ef87d052ece9366a56e5dfd8017579b830235026f7286b15954d74559baeb8" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>req_item</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579014be13638194a9fe0b10201be74847e"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::res_item" ref="27ef87d052ece9366a56e5dfd8017579014be13638194a9fe0b10201be74847e" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>res_item</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579d451e6807b6f8238c3fed708789c9fb3"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::rel_res" ref="27ef87d052ece9366a56e5dfd8017579d451e6807b6f8238c3fed708789c9fb3" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>rel_res</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579b2a86824c712d448bd3ff7c6e905fb48"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::con_res" ref="27ef87d052ece9366a56e5dfd8017579b2a86824c712d448bd3ff7c6e905fb48" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>con_res</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd80175799f00b67eaae74451baf63ea2dc0cb94c"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::put_item" ref="27ef87d052ece9366a56e5dfd80175799f00b67eaae74451baf63ea2dc0cb94c" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>put_item</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd801757944e067a8959b08624d5675b29b4f344f"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_fwd_task" ref="27ef87d052ece9366a56e5dfd801757944e067a8959b08624d5675b29b4f344f" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>try_fwd_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca181d774b321a511fd9a9653ce2a60f415a59924de2ce1c447c79a1b278a3a"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::WAIT" ref="0ca181d774b321a511fd9a9653ce2a60f415a59924de2ce1c447c79a1b278a3a" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca181d774b321a511fd9a9653ce2a60159bdd1eb0a3e1245f61a1e3bcca417f"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::SUCCEEDED" ref="0ca181d774b321a511fd9a9653ce2a60159bdd1eb0a3e1245f61a1e3bcca417f" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca181d774b321a511fd9a9653ce2a602c60f32df3cedd3c31dadd0086e5edc4"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::FAILED" ref="0ca181d774b321a511fd9a9653ce2a602c60f32df3cedd3c31dadd0086e5edc4" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>op_type</b> { <br>
+ <b>reg_succ</b>,
+<b>rem_succ</b>,
+<b>req_item</b>,
+<b>res_item</b>,
+<br>
+ <b>rel_res</b>,
+<b>con_res</b>,
+<b>put_item</b>,
+<b>try_fwd_task</b>
+<br>
+ }</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0,
+<b>SUCCEEDED</b>,
+<b>FAILED</b>
+ }</td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c896b8640b606e49f369d1260c041ded"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::handle_operations" ref="c896b8640b606e49f369d1260c041ded" args="(buffer_operation *op_list)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>handle_operations</b> (buffer_operation *op_list)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="285804d036b538fe1d656fa829672b71"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::grab_forwarding_task" ref="285804d036b538fe1d656fa829672b71" args="(buffer_operation &op_data)" -->
+<a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>grab_forwarding_task</b> (buffer_operation &op_data)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9369eb4fe99cdfe534b99102b069ea43"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::enqueue_forwarding_task" ref="9369eb4fe99cdfe534b99102b069ea43" args="(buffer_operation &op_data)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>enqueue_forwarding_task</b> (buffer_operation &op_data)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8954338d1a7740f9be80455ba27e8eed"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::forward_task" ref="8954338d1a7740f9be80455ba27e8eed" args="()" -->
+virtual <a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#8954338d1a7740f9be80455ba27e8eed">forward_task</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">This is executed by an enqueued task, the "forwarder". <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="df21388252b8963e839dca29d2c67ea5"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_reg_succ" ref="df21388252b8963e839dca29d2c67ea5" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a> (buffer_operation *op)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a> (const T &source)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Register successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b6cf76dff80fd679251da93351c1291"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_rem_succ" ref="6b6cf76dff80fd679251da93351c1291" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a> (buffer_operation *op)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full. <a href="#7c45561bafe71107d09b2bc1b8f4e681"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc6ef82fe9c28ace2ef6b78abb43ffb8"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_forward_task" ref="bc6ef82fe9c28ace2ef6b78abb43ffb8" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#bc6ef82fe9c28ace2ef6b78abb43ffb8">internal_forward_task</a> (buffer_operation *op)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#48da3536245318af6cb5fd58bac78039"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed7202cd273ae36463e6ac57e9472670"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="ed7202cd273ae36463e6ac57e9472670" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="58c70e13ecd40cdaa59cda059e68de51"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_push" ref="58c70e13ecd40cdaa59cda059e68de51" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_push</b> (buffer_operation *op)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35fbb0d7e135545eb1daec2b4ae894cd"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="35fbb0d7e135545eb1daec2b4ae894cd" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="035cbd758a1a28317ba951e2447e0826"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_pop" ref="035cbd758a1a28317ba951e2447e0826" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (buffer_operation *op)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="62f31fe653e1158e64ddb0e163d0335c"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="62f31fe653e1158e64ddb0e163d0335c" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4072ad4d1b320d584ea837048d6e4130"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_reserve" ref="4072ad4d1b320d584ea837048d6e4130" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (buffer_operation *op)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d42ddc4a6fe42350750a930302863d1"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="3d42ddc4a6fe42350750a930302863d1" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1177d6a157c14cdbfd7d4b05f01605a5"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_consume" ref="1177d6a157c14cdbfd7d4b05f01605a5" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (buffer_operation *op)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceeec6c56ae8e16effb3fd187e83d958"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_release" ref="ceeec6c56ae8e16effb3fd187e83d958" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_release</b> (buffer_operation *op)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84d939049fa8c3205aec91ced0980e03"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_put_task" ref="84d939049fa8c3205aec91ced0980e03" args="(const T &t)" -->
+<a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#84d939049fa8c3205aec91ced0980e03">try_put_task</a> (const T &t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">receive an item, return a task *if possible <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c79745aba84a849f0e84a12ce51f80ec"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::reset" ref="c79745aba84a849f0e84a12ce51f80ec" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2380fb8ae7d2e567a1ca9a032d96b4d3"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::reset_receiver" ref="2380fb8ae7d2e567a1ca9a032d96b4d3" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset_receiver</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28807215994d4c7d3725fac693b37ec1"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_successors" ref="28807215994d4c7d3725fac693b37ec1" args="" -->
+internal::round_robin_cache<<br>
+ T, <a class="el" href="a00317.html">null_rw_mutex</a> > </td><td class="memItemRight" valign="bottom"><b>my_successors</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b569eeae467185c45ea78ee1ab41a215"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_parent" ref="b569eeae467185c45ea78ee1ab41a215" args="" -->
+<a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>my_parent</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e90b3f77cbfac9fd5fb4d53456955d4"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::forwarder_busy" ref="5e90b3f77cbfac9fd5fb4d53456955d4" args="" -->
+bool </td><td class="memItemRight" valign="bottom"><b>forwarder_busy</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d008669d152fe291079f097da72ec74"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_aggregator" ref="4d008669d152fe291079f097da72ec74" args="" -->
+internal::aggregator< my_handler,<br>
+ buffer_operation > </td><td class="memItemRight" valign="bottom"><b>my_aggregator</b></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d217b28a982bca8ba8f50175c3e91621"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal::forward_task_bypass< buffer_node< T, A > >" ref="d217b28a982bca8ba8f50175c3e91621" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::forward_task_bypass< buffer_node< T, A > ></b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b5526a5033ff7acc64681cff9ad76b0"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal::aggregating_functor< my_class, buffer_operation >" ref="0b5526a5033ff7acc64681cff9ad76b0" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::aggregating_functor< my_class, buffer_operation ></b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621bab40a858d214db69ef08d88b67c1"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::run_and_put_task" ref="621bab40a858d214db69ef08d88b67c1" args="" -->
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">put item to successor; return task to run the successor if possible. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4fa30d87bc0bfa80942f97a8d58f1bd"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal::broadcast_cache" ref="e4fa30d87bc0bfa80942f97a8d58f1bd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::broadcast_cache</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31ba00ea3e3e5a421b38840bd0dc2589"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal::round_robin_cache" ref="31ba00ea3e3e5a421b38840bd0dc2589" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::round_robin_cache</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>buffer_operation</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
- class tbb::deprecated::concurrent_queue< T, A ></h3>
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::flow::interface6::buffer_node< T, A ></h3>
-A high-performance thread-safe blocking concurrent bounded queue.
-<p>
-This is the pre-PPL TBB concurrent queue which support boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
+Forwards messages in arbitrary order.
<p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="48da3536245318af6cb5fd58bac78039"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::pop_if_present" ref="48da3536245318af6cb5fd58bac78039" args="(T &destination)" -->
+<a class="anchor" name="f8bf4944ede4fc106423d67715beb695"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::register_successor" ref="f8bf4944ede4fc106423d67715beb695" args="(receiver< output_type > &r)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node</a>< T, A >::register_successor </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00275.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > & </td>
+ <td class="paramname"> <em>r</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Adds a new successor.
+<p>
+Adds successor r to the list of successors; may forward tasks.
+<p>
+Implements <a class="el" href="a00339.html#68b8941ad77b9303cf3bcb8cf1f2d28a">tbb::flow::interface6::sender< T ></a>.
+</div>
+</div><p>
+<a class="anchor" name="2074da0e39b9477c32897d6e5786196f"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::remove_successor" ref="2074da0e39b9477c32897d6e5786196f" args="(receiver< output_type > &r)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node</a>< T, A >::remove_successor </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00275.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > & </td>
+ <td class="paramname"> <em>r</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Removes a successor.
+<p>
+Removes successor r from the list of successors. It also calls r.remove_predecessor(*this) to remove this node as a predecessor.
+<p>
+Implements <a class="el" href="a00339.html#82f363bfb1738bb8789e167590b10ef9">tbb::flow::interface6::sender< T ></a>.
+</div>
+</div><p>
+<a class="anchor" name="8ef07c434eb763d947a7b4e80c086a49"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_consume" ref="8ef07c434eb763d947a7b4e80c086a49" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_consume </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Consumes a reserved item.
+<p>
+true = item is removed from sender and reservation removed
+<p>
+Reimplemented from <a class="el" href="a00339.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a>.
+</div>
+</div><p>
+<a class="anchor" name="aeb8aec46ca99ca022356a792c46735e"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_get" ref="aeb8aec46ca99ca022356a792c46735e" args="(T &v)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue</a>< T, A >::pop_if_present </td>
+ <td class="memname">bool <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_get </td>
<td>(</td>
<td class="paramtype">T & </td>
- <td class="paramname"> <em>destination</em> </td>
+ <td class="paramname"> <em>v</em> </td>
<td> ) </td>
- <td width="100%"><code> [inline]</code></td>
+ <td width="100%"><code> [inline, virtual]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Attempt to dequeue an item from head of queue.
+Request an item from the <a class="el" href="a00275.html">buffer_node</a>.
<p>
-Does not wait for item to become available. Returns true if successful; false otherwise. <dl compact><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Use <a class="el" href="a00268.html#0ca487019bbb00a196442aff78a1e4f7">try_pop()</a> </dd></dl>
+true = v contains the returned item<br>
+ false = no item has been returned
+<p>
+Reimplemented from <a class="el" href="a00339.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a>.
+</div>
+</div><p>
+<a class="anchor" name="2c8e8f2f5f4ff5be27136cc1184a3c3e"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_release" ref="2c8e8f2f5f4ff5be27136cc1184a3c3e" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_release </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+<p>
+Release a reserved item.
+<p>
+true = item has been released and so remains in sender
+<p>
+Reimplemented from <a class="el" href="a00339.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a>.
</div>
</div><p>
-<a class="anchor" name="7c45561bafe71107d09b2bc1b8f4e681"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::push_if_not_full" ref="7c45561bafe71107d09b2bc1b8f4e681" args="(const T &source)" -->
+<a class="anchor" name="1cc889bb6c38bcb81757d0ebbc3a5e64"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_reserve" ref="1cc889bb6c38bcb81757d0ebbc3a5e64" args="(T &v)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00275.html">tbb::deprecated::concurrent_queue</a>< T, A >::push_if_not_full </td>
+ <td class="memname">bool <a class="el" href="a00275.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_reserve </td>
<td>(</td>
- <td class="paramtype">const T & </td>
- <td class="paramname"> <em>source</em> </td>
+ <td class="paramtype">T & </td>
+ <td class="paramname"> <em>v</em> </td>
<td> ) </td>
- <td width="100%"><code> [inline]</code></td>
+ <td width="100%"><code> [inline, virtual]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Enqueue an item at tail of queue if queue is not already full.
+Reserves an item.
+<p>
+false = no item can be reserved<br>
+ true = an item is reserved
<p>
-Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full.
+Reimplemented from <a class="el" href="a00339.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a>.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00476.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00275.png b/doc/html/a00275.png
index 6aac5a0..425350b 100644
Binary files a/doc/html/a00275.png and b/doc/html/a00275.png differ
diff --git a/doc/html/a00276.html b/doc/html/a00276.html
index 3ea04eb..4627192 100644
--- a/doc/html/a00276.html
+++ b/doc/html/a00276.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::concurrent_vector< T, A > Class Template Reference</title>
+<title>tbb::cache_aligned_allocator< T > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,573 +21,88 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00276.html">concurrent_vector</a></div>
-<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00276.html">cache_aligned_allocator</a></div>
+<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00427.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_vector" -->Concurrent vector container.
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::cache_aligned_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00487.html">concurrent_vector.h</a>></code>
+<code>#include <cache_aligned_allocator.h></code>
<p>
-<a href="a00044.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00013.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc85684238d4bb5e422cb8ea0bdc438f"></a><!-- doxytag: member="tbb::concurrent_vector::size_type" ref="bc85684238d4bb5e422cb8ea0bdc438f" args="" -->
-typedef internal::concurrent_vector_base_v3::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f7128452e3c43b5bf1801b61d971d17"></a><!-- doxytag: member="tbb::cache_aligned_allocator::value_type" ref="8f7128452e3c43b5bf1801b61d971d17" args="" -->
+typedef internal::allocator_type<<br>
+ T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac7083635ab59834e9afc15e6c168df5"></a><!-- doxytag: member="tbb::concurrent_vector::allocator_type" ref="ac7083635ab59834e9afc15e6c168df5" args="" -->
-typedef internal::allocator_base<<br>
- T, A >::allocator_type </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b23ef1d76c34fe1c2ebbb2f3df5b5676"></a><!-- doxytag: member="tbb::cache_aligned_allocator::pointer" ref="b23ef1d76c34fe1c2ebbb2f3df5b5676" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4543d7d45b2e461d3f8ef416974ec1f1"></a><!-- doxytag: member="tbb::concurrent_vector::value_type" ref="4543d7d45b2e461d3f8ef416974ec1f1" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d15affd67eafcabbd12bd1cd07372994"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_pointer" ref="d15affd67eafcabbd12bd1cd07372994" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e655e67dd14ed6d0cbfe7981d5fa350e"></a><!-- doxytag: member="tbb::concurrent_vector::difference_type" ref="e655e67dd14ed6d0cbfe7981d5fa350e" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c29033785d76e240ea96ae40610275d"></a><!-- doxytag: member="tbb::concurrent_vector::reference" ref="8c29033785d76e240ea96ae40610275d" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b2a6241ab3fa9ab4f4074893fecd47"></a><!-- doxytag: member="tbb::concurrent_vector::const_reference" ref="b0b2a6241ab3fa9ab4f4074893fecd47" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74319c908a32d5dcdc6a080f9c2b8803"></a><!-- doxytag: member="tbb::concurrent_vector::pointer" ref="74319c908a32d5dcdc6a080f9c2b8803" args="" -->
-typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd80729019220cdb80872ea6b905ffb1"></a><!-- doxytag: member="tbb::concurrent_vector::const_pointer" ref="dd80729019220cdb80872ea6b905ffb1" args="" -->
-typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a049674e7f386de3ea09ff2ed6d6bbbe"></a><!-- doxytag: member="tbb::concurrent_vector::iterator" ref="a049674e7f386de3ea09ff2ed6d6bbbe" args="" -->
-typedef internal::vector_iterator<<br>
- <a class="el" href="a00276.html">concurrent_vector</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8c4e0d5867a07b1cea21d4fca2998c8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::reference" ref="e8c4e0d5867a07b1cea21d4fca2998c8" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b51a1baa7da67e283806c0d4f2fe9c69"></a><!-- doxytag: member="tbb::concurrent_vector::const_iterator" ref="b51a1baa7da67e283806c0d4f2fe9c69" args="" -->
-typedef internal::vector_iterator<<br>
- <a class="el" href="a00276.html">concurrent_vector</a>, const <br>
-T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d3d77a39f0852c42f80c6505843f450c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_reference" ref="d3d77a39f0852c42f80c6505843f450c" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7e4d252bef7af22286041c39c62abe"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="2c7e4d252bef7af22286041c39c62abe" args="" -->
-typedef std::reverse_iterator<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90ca6a2979ebee466be771f4c2f9337e"></a><!-- doxytag: member="tbb::cache_aligned_allocator::size_type" ref="90ca6a2979ebee466be771f4c2f9337e" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c59c3f9412b666a31a9052b789fb58bc"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="c59c3f9412b666a31a9052b789fb58bc" args="" -->
-typedef std::reverse_iterator<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c3901b092e9e8185bdc3cae5913e625"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="0c3901b092e9e8185bdc3cae5913e625" args="" -->
-typedef std::reverse_iterator<<br>
- iterator, T, T &, T * > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="426145d7bd5913bc08e701c14b221046"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="426145d7bd5913bc08e701c14b221046" args="" -->
-typedef std::reverse_iterator<<br>
- const_iterator, T, const <br>
-T &, const T * > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61fd90288dba6f8808d6dafe9a249ec5"></a><!-- doxytag: member="tbb::concurrent_vector::range_type" ref="61fd90288dba6f8808d6dafe9a249ec5" args="" -->
-typedef generic_range_type<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d6ddf0312a820a98efd9a5f394cb9dbd"></a><!-- doxytag: member="tbb::concurrent_vector::const_range_type" ref="d6ddf0312a820a98efd9a5f394cb9dbd" args="" -->
-typedef generic_range_type<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b73eba293d042333f343d025c26751a4"></a><!-- doxytag: member="tbb::cache_aligned_allocator::difference_type" ref="b73eba293d042333f343d025c26751a4" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c8ca9cabfcd30ad5943324c853664b5"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2c8ca9cabfcd30ad5943324c853664b5" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a> (const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty vector. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd8a200b99a8088435a37934b58fe335"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="dd8a200b99a8088435a37934b58fe335" args="(const concurrent_vector &vector, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00276.html">concurrent_vector</a> &vector, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="64432f13f7b29bfe4acfb5568f34f3a8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="64432f13f7b29bfe4acfb5568f34f3a8" args="(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())" -->
-template<class M> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00276.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00276.html">concurrent_vector</a>< T, M > &vector, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor for vector with different allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2a2e261dfe1cab3f73f7b1a94137cfca"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2a2e261dfe1cab3f73f7b1a94137cfca" args="(size_type n)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3883a8a908b44e249a57f454de3f55d8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="3883a8a908b44e249a57f454de3f55d8" args="(size_type n, const_reference t, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a> (size_type n, const_reference t, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n, initialization by copying of t, and given allocator instance. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4450de83c5862ea4bcd9443fd7e67419"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="4450de83c5862ea4bcd9443fd7e67419" args="(I first, I last, const allocator_type &a=allocator_type())" -->
-template<class I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00276.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="691f0f3cda3e489c37a657016e375eaf"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="691f0f3cda3e489c37a657016e375eaf" args="(const concurrent_vector &vector)" -->
-<a class="el" href="a00276.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00276.html">concurrent_vector</a> &vector)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="19f4ab88a01b0fd056af3bba463e7bd6"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="19f4ab88a01b0fd056af3bba463e7bd6" args="(const concurrent_vector< T, M > &vector)" -->
-template<class M> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00276.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00276.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00276.html">concurrent_vector</a>< T, M > &vector)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment for vector with different allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#30484e3959892fd5392fa93c873c31f0">grow_by</a> (size_type delta)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements. <a href="#30484e3959892fd5392fa93c873c31f0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a> (size_type delta)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#38274ab3f772ecba600c7daca7690102">grow_by</a> (size_type delta, const_reference t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements using copying constructor. <a href="#38274ab3f772ecba600c7daca7690102"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#473a59a4c9308b93411b898b3110d26c">grow_by</a> (size_type delta, const_reference t)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Append minimal sequence of elements such that <a class="el" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n. <a href="#47fe588214dd5fa06ab6e8ab78d83874"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a> (size_type n)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a> (const_reference item) iterator push_back(const _reference item)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Push item. <a href="#e94e038f915c0268fdf2d3d7f87d81b8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a> (size_type index)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. <a href="#4c52f2950bb1832886bd4458eb09d7eb"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6fade5c732cc95274d1d8277ea619d1"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="c6fade5c732cc95274d1d8277ea619d1" args="(size_type index) const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a> (size_type index) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c073ca43e787c7cbf7b0e26d2221748"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="0c073ca43e787c7cbf7b0e26d2221748" args="(size_type index)" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#0c073ca43e787c7cbf7b0e26d2221748">at</a> (size_type index)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. Throws exceptions on errors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23e14a38af748edff96a7adc3a0f1c58"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="23e14a38af748edff96a7adc3a0f1c58" args="(size_type index) const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#23e14a38af748edff96a7adc3a0f1c58">at</a> (size_type index) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. Throws exceptions on errors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4c6ffff3bf08b92939aa2fc516edfba"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="a4c6ffff3bf08b92939aa2fc516edfba" args="(size_t grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a> (size_t grainsize=1)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for iterating with parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d09ccfb581b879ae64203741035e193"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="3d09ccfb581b879ae64203741035e193" args="(size_t grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#3d09ccfb581b879ae64203741035e193">range</a> (size_t grainsize=1) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for iterating with parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="715fe313c4a9c22731cc404dd80c9ec9"></a><!-- doxytag: member="tbb::concurrent_vector::size" ref="715fe313c4a9c22731cc404dd80c9ec9" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return size of vector. It may include elements under construction. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6426cb93cf20d3af40f3c90f1f0481a"></a><!-- doxytag: member="tbb::concurrent_vector::empty" ref="c6426cb93cf20d3af40f3c90f1f0481a" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return false if vector is not empty or has elements under construction at least. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ed6b9ae7217af5103d974045b6f5cd5"></a><!-- doxytag: member="tbb::concurrent_vector::capacity" ref="3ed6b9ae7217af5103d974045b6f5cd5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum size to which array can grow without allocating more memory. Concurrent allocations are not included in the value. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate enough space to grow to size n without having to allocate more memory later. <a href="#5a0ce05026994b010018f72cfdeb72c1"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8dfb0cb0eef96d440b4dcf801807a718"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="8dfb0cb0eef96d440b4dcf801807a718" args="(size_type n)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector. Not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98ce6b2c6d2622f0c030b46dfac3880c"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="98ce6b2c6d2622f0c030b46dfac3880c" args="(size_type n, const_reference t)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a> (size_type n, const_reference t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector, copy t for new elements. Not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1693d1da41b1a8235871be9c6633be35"></a><!-- doxytag: member="tbb::concurrent_vector::compact" ref="1693d1da41b1a8235871be9c6633be35" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00276.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit()</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="03c6f4cf66532bf4cc907ee738a9a186"></a><!-- doxytag: member="tbb::concurrent_vector::shrink_to_fit" ref="03c6f4cf66532bf4cc907ee738a9a186" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Optimize memory usage and fragmentation. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c248a017f0576df3e7cd99627836fd6"></a><!-- doxytag: member="tbb::concurrent_vector::max_size" ref="2c248a017f0576df3e7cd99627836fd6" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#2c248a017f0576df3e7cd99627836fd6">max_size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on argument to reserve. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="730b23a251ecb6d37f692fb22f38e029"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="730b23a251ecb6d37f692fb22f38e029" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#730b23a251ecb6d37f692fb22f38e029">begin</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c0b51160e5a764982ec97a455f94f2c6"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="c0b51160e5a764982ec97a455f94f2c6" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#c0b51160e5a764982ec97a455f94f2c6">end</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78a06182276ff758788d4c0623ae0d71"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="78a06182276ff758788d4c0623ae0d71" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#78a06182276ff758788d4c0623ae0d71">begin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e6aa764ce5a1cbd24526f68bc0a2f6b"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="1e6aa764ce5a1cbd24526f68bc0a2f6b" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74ccd00a29171ddd61a4ea88cfa49c32"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="74ccd00a29171ddd61a4ea88cfa49c32" args="(const cache_aligned_allocator &)" -->
+ </td><td class="memItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00276.html">cache_aligned_allocator</a> &) throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f88fcf1c920693c39bd9709db33c199f"></a><!-- doxytag: member="tbb::concurrent_vector::cbegin" ref="f88fcf1c920693c39bd9709db33c199f" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a> () const </td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="de57e731c36a51bf39b458c9b8adee58"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="de57e731c36a51bf39b458c9b8adee58" args="(const cache_aligned_allocator< U > &)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00276.html">cache_aligned_allocator</a>< U > &) throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c15a5d0f1cf75d687dabba07da1d46b"></a><!-- doxytag: member="tbb::concurrent_vector::cend" ref="0c15a5d0f1cf75d687dabba07da1d46b" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="023e0cc7cf6ebde69e1f2c12182eb12b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="023e0cc7cf6ebde69e1f2c12182eb12b" args="(reference x) const " -->
+pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e220926d09236d98f04fe0721e5f9a1"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="5e220926d09236d98f04fe0721e5f9a1" args="()" -->
-reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db4f7613b1de12d1e79285c15636cf3b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="db4f7613b1de12d1e79285c15636cf3b" args="(const_reference x) const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="290119a4eb43cd6a9e98fa17016ba3c2"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="290119a4eb43cd6a9e98fa17016ba3c2" args="()" -->
-reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cdeea67af6c1fcd8f1d5e9c4cab61e8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::allocate" ref="4cdeea67af6c1fcd8f1d5e9c4cab61e8" args="(size_type n, const void *hint=0)" -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a> (size_type n, const void *hint=0)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f9c103e18d5f212703805354074ad44"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="9f9c103e18d5f212703805354074ad44" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#9f9c103e18d5f212703805354074ad44">rbegin</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects, starting on a cache/sector line. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d4eadf188f7d85d3805ae534e0b8e1c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::deallocate" ref="3d4eadf188f7d85d3805ae534e0b8e1c" args="(pointer p, size_type)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a> (pointer p, size_type)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d438b9b32ea3a8ffb703015b6dce055b"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="d438b9b32ea3a8ffb703015b6dce055b" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Free block of memory that starts on a cache line. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb23b687b4c0429dab4c7f8017266cf0"></a><!-- doxytag: member="tbb::cache_aligned_allocator::max_size" ref="fb23b687b4c0429dab4c7f8017266cf0" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a> () const throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db78a1d28c9c966050e8a2926d834a33"></a><!-- doxytag: member="tbb::concurrent_vector::crbegin" ref="db78a1d28c9c966050e8a2926d834a33" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff9cece89438587997ebedf93c5e962"></a><!-- doxytag: member="tbb::concurrent_vector::crend" ref="fff9cece89438587997ebedf93c5e962" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#fff9cece89438587997ebedf93c5e962">crend</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15181759c0bfa2ddce5d10c7550e0002"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="15181759c0bfa2ddce5d10c7550e0002" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#15181759c0bfa2ddce5d10c7550e0002">front</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="502615a858eb9fa0390ee59169065e90"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="502615a858eb9fa0390ee59169065e90" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#502615a858eb9fa0390ee59169065e90">front</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item const <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41ce48d6015a1a2812d41cf620ec3476"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="41ce48d6015a1a2812d41cf620ec3476" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#41ce48d6015a1a2812d41cf620ec3476">back</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd518e204107d07fd08d0ec5bdfd383d"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="bd518e204107d07fd08d0ec5bdfd383d" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#bd518e204107d07fd08d0ec5bdfd383d">back</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item const <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fdba8e90de6a4d2300222236d46758e"></a><!-- doxytag: member="tbb::concurrent_vector::get_allocator" ref="2fdba8e90de6a4d2300222236d46758e" args="() const " -->
-allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="423e5aa15e0e3309ad86d026fd85f6f6"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="423e5aa15e0e3309ad86d026fd85f6f6" args="(size_type n, const_reference t)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a> (size_type n, const_reference t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">assign n items by copying t item <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="93a06b3112cb804f42f40efb5e7387b4"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="93a06b3112cb804f42f40efb5e7387b4" args="(I first, I last)" -->
-template<class I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00276.html#93a06b3112cb804f42f40efb5e7387b4">assign</a> (I first, I last)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">assign range [first, last) <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c9c4bd968ed3edb8dd276854d2dae0"></a><!-- doxytag: member="tbb::concurrent_vector::swap" ref="96c9c4bd968ed3edb8dd276854d2dae0" args="(concurrent_vector &vector)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00276.html">concurrent_vector</a> &vector)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#26f937a359a66b6aae904c3cd9a3c444">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear container while keeping memory allocated. <a href="#26f937a359a66b6aae904c3cd9a3c444"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="da2444b28bb840d38f60d0030333a5fc"></a><!-- doxytag: member="tbb::concurrent_vector::~concurrent_vector" ref="da2444b28bb840d38f60d0030333a5fc" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear and destroy vector. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bb5ae659871478f1f5c68039e1273e12"></a><!-- doxytag: member="tbb::concurrent_vector::internal_vector_base" ref="bb5ae659871478f1f5c68039e1273e12" args="() const " -->
-const internal::concurrent_vector_base_v3 & </td><td class="memItemRight" valign="bottom"><b>internal_vector_base</b> () const </td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30086a58bff79a91103723be20916b96"></a><!-- doxytag: member="tbb::concurrent_vector::internal::vector_iterator" ref="30086a58bff79a91103723be20916b96" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::vector_iterator</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="273d07524d386efc1366bf37af5f91f4"></a><!-- doxytag: member="tbb::cache_aligned_allocator::construct" ref="273d07524d386efc1366bf37af5f91f4" args="(U *p, Args &&...args)" -->
+template<typename U, typename... Args> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00276.html#273d07524d386efc1366bf37af5f91f4">construct</a> (U *p, Args &&...args)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>internal_loop_guide</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception-aware helper class for filling a segment by exception-danger operators of user class. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, class A><br>
- class tbb::concurrent_vector< T, A ></h3>
-
-Concurrent vector container.
-<p>
-<a class="el" href="a00276.html">concurrent_vector</a> is a container having the following main properties:<ul>
-<li>It provides random indexed access to its elements. The index of the first element is 0.</li><li>It ensures safe concurrent growing its size (different threads can safely append new elements).</li><li>Adding new elements does not invalidate existing iterators and does not change indices of existing items.</li></ul>
-<p>
-<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements and Reversible Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1). But it doesn't meet Sequence Requirements due to absence of insert() and erase() methods.</dd></dl>
-<dl compact><dt><b>Exception Safety</b></dt><dd>Methods working with memory allocation and/or new elements construction can throw an exception if allocator fails to allocate memory or element's default constructor throws one. Concurrent vector's element of type T must conform to the following requirements:<ul>
-<li>Throwing an exception is forbidden for destructor of T.</li><li>Default constructor of T must not throw an exception OR its non-virtual destructor must safely work when its object memory is zero-initialized.</li></ul>
-Otherwise, the program's behavior is undefined. </dd></dl>
-<dl compact><dt><b></b></dt><dd>If an exception happens inside growth or assignment operation, an instance of the vector becomes invalid unless it is stated otherwise in the method documentation. Invalid state means:<ul>
-<li>There are no guarantees that all items were initialized by a constructor. The rest of items is zero-filled, including item where exception happens.</li><li>An invalid vector instance cannot be repaired; it is unable to grow anymore.</li><li>Size and capacity reported by the vector are incorrect, and calculated as if the failed operation were successful.</li><li>Attempt to access not allocated elements using operator[] or iterators results in access violation or segmentation fault exc [...]
-If a concurrent grow operation successfully completes, all the elements it has added to the vector will remain valid and accessible even if one of subsequent grow operations fails.</dd></dl>
-<dl compact><dt><b>Fragmentation</b></dt><dd>Unlike an STL vector, a <a class="el" href="a00276.html">concurrent_vector</a> does not move existing elements if it needs to allocate more memory. The container is divided into a series of contiguous arrays of elements. The first reservation, growth, or assignment operation determines the size of the first array. Using small number of elements as initial size incurs fragmentation that may increase element access time. Internal layout can be o [...]
-<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
-<li>Fixed guarantees of <a class="el" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00276.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00276.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a> to get the end [...]
-</dd></dl>
-<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
-<li>Implemented exception-safety guarantees</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Faster index calculation</li><li>First growth call specifies a number of segments to be merged in the first allocation.</li><li>Fixed memory blow up for swarm of vector's instances of small size</li><li>Added <a class="el" href="a00276.html#38274ab3f772ecba600c7daca7690102">grow_by(size_type n, const_reference t)</a> growth using copying const [...]
-</dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="26f937a359a66b6aae904c3cd9a3c444"></a><!-- doxytag: member="tbb::concurrent_vector::clear" ref="26f937a359a66b6aae904c3cd9a3c444" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::clear </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Clear container while keeping memory allocated.
-<p>
-To free up the memory, use in conjunction with method <a class="el" href="a00276.html#1693d1da41b1a8235871be9c6633be35">compact()</a>. Not thread safe
-</div>
-</div><p>
-<a class="anchor" name="473a59a4c9308b93411b898b3110d26c"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="473a59a4c9308b93411b898b3110d26c" args="(size_type delta, const_reference t)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">iterator <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>delta</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const_reference </td>
- <td class="paramname"> <em>t</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns iterator pointing to the first new element.
-</div>
-</div><p>
-<a class="anchor" name="38274ab3f772ecba600c7daca7690102"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="38274ab3f772ecba600c7daca7690102" args="(size_type delta, const_reference t)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">size_type <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>delta</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const_reference </td>
- <td class="paramname"> <em>t</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Grow by "delta" elements using copying constructor.
-<p>
-Returns old size.
-</div>
-</div><p>
-<a class="anchor" name="c8177b1865270ea68aa1ab9148e5e35e"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="c8177b1865270ea68aa1ab9148e5e35e" args="(size_type delta)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">iterator <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>delta</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns iterator pointing to the first new element.
-</div>
-</div><p>
-<a class="anchor" name="30484e3959892fd5392fa93c873c31f0"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="30484e3959892fd5392fa93c873c31f0" args="(size_type delta)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">size_type <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>delta</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Grow by "delta" elements.
-<p>
-Returns old size.
-</div>
-</div><p>
-<a class="anchor" name="a7e3b67c8ccab16d0aecc80899ae799d"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="a7e3b67c8ccab16d0aecc80899ae799d" args="(size_type n)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">iterator <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>n</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads. Returns iterator that points to beginning of appended sequence. If no elements were appended, returns iterator pointing to nth element.
-</div>
-</div><p>
-<a class="anchor" name="47fe588214dd5fa06ab6e8ab78d83874"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="47fe588214dd5fa06ab6e8ab78d83874" args="(size_type n)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>n</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Append minimal sequence of elements such that <a class="el" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n.
-<p>
-The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads.
-</div>
-</div><p>
-<a class="anchor" name="4c52f2950bb1832886bd4458eb09d7eb"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="4c52f2950bb1832886bd4458eb09d7eb" args="(size_type index)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">reference <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::operator[] </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>index</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Get reference to element at given index.
-<p>
-This method is thread-safe for concurrent reads, and also while growing the vector, as long as the calling thread has checked that index<<a class="el" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>.
-</div>
-</div><p>
-<a class="anchor" name="e94e038f915c0268fdf2d3d7f87d81b8"></a><!-- doxytag: member="tbb::concurrent_vector::push_back" ref="e94e038f915c0268fdf2d3d7f87d81b8" args="(const_reference item) iterator push_back(const _reference item)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">size_type <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::push_back </td>
- <td>(</td>
- <td class="paramtype">const_reference </td>
- <td class="paramname"> <em>item</em> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Push item.
-<p>
-Returns iterator pointing to the new element.
-</div>
-</div><p>
-<a class="anchor" name="5a0ce05026994b010018f72cfdeb72c1"></a><!-- doxytag: member="tbb::concurrent_vector::reserve" ref="5a0ce05026994b010018f72cfdeb72c1" args="(size_type n)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00276.html">tbb::concurrent_vector</a>< T, A >::reserve </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>n</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::cache_aligned_allocator< T ></h3>
+Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<p>
-Allocate enough space to grow to size n without having to allocate more memory later.
+The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
-Like most of the methods provided for STL compatibility, this method is *not* thread safe. The capacity afterwards may be bigger than the requested reservation.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00487.html">concurrent_vector.h</a></ul>
+<li>cache_aligned_allocator.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00277.html b/doc/html/a00277.html
index 49751ec..e1ac4e8 100644
--- a/doc/html/a00277.html
+++ b/doc/html/a00277.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::continue_msg Class Reference</title>
+<title>tbb::cache_aligned_allocator< void > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,23 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00277.html">continue_msg</a></div>
-<h1>tbb::flow::interface6::continue_msg Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::continue_msg" -->An empty class used for messages that mean "I'm done".
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00277.html">cache_aligned_allocator< void ></a></div>
+<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
+<small>
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::cache_aligned_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <cache_aligned_allocator.h></code>
<p>
-<table border="0" cellpadding="0" cellspacing="0">
+<a href="a00015.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce89776145998f0685a767b4f195272d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::pointer" ref="ce89776145998f0685a767b4f195272d" args="" -->
+typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4431fbbe1a8cfeb19c48ad0072078f45"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::const_pointer" ref="4431fbbe1a8cfeb19c48ad0072078f45" args="" -->
+typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ab296f4ecdd75f8e193ff92004a697d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::value_type" ref="2ab296f4ecdd75f8e193ff92004a697d" args="" -->
+typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-An empty class used for messages that mean "I'm done".
+<h3>template<><br>
+ class tbb::cache_aligned_allocator< void ></h3>
+
+Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>cache_aligned_allocator.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00278.html b/doc/html/a00278.html
index a9d32b0..3632677 100644
--- a/doc/html/a00278.html
+++ b/doc/html/a00278.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::continue_node< Output > Class Template Reference</title>
+<title>tbb::captured_exception Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,71 +21,134 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00278.html">continue_node</a></div>
-<h1>tbb::flow::interface6::continue_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::continue_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->Implements an executable node that supports <a class="el" href="a00277.html">continue_msg</a> -> Output.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00278.html">captured_exception</a></div>
+<h1>tbb::captured_exception Class Reference</h1><!-- doxytag: class="tbb::captured_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->This class is used by TBB to propagate information about unhandled exceptions into the root thread.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <tbb_exception.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::continue_node< Output >:
-<p><center><img src="a00278.png" usemap="#tbb::flow::interface6::continue_node< Output >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::continue_node< Output >_map">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,271,24">
+<p>Inheritance diagram for tbb::captured_exception:
+<p><center><img src="a00278.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
+<map name="tbb::captured_exception_map">
+<area href="a00358.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
</map>
-<a href="a00068.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00162.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7a06613c9cda6f13a6010e7f2f8d0c23"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::input_type" ref="7a06613c9cda6f13a6010e7f2f8d0c23" args="" -->
-typedef <a class="el" href="a00277.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b50d9716bcdd281df574ec758a3952f9"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="b50d9716bcdd281df574ec758a3952f9" args="(const captured_exception &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const <a class="el" href="a00278.html">captured_exception</a> &src)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01b4d78a352cfb7d62b5ce2d1baa24f3"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::output_type" ref="01b4d78a352cfb7d62b5ce2d1baa24f3" args="" -->
-typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="179076f146699724f652a9b1e81bd791"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="179076f146699724f652a9b1e81bd791" args="(const char *name_, const char *info)" -->
+ </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const char *name_, const char *info)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9ae7fda69d7d69c55cf8b57ae7b4b613"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::predecessor_type" ref="9ae7fda69d7d69c55cf8b57ae7b4b613" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< <a class="el" href="a00277.html">input_type</a> > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e95b8eb99ec9dea22934ac528a08654c"></a><!-- doxytag: member="tbb::captured_exception::operator=" ref="e95b8eb99ec9dea22934ac528a08654c" args="(const captured_exception &src)" -->
+<a class="el" href="a00278.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00278.html">captured_exception</a> &src)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5a647a2b302232fe9a8f44940987f21"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::successor_type" ref="d5a647a2b302232fe9a8f44940987f21" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00278.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#837a50b8f6a800bda225c39d1699643f">move</a> () throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="868190ed9818d1d23eb65c87689657d5"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::fOutput_type" ref="868190ed9818d1d23eb65c87689657d5" args="" -->
-typedef internal::function_output<<br>
- output_type > </td><td class="memItemRight" valign="bottom"><b>fOutput_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object. <a href="#837a50b8f6a800bda225c39d1699643f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#93d875d3555502ff6f18513525de204c">destroy</a> () throw ()</td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="2f200db877d2f80c08d09422e8bffd5a"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::continue_node" ref="2f200db877d2f80c08d09422e8bffd5a" args="(graph &g, Body body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00278.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a> (<a class="el" href="a00288.html">graph</a> &g, Body body)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00278.html#837a50b8f6a800bda225c39d1699643f">move()</a> method. <a href="#93d875d3555502ff6f18513525de204c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for executable node with <a class="el" href="a00277.html">continue_msg</a> -> Output. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7817aebf22dd125ca04df53ac488d163"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::continue_node" ref="7817aebf22dd125ca04df53ac488d163" args="(graph &g, int number_of_predecessors, Body body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00278.html#7817aebf22dd125ca04df53ac488d163">continue_node</a> (<a class="el" href="a00288.html">graph</a> &g, int number_of_predecessors, Body body)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object. <a href="#2dd1be66ab32fa27e0ddef5707fa67ef"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5af82fd677449c5ca727fa1d7e16f9f5"></a><!-- doxytag: member="tbb::captured_exception::name" ref="5af82fd677449c5ca727fa1d7e16f9f5" args="() const " -->
+const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a> () const throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for executable node with <a class="el" href="a00277.html">continue_msg</a> -> Output. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="869562787fcb5c57a90aea120f26d492"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::continue_node" ref="869562787fcb5c57a90aea120f26d492" args="(const continue_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#869562787fcb5c57a90aea120f26d492">continue_node</a> (const <a class="el" href="a00278.html">continue_node</a> &src)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b5988ef74a1fe2a58998d110b3633e0"></a><!-- doxytag: member="tbb::captured_exception::what" ref="6b5988ef74a1fe2a58998d110b3633e0" args="() const " -->
+const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#6b5988ef74a1fe2a58998d110b3633e0">what</a> () const throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67bc2d65e63f434d34c6c74ce5654b3f"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::try_put" ref="67bc2d65e63f434d34c6c74ce5654b3f" args="(const input_type &i)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>try_put</b> (const <a class="el" href="a00277.html">input_type</a> &i)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00278.html#6b5988ef74a1fe2a58998d110b3633e0">what()</a> method. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="92ed4100413eef26969f8299f6845e18"></a><!-- doxytag: member="tbb::captured_exception::set" ref="92ed4100413eef26969f8299f6845e18" args="(const char *name, const char *info)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set</b> (const char *name, const char *info) throw ()</td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23d3b09e13e2dbc32a6308a821e8ba29"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::successors" ref="23d3b09e13e2dbc32a6308a821e8ba29" args="()" -->
-internal::broadcast_cache<<br>
- output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5f56d05102acdba6c2f09ba6db3baeb"></a><!-- doxytag: member="tbb::captured_exception::clear" ref="d5f56d05102acdba6c2f09ba6db3baeb" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>clear</b> () throw ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Output><br>
- class tbb::flow::interface6::continue_node< Output ></h3>
+This class is used by TBB to propagate information about unhandled exceptions into the root thread.
+<p>
+Exception of this type is thrown by TBB in the root thread (thread that started a parallel algorithm ) if an unhandled exception was intercepted during the algorithm execution in one of the workers. <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00358.html">tbb::tbb_exception</a> </dd></dl>
+
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="93d875d3555502ff6f18513525de204c"></a><!-- doxytag: member="tbb::captured_exception::destroy" ref="93d875d3555502ff6f18513525de204c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void __TBB_EXPORTED_METHOD tbb::captured_exception::destroy </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> throw ()<code> [virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-Implements an executable node that supports <a class="el" href="a00277.html">continue_msg</a> -> Output.
<p>
+Destroys objects created by the <a class="el" href="a00278.html#837a50b8f6a800bda225c39d1699643f">move()</a> method.
+<p>
+Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
+<p>
+Implements <a class="el" href="a00358.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="837a50b8f6a800bda225c39d1699643f"></a><!-- doxytag: member="tbb::captured_exception::move" ref="837a50b8f6a800bda225c39d1699643f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00278.html">captured_exception</a>* __TBB_EXPORTED_METHOD tbb::captured_exception::move </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> throw ()<code> [virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Creates and returns pointer to the deep copy of this exception object.
+<p>
+Move semantics is allowed.
+<p>
+Implements <a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="2dd1be66ab32fa27e0ddef5707fa67ef"></a><!-- doxytag: member="tbb::captured_exception::throw_self" ref="2dd1be66ab32fa27e0ddef5707fa67ef" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::captured_exception::throw_self </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Throws this exception object.
+<p>
+Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
+<p>
+Implements <a class="el" href="a00358.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>tbb_exception.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00278.png b/doc/html/a00278.png
index 97eb6db..2470bea 100644
Binary files a/doc/html/a00278.png and b/doc/html/a00278.png differ
diff --git a/doc/html/a00279.html b/doc/html/a00279.html
index ca025d5..dd3942d 100644
--- a/doc/html/a00279.html
+++ b/doc/html/a00279.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::continue_receiver Class Reference</title>
+<title>tbb::combinable< T > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,145 +21,61 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00279.html">continue_receiver</a></div>
-<h1>tbb::flow::interface6::continue_receiver Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::continue_receiver" --><!-- doxytag: inherits="tbb::flow::interface6::receiver" -->Base class for receivers of completion messages.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00279.html">combinable</a></div>
+<h1>tbb::combinable< T > Class Template Reference<br>
+<small>
+[<a class="el" href="a00442.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::combinable" -->Thread-local storage with optional reduction.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <combinable.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::continue_receiver:
-<p><center><img src="a00279.png" usemap="#tbb::flow::interface6::continue_receiver_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::continue_receiver_map">
-<area href="a00321.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="0,0,230,24">
-</map>
-<a href="a00055.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00017.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c43c166af832d9187035985841e0a7f"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::input_type" ref="3c43c166af832d9187035985841e0a7f" args="" -->
-typedef <a class="el" href="a00277.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#3c43c166af832d9187035985841e0a7f">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9c58b3e9c46afd2518d0fd8957a5a2f"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::predecessor_type" ref="f9c58b3e9c46afd2518d0fd8957a5a2f" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< <a class="el" href="a00277.html">continue_msg</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#f9c58b3e9c46afd2518d0fd8957a5a2f">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="177db82d548a1f8471371331890b91a8"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::continue_receiver" ref="177db82d548a1f8471371331890b91a8" args="(int number_of_predecessors=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#177db82d548a1f8471371331890b91a8">continue_receiver</a> (int number_of_predecessors=0)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0b292ed7fa6556b2a735f6d1e82dc74"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::continue_receiver" ref="a0b292ed7fa6556b2a735f6d1e82dc74" args="(const continue_receiver &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#a0b292ed7fa6556b2a735f6d1e82dc74">continue_receiver</a> (const <a class="el" href="a00279.html">continue_receiver</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e14828fa079b9835ff7267df5ee45d7"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::~continue_receiver" ref="1e14828fa079b9835ff7267df5ee45d7" args="()" -->
-virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a> ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d03619e90e62555aa5634fcc8adadcc9"></a><!-- doxytag: member="tbb::combinable::combinable" ref="d03619e90e62555aa5634fcc8adadcc9" args="(finit _finit)" -->
+template<typename finit> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>combinable</b> (finit _finit)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fcfa4990a42417bbeb1f3c8b9ac8a22"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::register_predecessor" ref="2fcfa4990a42417bbeb1f3c8b9ac8a22" args="(predecessor_type &)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a> (<a class="el" href="a00327.html">predecessor_type</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c87e79ae98588a5780f708773388843"></a><!-- doxytag: member="tbb::combinable::~combinable" ref="2c87e79ae98588a5780f708773388843" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#2c87e79ae98588a5780f708773388843">~combinable</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Increments the trigger threshold. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a> (<a class="el" href="a00327.html">predecessor_type</a> &)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">destructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57012803b7bc7416452cb930121ff210"></a><!-- doxytag: member="tbb::combinable::combinable" ref="57012803b7bc7416452cb930121ff210" args="(const combinable &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>combinable</b> (const <a class="el" href="a00279.html">combinable</a> &other)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Decrements the trigger threshold. <a href="#cb691b18416d4742265aed84d496ebbd"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#3969c70fb89c0a982f142ae9eb5facae">try_put</a> (const <a class="el" href="a00277.html">input_type</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c9650d59f65b1042afa232ede57dfca9"></a><!-- doxytag: member="tbb::combinable::operator=" ref="c9650d59f65b1042afa232ede57dfca9" args="(const combinable &other)" -->
+<a class="el" href="a00279.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00279.html">combinable</a> &other)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Puts a <a class="el" href="a00277.html">continue_msg</a> to the receiver. <a href="#3969c70fb89c0a982f142ae9eb5facae"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a> ()=0</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09233cccb9b5e8a58874e43a703cac2"></a><!-- doxytag: member="tbb::combinable::clear" ref="f09233cccb9b5e8a58874e43a703cac2" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Does whatever should happen when the threshold is reached. <a href="#40ca8b7e96c5bc3428b4d1e409725ee5"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5cddbd33109e94a68fb5457682a62110"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_mutex" ref="5cddbd33109e94a68fb5457682a62110" args="" -->
-<a class="el" href="a00331.html">spin_mutex</a> </td><td class="memItemRight" valign="bottom"><b>my_mutex</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d7550204bcb88fa8810b5a39e9cad24"></a><!-- doxytag: member="tbb::combinable::local" ref="2d7550204bcb88fa8810b5a39e9cad24" args="()" -->
+T & </td><td class="memItemRight" valign="bottom"><b>local</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="66df49f67e70e7f8e9831d0e362ba84c"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_predecessor_count" ref="66df49f67e70e7f8e9831d0e362ba84c" args="" -->
-int </td><td class="memItemRight" valign="bottom"><b>my_predecessor_count</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93a42052881ecccdd8ddff16a1b1cca1"></a><!-- doxytag: member="tbb::combinable::local" ref="93a42052881ecccdd8ddff16a1b1cca1" args="(bool &exists)" -->
+T & </td><td class="memItemRight" valign="bottom"><b>local</b> (bool &exists)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05fd1ce3c3fd7be3e74817b31fd2f068"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_current_count" ref="05fd1ce3c3fd7be3e74817b31fd2f068" args="" -->
-int </td><td class="memItemRight" valign="bottom"><b>my_current_count</b></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9be306b4a073066dcac4043dc189c514"></a><!-- doxytag: member="tbb::combinable::combine" ref="9be306b4a073066dcac4043dc189c514" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a0d4c3084fd13902c2d38f31c1dc232"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_initial_predecessor_count" ref="8a0d4c3084fd13902c2d38f31c1dc232" args="" -->
-int </td><td class="memItemRight" valign="bottom"><b>my_initial_predecessor_count</b></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="dcd23283834149c87c345c0e476dfee8"></a><!-- doxytag: member="tbb::combinable::combine_each" ref="dcd23283834149c87c345c0e476dfee8" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Base class for receivers of completion messages.
-<p>
-These receivers automatically reset, but cannot be explicitly waited on
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="40ca8b7e96c5bc3428b4d1e409725ee5"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::execute" ref="40ca8b7e96c5bc3428b4d1e409725ee5" args="()=0" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual void tbb::flow::interface6::continue_receiver::execute </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [protected, pure virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::combinable< T ></h3>
+Thread-local storage with optional reduction.
<p>
-Does whatever should happen when the threshold is reached.
-<p>
-This should be very fast or else spawn a task. This is called while the sender is blocked in the <a class="el" href="a00279.html#3969c70fb89c0a982f142ae9eb5facae">try_put()</a>.
-</div>
-</div><p>
-<a class="anchor" name="cb691b18416d4742265aed84d496ebbd"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::remove_predecessor" ref="cb691b18416d4742265aed84d496ebbd" args="(predecessor_type &)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::flow::interface6::continue_receiver::remove_predecessor </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00327.html">predecessor_type</a> & </td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Decrements the trigger threshold.
-<p>
-Does not check to see if the removal of the predecessor now makes the current count exceed the new threshold. So removing a predecessor while the graph is active can cause unexpected results.
-</div>
-</div><p>
-<a class="anchor" name="3969c70fb89c0a982f142ae9eb5facae"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::try_put" ref="3969c70fb89c0a982f142ae9eb5facae" args="(const input_type &)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::flow::interface6::continue_receiver::try_put </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="a00277.html">input_type</a> & </td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Puts a <a class="el" href="a00277.html">continue_msg</a> to the receiver.
-<p>
-If the message causes the message count to reach the predecessor count, <a class="el" href="a00279.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute()</a> is called and the message count is reset to 0. Otherwise the message count is incremented.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>combinable.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00280.html b/doc/html/a00280.html
index 5307e5a..7f774cc 100644
--- a/doc/html/a00280.html
+++ b/doc/html/a00280.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::empty_task Class Reference</title>
+<title>tbb::concurrent_bounded_queue< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,31 +21,287 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00280.html">empty_task</a></div>
-<h1>tbb::empty_task Class Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00280.html">concurrent_bounded_queue</a></div>
+<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
<small>
-[<a class="el" href="a00431.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::empty_task" --><!-- doxytag: inherits="tbb::task" -->task that does nothing. Useful for synchronization.
+[<a class="el" href="a00442.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00613.html">task.h</a>></code>
+<code>#include <concurrent_queue.h></code>
<p>
-<p>Inheritance diagram for tbb::empty_task:
-<p><center><img src="a00280.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
-<map name="tbb::empty_task_map">
-<area href="a00337.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
+<p>Inheritance diagram for tbb::concurrent_bounded_queue< T, A >:
+<p><center><img src="a00280.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::concurrent_bounded_queue< T, A >_map">
+<area href="a00287.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
</map>
-<a href="a00134.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00036.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245517a931e5893f6601e66c51fc75"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::value_type" ref="98245517a931e5893f6601e66c51fc75" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#98245517a931e5893f6601e66c51fc75">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e2726fccf6d975dc1071608cc0bbf90"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::allocator_type" ref="2e2726fccf6d975dc1071608cc0bbf90" args="" -->
+typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dcd44ca6a88c0dc7a847a47a10811f0c"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::reference" ref="dcd44ca6a88c0dc7a847a47a10811f0c" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="796713d0b9ba93a4721cbe13e4474068"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_reference" ref="796713d0b9ba93a4721cbe13e4474068" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <a href="#a80e4c11dbb324e4b92a24a77bbcde68"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b45c91297e69515d83d5eef85ae1f49"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::difference_type" ref="4b45c91297e69515d83d5eef85ae1f49" args="" -->
+typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aeea2ad38b7e7fc2866f063dfed24c52"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::iterator" ref="aeea2ad38b7e7fc2866f063dfed24c52" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00280.html">concurrent_bounded_queue</a>,<br>
+ T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0edd1a90e6ffa503bac1c4027116dbff"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_iterator" ref="0edd1a90e6ffa503bac1c4027116dbff" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00280.html">concurrent_bounded_queue</a>,<br>
+ const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3525226732963ff0f13e89d8e6dab5b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="e3525226732963ff0f13e89d8e6dab5b" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b7fb414d2eaa8a7f5d68fc4cd63ac50"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="7b7fb414d2eaa8a7f5d68fc4cd63ac50" args="(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00280.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a5e04dcd7db9fd9b583b4e7df832246a"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="a5e04dcd7db9fd9b583b4e7df832246a" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00280.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acaf5b510dc0dfc7780b8c956cf773cf"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::~concurrent_bounded_queue" ref="acaf5b510dc0dfc7780b8c956cf773cf" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceb08c743b11ba88c878e73fff8af20b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::push" ref="ceb08c743b11ba88c878e73fff8af20b" args="(const T &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#ceb08c743b11ba88c878e73fff8af20b">push</a> (const T &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a> (T &destination)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dequeue item from head of queue. <a href="#41f4c6bd7a82ab070e840bbf81b0b123"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86c77a6c1317239405968f5afc7b10d3"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::abort" ref="86c77a6c1317239405968f5afc7b10d3" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#86c77a6c1317239405968f5afc7b10d3">abort</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Abort all pending queue operations. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#2bd6232531279fb3ccbd296bea23066b">try_push</a> (const T &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full. <a href="#2bd6232531279fb3ccbd296bea23066b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a> (T &destination)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#0ca487019bbb00a196442aff78a1e4f7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#7dc14d1a579a4cccda9f857585e1768d">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return number of pushes minus number of pops. <a href="#7dc14d1a579a4cccda9f857585e1768d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f64924f2ee9225c368a270fc3c394db9"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::empty" ref="f64924f2ee9225c368a270fc3c394db9" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00280.html#7dc14d1a579a4cccda9f857585e1768d">size()</a><=0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2888b3e4e837d7e03f2c731963a402b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::capacity" ref="b2888b3e4e837d7e03f2c731963a402b" args="() const " -->
+<a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum number of allowed elements. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a> (<a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the capacity. <a href="#f3c6c934f85fd02aedbc83a16943193b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="415eb87e53b1c6a266de06ecbc490d16"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::get_allocator" ref="415eb87e53b1c6a266de06ecbc490d16" args="() const " -->
+<a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90b31e2954c6e4596c7900435a5f4bc1"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::clear" ref="90b31e2954c6e4596c7900435a5f4bc1" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">clear the queue. not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a2637188e104503ac2c0dff633014e8"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="5a2637188e104503ac2c0dff633014e8" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7267334ef11087c76c810abb9d5cbc2"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="c7267334ef11087c76c810abb9d5cbc2" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8be757841d0bbf7744508aaf6a141d08"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="8be757841d0bbf7744508aaf6a141d08" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3aac91d288bf227d9d06717b44ef28f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="3aac91d288bf227d9d06717b44ef28f7" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>destroyer</b></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class used to ensure exception-safety of method "pop". <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-task that does nothing. Useful for synchronization.
+<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
+ class tbb::concurrent_bounded_queue< T, A ></h3>
+
+A high-performance thread-safe blocking concurrent bounded queue.
<p>
+This is the pre-PPL TBB concurrent queue which supports boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
+<p>
+<hr><h2>Member Typedef Documentation</h2>
+<a class="anchor" name="a80e4c11dbb324e4b92a24a77bbcde68"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size_type" ref="a80e4c11dbb324e4b92a24a77bbcde68" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef std::ptrdiff_t <a class="el" href="a00280.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Integral type for representing size of the queue.
+<p>
+Note that the size_type is a signed integral type. This is because the size can be negative if there are pending pops without corresponding pushes.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="41f4c6bd7a82ab070e840bbf81b0b123"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::pop" ref="41f4c6bd7a82ab070e840bbf81b0b123" args="(T &destination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00280.html">tbb::concurrent_bounded_queue</a>< T, A >::pop </td>
+ <td>(</td>
+ <td class="paramtype">T & </td>
+ <td class="paramname"> <em>destination</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Dequeue item from head of queue.
+<p>
+Block until an item becomes available, and then dequeue it.
+</div>
+</div><p>
+<a class="anchor" name="f3c6c934f85fd02aedbc83a16943193b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::set_capacity" ref="f3c6c934f85fd02aedbc83a16943193b" args="(size_type new_capacity)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00280.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
+ <td class="paramname"> <em>new_capacity</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Set the capacity.
+<p>
+Setting the capacity to 0 causes subsequent try_push operations to always fail, and subsequent push operations to block forever.
+</div>
+</div><p>
+<a class="anchor" name="7dc14d1a579a4cccda9f857585e1768d"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size" ref="7dc14d1a579a4cccda9f857585e1768d" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00280.html">tbb::concurrent_bounded_queue</a>< T, A >::size </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Return number of pushes minus number of pops.
+<p>
+Note that the result can be negative if there are pops waiting for the corresponding pushes. The result can also exceed <a class="el" href="a00280.html#b2888b3e4e837d7e03f2c731963a402b">capacity()</a> if there are push operations in flight.
+</div>
+</div><p>
+<a class="anchor" name="0ca487019bbb00a196442aff78a1e4f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_pop" ref="0ca487019bbb00a196442aff78a1e4f7" args="(T &destination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00280.html">tbb::concurrent_bounded_queue</a>< T, A >::try_pop </td>
+ <td>(</td>
+ <td class="paramtype">T & </td>
+ <td class="paramname"> <em>destination</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Attempt to dequeue an item from head of queue.
+<p>
+Does not wait for item to become available. Returns true if successful; false otherwise.
+</div>
+</div><p>
+<a class="anchor" name="2bd6232531279fb3ccbd296bea23066b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_push" ref="2bd6232531279fb3ccbd296bea23066b" args="(const T &source)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00280.html">tbb::concurrent_bounded_queue</a>< T, A >::try_push </td>
+ <td>(</td>
+ <td class="paramtype">const T & </td>
+ <td class="paramname"> <em>source</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enqueue an item at tail of queue if queue is not already full.
+<p>
+Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00613.html">task.h</a></ul>
+<li>concurrent_queue.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00280.png b/doc/html/a00280.png
index 2fa6419..e9d90a2 100644
Binary files a/doc/html/a00280.png and b/doc/html/a00280.png differ
diff --git a/doc/html/a00281.html b/doc/html/a00281.html
index e78e8f9..b3234e6 100644
--- a/doc/html/a00281.html
+++ b/doc/html/a00281.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference</title>
+<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,174 +21,623 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00281.html">enumerable_thread_specific</a></div>
-<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00281.html">concurrent_hash_map</a></div>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference<br>
<small>
-[<a class="el" href="a00427.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::interface6::enumerable_thread_specific" -->The <a class="el" href="a00281.html">enumerable_thread_specific</a> container.
+[<a class="el" href="a00442.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map" -->Unordered map from Key to T.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00499.html">enumerable_thread_specific.h</a>></code>
+<code>#include <concurrent_hash_map.h></code>
<p>
-<a href="a00049.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00019.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c03eb40955b933b01987222722ac4bd"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::allocator_type" ref="3c03eb40955b933b01987222722ac4bd" args="" -->
-typedef Allocator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e664e41a5b735a677f2ebbbcca0fcd80"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::key_type" ref="e664e41a5b735a677f2ebbbcca0fcd80" args="" -->
+typedef Key </td><td class="memItemRight" valign="bottom"><b>key_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Basic types. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e93f3b75e82eaa845cc1a0514eaba31a"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::value_type" ref="e93f3b75e82eaa845cc1a0514eaba31a" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="616243d5a0b6159299f2a34413e077e4"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::mapped_type" ref="616243d5a0b6159299f2a34413e077e4" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>mapped_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0fd259a6b20641c768079f41d3213904"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::reference" ref="0fd259a6b20641c768079f41d3213904" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ece048b19778bc31377185392ecf312b"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::value_type" ref="ece048b19778bc31377185392ecf312b" args="" -->
+typedef std::pair< const Key,<br>
+ T > </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c1d47e24439524fea72d9c10df25d54"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_reference" ref="2c1d47e24439524fea72d9c10df25d54" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="549109620a3331c83e46b8fe0636b883"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::size_type" ref="549109620a3331c83e46b8fe0636b883" args="" -->
+typedef hash_map_base::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27cf20b87f4381a69203aed11e5a34dc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::pointer" ref="27cf20b87f4381a69203aed11e5a34dc" args="" -->
-typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0a4ffc8ac85bb2eb80a4e1909a373e2c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::difference_type" ref="0a4ffc8ac85bb2eb80a4e1909a373e2c" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e132e2a40dd6ce5472f8e13a1e80947"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_pointer" ref="0e132e2a40dd6ce5472f8e13a1e80947" args="" -->
-typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="341d2ae1e5e9d8ba05e5306a3933f31a"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::pointer" ref="341d2ae1e5e9d8ba05e5306a3933f31a" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c67c208bec3e8b77190d545bd1f150e3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size_type" ref="c67c208bec3e8b77190d545bd1f150e3" args="" -->
-typedef internal_collection_type::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b401731d22f457617f950416fde9bff"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_pointer" ref="4b401731d22f457617f950416fde9bff" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eda9be9a80bed094d4657948b5b7831f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::difference_type" ref="eda9be9a80bed094d4657948b5b7831f" args="" -->
-typedef internal_collection_type::difference_type </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2765bbab7bac8b74cfd79d269a2008b8"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::reference" ref="2765bbab7bac8b74cfd79d269a2008b8" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd6f8e0af3c5e5166a4223f88b03e0a5"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::iterator" ref="bd6f8e0af3c5e5166a4223f88b03e0a5" args="" -->
-typedef internal::enumerable_thread_specific_iterator<<br>
- <a class="el" href="a00276.html">internal_collection_type</a>,<br>
- value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3b62b1930b2b88c98cb617f67bb9545"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_reference" ref="a3b62b1930b2b88c98cb617f67bb9545" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ff2ff1a117048f5d57aedebb12d57e1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_iterator" ref="8ff2ff1a117048f5d57aedebb12d57e1" args="" -->
-typedef internal::enumerable_thread_specific_iterator<<br>
- <a class="el" href="a00276.html">internal_collection_type</a>,<br>
- const value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83603b64f2507ee6560133d79a001eb2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::iterator" ref="83603b64f2507ee6560133d79a001eb2" args="" -->
+typedef internal::hash_map_iterator<<br>
+ <a class="el" href="a00281.html">concurrent_hash_map</a>, value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d4c23a666adbf88bd3280873de9d7f39"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range_type" ref="d4c23a666adbf88bd3280873de9d7f39" args="" -->
-typedef generic_range_type<<br>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d47cbc7e0b0999b849187040f02557f5"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_iterator" ref="d47cbc7e0b0999b849187040f02557f5" args="" -->
+typedef internal::hash_map_iterator<<br>
+ <a class="el" href="a00281.html">concurrent_hash_map</a>, const <br>
+value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="baeed4327d9c77f084bfb5ac8d519c96"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range_type" ref="baeed4327d9c77f084bfb5ac8d519c96" args="" -->
+typedef internal::hash_map_range<<br>
iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ce41c6603d8f547f11df05d1ccb2184"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_range_type" ref="0ce41c6603d8f547f11df05d1ccb2184" args="" -->
-typedef generic_range_type<<br>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e7700e8872566a5dc6d1c702b7949f4"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_range_type" ref="1e7700e8872566a5dc6d1c702b7949f4" args="" -->
+typedef internal::hash_map_range<<br>
const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf2a3ebce78da6d8be3b1803eb31a2e3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::allocator_type" ref="bf2a3ebce78da6d8be3b1803eb31a2e3" args="" -->
+typedef Allocator </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0cfa3a5c8f2be3bbf313d93b1fa8cdb3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="0cfa3a5c8f2be3bbf313d93b1fa8cdb3" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ad413f5b666176e7669bf4c87d1ff3f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="1ad413f5b666176e7669bf4c87d1ff3f" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a> (const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="46b9896317662c3cfa3c876ad7592a7c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="46b9896317662c3cfa3c876ad7592a7c" args="(size_type n, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a> (size_type n, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table with n preallocated buckets. This number serves also as initial concurrency level. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6fb14710893308fb47aaeee55ee30dc3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="6fb14710893308fb47aaeee55ee30dc3" args="(const concurrent_hash_map &table, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a> (const <a class="el" href="a00281.html">concurrent_hash_map</a> &table, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="83c40f2053f208861b90390e12a36436"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="83c40f2053f208861b90390e12a36436" args="(I first, I last, const allocator_type &a=allocator_type())" -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00281.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="088d1aaccc816884a49e38f7065622c8"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::operator=" ref="088d1aaccc816884a49e38f7065622c8" args="(const concurrent_hash_map &table)" -->
+<a class="el" href="a00281.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#088d1aaccc816884a49e38f7065622c8">operator=</a> (const <a class="el" href="a00281.html">concurrent_hash_map</a> &table)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#94758113d8993cfe5afdf2d63a728869">rehash</a> (size_type n=0)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Rehashes and optionally resizes the whole table. <a href="#94758113d8993cfe5afdf2d63a728869"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="220686fe17b197eedf19dd856cd02e36"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::clear" ref="220686fe17b197eedf19dd856cd02e36" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#220686fe17b197eedf19dd856cd02e36">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2aa8e2d28d5af1284cf78d20a9c22731"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::~concurrent_hash_map" ref="2aa8e2d28d5af1284cf78d20a9c22731" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table and destroy it. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ee6b69f390111c92318a85600dd9c559"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range" ref="ee6b69f390111c92318a85600dd9c559" args="(size_type grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d9a834a345415581bd801647945ea96b"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range" ref="d9a834a345415581bd801647945ea96b" args="(size_type grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1) const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35a8c373fc3d52099ae18f0553162491"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::begin" ref="35a8c373fc3d52099ae18f0553162491" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67c50bddda53b9a10318f8981e4fc4fa"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::end" ref="67c50bddda53b9a10318f8981e4fc4fa" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8ad3d9bb833063b3d09164199b8f7de"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::begin" ref="c8ad3d9bb833063b3d09164199b8f7de" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="75e7c0fb6addae180b6cc483b771fded"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::end" ref="75e7c0fb6addae180b6cc483b771fded" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8262e9ef1208a39e7ea087487fbe8368"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::equal_range" ref="8262e9ef1208a39e7ea087487fbe8368" args="(const Key &key)" -->
+std::pair< iterator, iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b94bf1d3724f26299640e8b82787a75c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::equal_range" ref="b94bf1d3724f26299640e8b82787a75c" args="(const Key &key) const " -->
+std::pair< const_iterator,<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key) const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6aa56a8b5a25e61a97fa0b54fe2b5659"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::size" ref="6aa56a8b5a25e61a97fa0b54fe2b5659" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor. Each local instance of T is default constructed. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8d4b456ff9d7b289c73254eccc11db45"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="8d4b456ff9d7b289c73254eccc11db45" args="(Finit finit)" -->
-template<typename Finit> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00281.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a> (Finit finit)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Number of items in table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61ff2e5bb44e5469366fd5295e5d0ebe"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::empty" ref="61ff2e5bb44e5469366fd5295e5d0ebe" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor with initializer functor. Each local instance of T is constructed by T(finit()). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bce6829981c9efe3f59cae2355e383e"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="7bce6829981c9efe3f59cae2355e383e" args="(const T &exemplar)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a> (const T &exemplar)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if <a class="el" href="a00281.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size()</a>==0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bce57fe9b594abe1e6d2568aea8b357"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::max_size" ref="2bce57fe9b594abe1e6d2568aea8b357" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constuctor with exemplar. Each local instance of T is copied-constructed from the exemplar. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7907d9e3e5b18e7a7b55211ef3213f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::~enumerable_thread_specific" ref="5a7907d9e3e5b18e7a7b55211ef3213f" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on size. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af34cb91b1d0f36a885a1a3432dd9af1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_count" ref="af34cb91b1d0f36a885a1a3432dd9af1" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8d5265ccbd5e4485996b3f3baaa5ba1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="c8d5265ccbd5e4485996b3f3baaa5ba1" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of buckets. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6cbcacb4a256a85bf89576c101373ca7"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::get_allocator" ref="6cbcacb4a256a85bf89576c101373ca7" args="() const " -->
+allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">returns reference to local, discarding exists <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7dc79058d2832f7447de8e691c3455ea"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="7dc79058d2832f7447de8e691c3455ea" args="(bool &exists)" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#7dc79058d2832f7447de8e691c3455ea">local</a> (bool &exists)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="076f8d9e16110aac5f558777aa744eb6"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::swap" ref="076f8d9e16110aac5f558777aa744eb6" args="(concurrent_hash_map &table)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#076f8d9e16110aac5f558777aa744eb6">swap</a> (<a class="el" href="a00281.html">concurrent_hash_map</a> &table)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns reference to calling thread's local copy, creating one if necessary. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="33fd6593da1ed14340f10f67d5a69130"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size" ref="33fd6593da1ed14340f10f67d5a69130" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#33fd6593da1ed14340f10f67d5a69130">size</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances. Iterators are invalidated <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6968eb6feed2df36be421df0464297af"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::count" ref="6968eb6feed2df36be421df0464297af" args="(const Key &key) const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#6968eb6feed2df36be421df0464297af">count</a> (const Key &key) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get the number of local copies. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72595886d0ac8fd0543f90038570510d"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::empty" ref="72595886d0ac8fd0543f90038570510d" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#72595886d0ac8fd0543f90038570510d">empty</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return count of items (0 or 1). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#2afcc33dade7bb24e008d60c0df38230">find</a> (<a class="el" href="a00284.html">const_accessor</a> &result, const Key &key) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">true if there have been no local copies created <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01d7baf8e913ab2819e97917a2ac795f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="01d7baf8e913ab2819e97917a2ac795f" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#01d7baf8e913ab2819e97917a2ac795f">begin</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a read lock on the item. <a href="#2afcc33dade7bb24e008d60c0df38230"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a> (<a class="el" href="a00282.html">accessor</a> &result, const Key &key)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">begin iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2456ff88252fc921b01cd8907628a4ee"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="2456ff88252fc921b01cd8907628a4ee" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#2456ff88252fc921b01cd8907628a4ee">end</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a write lock on the item. <a href="#7bc475d1968f7f0af3d736d7e8a0d7df"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#47fe0e60151a9bd7a444db827772a4e6">insert</a> (<a class="el" href="a00284.html">const_accessor</a> &result, const Key &key)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84afb3906a39e399cde1c950d6351300"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="84afb3906a39e399cde1c950d6351300" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#84afb3906a39e399cde1c950d6351300">begin</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a read lock on the item. <a href="#47fe0e60151a9bd7a444db827772a4e6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#54e0955ecd11575b4c07166838a72893">insert</a> (<a class="el" href="a00282.html">accessor</a> &result, const Key &key)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">begin const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cb448bb4977ce366ceb7344085cc7050"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="cb448bb4977ce366ceb7344085cc7050" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#cb448bb4977ce366ceb7344085cc7050">end</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a write lock on the item. <a href="#54e0955ecd11575b4c07166838a72893"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a> (<a class="el" href="a00284.html">const_accessor</a> &result, const value_type &value)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b22c54990b2362cd93c1a8f73de140bc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="b22c54990b2362cd93c1a8f73de140bc" args="(size_t grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#b22c54990b2362cd93c1a8f73de140bc">range</a> (size_t grainsize=1)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a read lock on the item. <a href="#091efd2d12fdad4fe9e54d9629a9dfc3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#39183d78d6e8425917555ab542ab92de">insert</a> (<a class="el" href="a00282.html">accessor</a> &result, const value_type &value)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3b068000cf4dbf9b40f8bb7e3fc53e0b"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="3b068000cf4dbf9b40f8bb7e3fc53e0b" args="(size_t grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a> (size_t grainsize=1) const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a write lock on the item. <a href="#39183d78d6e8425917555ab542ab92de"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#3f121a316af8135de476a30fae6d7c07">insert</a> (const value_type &value)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8764176d4b6014c5d65f1051851abc8"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::clear" ref="a8764176d4b6014c5d65f1051851abc8" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#a8764176d4b6014c5d65f1051851abc8">clear</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already. <a href="#3f121a316af8135de476a30fae6d7c07"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1dd37fad87e561151ba1e242ca94bcc1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="1dd37fad87e561151ba1e242ca94bcc1" args="(I first, I last)" -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00281.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a> (I first, I last)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys local copies. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="43bbf3a313c5431559df2946f76221e0"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="43bbf3a313c5431559df2946f76221e0" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
-template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00281.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert range [first, last). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a> (const Key &key)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="25a9c336cfd5a171c29cbdd0feb84249"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="25a9c336cfd5a171c29cbdd0feb84249" args="(const enumerable_thread_specific &other)" -->
- </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00281.html">enumerable_thread_specific</a> &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item. <a href="#f27802b3a8d1863c29e743e9c6b4e870"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a> (<a class="el" href="a00284.html">const_accessor</a> &item_accessor)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f8f467eb4c44c58614d0f9dce687477"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="1f8f467eb4c44c58614d0f9dce687477" args="(const enumerable_thread_specific &other)" -->
-<a class="el" href="a00281.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00281.html">enumerable_thread_specific</a> &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00284.html">const_accessor</a>. <a href="#e698ef3d70b2d1a29a7a5551784d3653"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#5f12d150d421420965db07368666a84f">erase</a> (<a class="el" href="a00282.html">accessor</a> &item_accessor)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0e7ebbfd8e04eb22fe59b581206e7888"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="0e7ebbfd8e04eb22fe59b581206e7888" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
-template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00281.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00281.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by accessor. <a href="#5f12d150d421420965db07368666a84f"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2066e7e0fec7813db8fe9c8b9368c9e5"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::node_allocator_type" ref="2066e7e0fec7813db8fe9c8b9368c9e5" args="" -->
+typedef Allocator::template <br>
+rebind< node >::other </td><td class="memItemRight" valign="bottom"><b>node_allocator_type</b></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1eac7eff6e21b7fc299b67acb36eb3c7"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine" ref="1eac7eff6e21b7fc299b67acb36eb3c7" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="559190b7953177b4967a3312f557318f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::delete_node" ref="559190b7953177b4967a3312f557318f" args="(node_base *n)" -->
+void </td><td class="memItemRight" valign="bottom"><b>delete_node</b> (node_base *n)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f671d7bd4c1d3a750b4be4c32a489c55"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine_each" ref="f671d7bd4c1d3a750b4be4c32a489c55" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="32ec82223d843f1c2b95fa37acb7f4bb"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::search_bucket" ref="32ec82223d843f1c2b95fa37acb7f4bb" args="(const key_type &key, bucket *b) const " -->
+node * </td><td class="memItemRight" valign="bottom"><b>search_bucket</b> (const key_type &key, bucket *b) const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4962c7da24793ccc05524cc3bbcf1efa"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::rehash_bucket" ref="4962c7da24793ccc05524cc3bbcf1efa" args="(bucket *b_new, const hashcode_t h)" -->
+void </td><td class="memItemRight" valign="bottom"><b>rehash_bucket</b> (bucket *b_new, const hashcode_t h)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3f3413264a99174a224ef96f6c4ea769"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::lookup" ref="3f3413264a99174a224ef96f6c4ea769" args="(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#3f3413264a99174a224ef96f6c4ea769">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00284.html">const_accessor</a> *result, bool write)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert or find item and optionally acquire a lock on the item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c964214eb38f54603aa75fdff6d2709"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::exclude" ref="0c964214eb38f54603aa75fdff6d2709" args="(const_accessor &item_accessor)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#0c964214eb38f54603aa75fdff6d2709">exclude</a> (<a class="el" href="a00284.html">const_accessor</a> &item_accessor)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">delete item by accessor <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8f5373b8e1864619d1ffcf3bf3f1f13d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_equal_range" ref="8f5373b8e1864619d1ffcf3bf3f1f13d" args="(const Key &key, I end) const " -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">std::pair< I, I > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00281.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a> (const Key &key, I end) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns an iterator for an item defined by the key, or for the next item after it (if upper==true). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72c9c9e9655fcf096f5f0ed9c8ba6669"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_copy" ref="72c9c9e9655fcf096f5f0ed9c8ba6669" args="(const concurrent_hash_map &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a> (const <a class="el" href="a00281.html">concurrent_hash_map</a> &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy "source" to *this, where *this must start out empty. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1ec1fe8dfa2d7894bf0589bfdbcb1f96"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_copy" ref="1ec1fe8dfa2d7894bf0589bfdbcb1f96" args="(I first, I last)" -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>internal_copy</b> (I first, I last)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a> (const Key &key) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast find when no concurrent erasure is used. For internal use inside TBB only! <a href="#2f76ed101a0ccc8875b846c2f747897e"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a72cb6e9873e5541295682179e5a7f74"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::my_allocator" ref="a72cb6e9873e5541295682179e5a7f74" args="" -->
+node_allocator_type </td><td class="memItemRight" valign="bottom"><b>my_allocator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="53c747a3f2d2d2c85aec866e19c31c29"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::my_hash_compare" ref="53c747a3f2d2d2c85aec866e19c31c29" args="" -->
+HashCompare </td><td class="memItemRight" valign="bottom"><b>my_hash_compare</b></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45364b2f249ceb935cff05c29fcfcf5c"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="45364b2f249ceb935cff05c29fcfcf5c" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e24acd2f6849db3377a3942807639758"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal::hash_map_iterator" ref="e24acd2f6849db3377a3942807639758" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c94f21746c8902f7e0b5115a8d4da1d2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal::hash_map_range" ref="c94f21746c8902f7e0b5115a8d4da1d2" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_range</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c0028dfa75a6baa14007355ab1ef7fc"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor" ref="2c0028dfa75a6baa14007355ab1ef7fc" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>const_accessor</b></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html">accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allows write access to elements and combines data access, locking, and garbage collection. <a href="a00282.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html">bucket_accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">bucket accessor is to find, rehash, acquire a lock, and access a bucket <a href="a00283.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html">const_accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection. <a href="a00284.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>node</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A generic range, used to create range objects from the iterators. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename Allocator = cache_aligned_allocator<T>, ets_key_usage_type ETS_key_type = ets_no_key><br>
- class tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></h3>
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></h3>
-The <a class="el" href="a00281.html">enumerable_thread_specific</a> container.
+Unordered map from Key to T.
<p>
-<a class="el" href="a00281.html">enumerable_thread_specific</a> has the following properties:<ul>
-<li>thread-local copies are lazily created, with default, exemplar or function initialization.</li><li>thread-local copies do not move (during lifetime, and excepting <a class="el" href="a00281.html#a8764176d4b6014c5d65f1051851abc8">clear()</a>) so the address of a copy is invariant.</li><li>the contained objects need not have operator=() defined if combine is not used.</li><li><a class="el" href="a00281.html">enumerable_thread_specific</a> containers may be copy-constructed or assigned. [...]
-<p>
-<dl compact><dt><b>Segmented iterator</b></dt><dd>When the thread-local objects are containers with input_iterators defined, a segmented iterator may be used to iterate over all the elements of all thread-local copies.</dd></dl>
-<dl compact><dt><b>combine and combine_each</b></dt><dd><ul>
-<li>Both methods are defined for <a class="el" href="a00281.html">enumerable_thread_specific</a>.</li><li>combine() requires the the type T have operator=() defined.</li><li>neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)</li><li>Both are evaluated in serial context (the methods are assumed to be non-benign.) </li></ul>
+<a class="el" href="a00281.html">concurrent_hash_map</a> is associative container with concurrent access.<p>
+<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1).</dd></dl>
+<dl compact><dt><b>Exception Safety</b></dt><dd><ul>
+<li>Hash function is not permitted to throw an exception. User-defined types Key and T are forbidden from throwing an exception in destructors.</li><li>If exception happens during <a class="el" href="a00281.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> operations, it has no effect (unless exception raised by HashCompare::hash() function during grow_segment).</li><li>If exception happens during <a class="el" href="a00281.html#088d1aaccc816884a49e38f7065622c8">operator=()</a> operati [...]
+</dd></dl>
+<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
+<li>Replaced internal algorithm and data structure. Patent is pending.</li><li>Added buckets number argument for constructor</li></ul>
+</dd></dl>
+<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
+<li>Fixed exception-safety</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Added constructor from a range of iterators</li><li>Added several new overloaded <a class="el" href="a00281.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> methods</li><li>Added <a class="el" href="a00281.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator()</a></li><li>Added <a class="el" href="a00281.html#076f8d9e16110aac5f558777aa744eb6">swap()</a></li [...]
</dd></dl>
<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="5f12d150d421420965db07368666a84f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="5f12d150d421420965db07368666a84f" args="(accessor &item_accessor)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00282.html">accessor</a> & </td>
+ <td class="paramname"> <em>item_accessor</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Erase item by accessor.
+<p>
+Return true if item was erased by particularly this call.
+</div>
+</div><p>
+<a class="anchor" name="e698ef3d70b2d1a29a7a5551784d3653"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="e698ef3d70b2d1a29a7a5551784d3653" args="(const_accessor &item_accessor)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00284.html">const_accessor</a> & </td>
+ <td class="paramname"> <em>item_accessor</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Erase item by <a class="el" href="a00284.html">const_accessor</a>.
+<p>
+Return true if item was erased by particularly this call.
+</div>
+</div><p>
+<a class="anchor" name="f27802b3a8d1863c29e743e9c6b4e870"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="f27802b3a8d1863c29e743e9c6b4e870" args="(const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, A >::erase </td>
+ <td>(</td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Erase item.
+<p>
+Return true if item was erased by particularly this call.
+</div>
+</div><p>
+<a class="anchor" name="7bc475d1968f7f0af3d736d7e8a0d7df"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::find" ref="7bc475d1968f7f0af3d736d7e8a0d7df" args="(accessor &result, const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00282.html">accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Find item and acquire a write lock on the item.
+<p>
+Return true if item is found, false otherwise.
+</div>
+</div><p>
+<a class="anchor" name="2afcc33dade7bb24e008d60c0df38230"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::find" ref="2afcc33dade7bb24e008d60c0df38230" args="(const_accessor &result, const Key &key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00284.html">const_accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Find item and acquire a read lock on the item.
+<p>
+Return true if item is found, false otherwise.
+</div>
+</div><p>
+<a class="anchor" name="3f121a316af8135de476a30fae6d7c07"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="3f121a316af8135de476a30fae6d7c07" args="(const value_type &value)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype">const value_type & </td>
+ <td class="paramname"> <em>value</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item by copying if there is no such key present already.
+<p>
+Returns true if item is inserted.
+</div>
+</div><p>
+<a class="anchor" name="39183d78d6e8425917555ab542ab92de"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="39183d78d6e8425917555ab542ab92de" args="(accessor &result, const value_type &value)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00282.html">accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const value_type & </td>
+ <td class="paramname"> <em>value</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item by copying if there is no such key present already and acquire a write lock on the item.
+<p>
+Returns true if item is new.
+</div>
+</div><p>
+<a class="anchor" name="091efd2d12fdad4fe9e54d9629a9dfc3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="091efd2d12fdad4fe9e54d9629a9dfc3" args="(const_accessor &result, const value_type &value)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00284.html">const_accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const value_type & </td>
+ <td class="paramname"> <em>value</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item by copying if there is no such key present already and acquire a read lock on the item.
+<p>
+Returns true if item is new.
+</div>
+</div><p>
+<a class="anchor" name="54e0955ecd11575b4c07166838a72893"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="54e0955ecd11575b4c07166838a72893" args="(accessor &result, const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00282.html">accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item (if not already present) and acquire a write lock on the item.
+<p>
+Returns true if item is new.
+</div>
+</div><p>
+<a class="anchor" name="47fe0e60151a9bd7a444db827772a4e6"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="47fe0e60151a9bd7a444db827772a4e6" args="(const_accessor &result, const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00284.html">const_accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item (if not already present) and acquire a read lock on the item.
+<p>
+Returns true if item is new.
+</div>
+</div><p>
+<a class="anchor" name="2f76ed101a0ccc8875b846c2f747897e"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_fast_find" ref="2f76ed101a0ccc8875b846c2f747897e" args="(const Key &key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">const_pointer <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::internal_fast_find </td>
+ <td>(</td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline, protected]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Fast find when no concurrent erasure is used. For internal use inside TBB only!
+<p>
+Return pointer to item with given key, or NULL if no such item exists. Must not be called concurrently with erasure operations.
+</div>
+</div><p>
+<a class="anchor" name="94758113d8993cfe5afdf2d63a728869"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::rehash" ref="94758113d8993cfe5afdf2d63a728869" args="(size_type n=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, A >::rehash </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>n</em> = <code>0</code> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Rehashes and optionally resizes the whole table.
+<p>
+Useful to optimize performance before or after concurrent operations. Also enables using of <a class="el" href="a00281.html#2afcc33dade7bb24e008d60c0df38230">find()</a> and <a class="el" href="a00281.html#6968eb6feed2df36be421df0464297af">count()</a> concurrent methods in serial context.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00499.html">enumerable_thread_specific.h</a></ul>
+<li>concurrent_hash_map.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00282.html b/doc/html/a00282.html
index f2cc50d..6efda8d 100644
--- a/doc/html/a00282.html
+++ b/doc/html/a00282.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::filter Class Reference</title>
+<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,213 +21,45 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00282.html">filter</a></div>
-<h1>tbb::filter Class Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::filter" -->A stage in a pipeline.
+<a class="el" href="a00428.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00281.html">concurrent_hash_map</a>::<a class="el" href="a00282.html">accessor</a></div>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::accessor" --><!-- doxytag: inherits="tbb::interface5::concurrent_hash_map::const_accessor" -->Allows write access to elements and combines data access, locking, and garbage collection.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00587.html">pipeline.h</a>></code>
+<code>#include <concurrent_hash_map.h></code>
<p>
-<p>Inheritance diagram for tbb::filter:
-<p><center><img src="a00282.png" usemap="#tbb::filter_map" border="0" alt=""></center>
-<map name="tbb::filter_map">
-<area href="a00348.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
+<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
+<p><center><img src="a00282.png" usemap="#tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map" border="0" alt=""></center>
+<map name="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map">
+<area href="a00284.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,530,24">
</map>
-<a href="a00105.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00023.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcfec27656a69ff2072802ac001e936f"></a><!-- doxytag: member="tbb::filter::is_serial" ref="fcfec27656a69ff2072802ac001e936f" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#fcfec27656a69ff2072802ac001e936f">is_serial</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is serial. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd53206c4795ef2df5df26b795caf692"></a><!-- doxytag: member="tbb::filter::is_ordered" ref="cd53206c4795ef2df5df26b795caf692" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter must receive stream in order. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15c29cae5d237e6d63dbfe5c94af89d5"></a><!-- doxytag: member="tbb::filter::is_bound" ref="15c29cae5d237e6d63dbfe5c94af89d5" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is thread-bound. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ec4dfe053e94a2349d56781ddea8477"></a><!-- doxytag: member="tbb::filter::object_may_be_null" ref="8ec4dfe053e94a2349d56781ddea8477" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">true if an input filter can emit null <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a> (void *item)=0</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Operate on an item from the input stream, and return item for output stream. <a href="#fa1b3dc1f4f47563ccab7f4d92f5b543"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#66d159f362293e3964ba3da8bc1d2604">~filter</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy filter. <a href="#66d159f362293e3964ba3da8bc1d2604"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#56275eb889c77c4807967133e21401bd">finalize</a> (void *)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys item if pipeline was cancelled. <a href="#56275eb889c77c4807967133e21401bd"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1edba30e1e64e82ee4b7c6f227825817"></a><!-- doxytag: member="tbb::filter::x1" ref="1edba30e1e64e82ee4b7c6f227825817" args="((is_serial_?serial:parallel)|exact_exception_propagation))" -->
- </td><td class="memItemRight" valign="bottom"><b>x1</b> ((is_serial_?serial:parallel)|<a class="el" href="a00282.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>))</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a06145c3e7ad273ece95eb8be642b0a2"></a><!-- doxytag: member="tbb::filter::prev_filter_in_pipeline" ref="a06145c3e7ad273ece95eb8be642b0a2" args="(not_in_pipeline())" -->
- </td><td class="memItemRight" valign="bottom"><b>prev_filter_in_pipeline</b> (not_in_pipeline())</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7a54082a9165275bf7725970d756f132"></a><!-- doxytag: member="tbb::filter::my_pipeline" ref="7a54082a9165275bf7725970d756f132" args="(NULL)" -->
- </td><td class="memItemRight" valign="bottom"><b>my_pipeline</b> (NULL)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d66d6e9e27b1be74fdb9c07f899d4837"></a><!-- doxytag: member="tbb::filter::next_segment" ref="d66d6e9e27b1be74fdb9c07f899d4837" args="(NULL)" -->
- </td><td class="memItemRight" valign="bottom"><b>next_segment</b> (NULL)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3f49df3c34a3e5a8884001c30230a94"></a><!-- doxytag: member="tbb::filter::filter" ref="a3f49df3c34a3e5a8884001c30230a94" args="(mode filter_mode)" -->
- </td><td class="memItemRight" valign="bottom"><b>filter</b> (mode filter_mode)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2b9c0dd8123a8186b46bc100d9469f5"></a><!-- doxytag: member="tbb::filter::set_end_of_input" ref="b2b9c0dd8123a8186b46bc100d9469f5" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set_end_of_input</b> ()</td></tr>
-
-<tr><td colspan="2"><br><h2>Static Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b7de3a76e744f3d9c1bc5d437ea851d"></a><!-- doxytag: member="tbb::filter::filter_is_serial" ref="4b7de3a76e744f3d9c1bc5d437ea851d" args="" -->
-static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> = 0x1</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The lowest bit 0 is for parallel vs. serial. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a> = 0x1<<4</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">4th bit distinguishes ordered vs unordered filters. <a href="#2e5eb65f95d8050186278077e433c5b1"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd6a6e7210efc9bcaf2c5e08767d92b5"></a><!-- doxytag: member="tbb::filter::filter_is_bound" ref="dd6a6e7210efc9bcaf2c5e08767d92b5" args="" -->
-static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> = 0x1<<5</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">5th bit distinguishes thread-bound and regular filters. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bdd02a434a6e7499dd1e8f43aae96793"></a><!-- doxytag: member="tbb::filter::filter_may_emit_null" ref="bdd02a434a6e7499dd1e8f43aae96793" args="" -->
-static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> = 0x1<<6</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">6th bit marks input filters emitting small objects <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b648be7a95a8fb2971042c15eb112c1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::value_type" ref="0b648be7a95a8fb2971042c15eb112c1" args="" -->
+typedef concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">7th bit defines exception propagation mode expected by the application. <a href="#f17200974c33be21f42a5f00893de028"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::filter::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::filter::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b211ee58bada099e24280d478017cbff"></a><!-- doxytag: member="tbb::filter::pipeline" ref="b211ee58bada099e24280d478017cbff" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>pipeline</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="170280ea807a22e742095de3e8c5ea38"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::operator *" ref="170280ea807a22e742095de3e8c5ea38" args="() const " -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#170280ea807a22e742095de3e8c5ea38">operator *</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::filter::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807920cdffe3ec5c5e282b4d1ff92a2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::operator->" ref="a807920cdffe3ec5c5e282b4d1ff92a2" args="() const " -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A stage in a pipeline.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="66d159f362293e3964ba3da8bc1d2604"></a><!-- doxytag: member="tbb::filter::~filter" ref="66d159f362293e3964ba3da8bc1d2604" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::filter::~filter </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroy filter.
-<p>
-If the filter was added to a pipeline, the pipeline must be destroyed first.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="56275eb889c77c4807967133e21401bd"></a><!-- doxytag: member="tbb::filter::finalize" ref="56275eb889c77c4807967133e21401bd" args="(void *)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual void tbb::filter::finalize </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroys item if pipeline was cancelled.
-<p>
-Required to prevent memory leaks. Note it can be called concurrently even for serial filters.
-</div>
-</div><p>
-<a class="anchor" name="fa1b3dc1f4f47563ccab7f4d92f5b543"></a><!-- doxytag: member="tbb::filter::operator()" ref="fa1b3dc1f4f47563ccab7f4d92f5b543" args="(void *item)=0" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual void* tbb::filter::operator() </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>item</em> </td>
- <td> ) </td>
- <td width="100%"><code> [pure virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</h3>
+Allows write access to elements and combines data access, locking, and garbage collection.
<p>
-Operate on an item from the input stream, and return item for output stream.
-<p>
-Returns NULL if filter is a sink.
-</div>
-</div><p>
-<hr><h2>Member Data Documentation</h2>
-<a class="anchor" name="f17200974c33be21f42a5f00893de028"></a><!-- doxytag: member="tbb::filter::exact_exception_propagation" ref="f17200974c33be21f42a5f00893de028" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">const unsigned char <a class="el" href="a00282.html#f17200974c33be21f42a5f00893de028">tbb::filter::exact_exception_propagation</a><code> [static, protected]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<b>Initial value:</b><div class="fragment"><pre class="fragment">
-<span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<span class="preprocessor"> 0x0</span>
-</pre></div>7th bit defines exception propagation mode expected by the application.
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="2e5eb65f95d8050186278077e433c5b1"></a><!-- doxytag: member="tbb::filter::filter_is_out_of_order" ref="2e5eb65f95d8050186278077e433c5b1" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">const unsigned char <a class="el" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter::filter_is_out_of_order</a> = 0x1<<4<code> [static, protected]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-4th bit distinguishes ordered vs unordered filters.
-<p>
-The bit was not set for parallel filters in TBB 2.1 and earlier, but <a class="el" href="a00282.html#cd53206c4795ef2df5df26b795caf692">is_ordered()</a> function always treats parallel filters as out of order.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00587.html">pipeline.h</a></ul>
+<li>concurrent_hash_map.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00282.png b/doc/html/a00282.png
index e668b17..9fd6a57 100644
Binary files a/doc/html/a00282.png and b/doc/html/a00282.png differ
diff --git a/doc/html/a00283.html b/doc/html/a00283.html
index a7e2944..5d2960e 100644
--- a/doc/html/a00283.html
+++ b/doc/html/a00283.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::filter_t< T, U > Class Template Reference</title>
+<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,53 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00283.html">filter_t</a></div>
-<h1>tbb::interface6::filter_t< T, U > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::filter_t" -->Class representing a chain of type-safe pipeline filters.
+<a class="el" href="a00428.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00281.html">concurrent_hash_map</a>::<a class="el" href="a00283.html">bucket_accessor</a></div>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::bucket_accessor" -->bucket accessor is to find, rehash, acquire a lock, and access a bucket
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00587.html">pipeline.h</a>></code>
+<code>#include <concurrent_hash_map.h></code>
<p>
-<a href="a00109.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00021.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af1a36ca22e38eacd72eb256ee2ecef0"></a><!-- doxytag: member="tbb::interface6::filter_t::filter_t" ref="af1a36ca22e38eacd72eb256ee2ecef0" args="(const filter_t< T, U > &rhs)" -->
- </td><td class="memItemRight" valign="bottom"><b>filter_t</b> (const <a class="el" href="a00283.html">filter_t</a>< T, U > &rhs)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b1dcb174ab54b8612b25b6126d18d6c3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::bucket_accessor" ref="b1dcb174ab54b8612b25b6126d18d6c3" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
+ </td><td class="memItemRight" valign="bottom"><b>bucket_accessor</b> (<a class="el" href="a00281.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="b80632a312f984a16b2a0db77859ee08"></a><!-- doxytag: member="tbb::interface6::filter_t::filter_t" ref="b80632a312f984a16b2a0db77859ee08" args="(tbb::filter::mode mode, const Body &body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>filter_t</b> (tbb::filter::mode mode, const Body &body)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d11c77f4d70a94d4fb344492bbf18007"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::acquire" ref="d11c77f4d70a94d4fb344492bbf18007" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a> (<a class="el" href="a00281.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d87c68b6beaff12dcec7231d96d7b4c"></a><!-- doxytag: member="tbb::interface6::filter_t::operator=" ref="2d87c68b6beaff12dcec7231d96d7b4c" args="(const filter_t< T, U > &rhs)" -->
-void </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00283.html">filter_t</a>< T, U > &rhs)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">find a bucket by masked hashcode, optionally rehash, and acquire the lock <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="07d958f151a0eaa92f50fd56ad6440e2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::is_writer" ref="07d958f151a0eaa92f50fd56ad6440e2" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f299d149b932c2c78006c6f703b83eef"></a><!-- doxytag: member="tbb::interface6::filter_t::clear" ref="f299d149b932c2c78006c6f703b83eef" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff802cb5656e3788a89f3314aed2efe"></a><!-- doxytag: member="tbb::interface6::filter_t::internal::pipeline_proxy" ref="fff802cb5656e3788a89f3314aed2efe" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_proxy</b></td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="85c2892eff1fddcd06e28911e75838bd"></a><!-- doxytag: member="tbb::interface6::filter_t::make_filter" ref="85c2892eff1fddcd06e28911e75838bd" args="(tbb::filter::mode, const Body &)" -->
-template<typename T_, typename U_, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00283.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00283.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a> (tbb::filter::mode, const Body &)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Create a filter to participate in parallel_pipeline. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="6b9b1f5ce7f2121f093b8cd1d84707ad"></a><!-- doxytag: member="tbb::interface6::filter_t::operator &" ref="6b9b1f5ce7f2121f093b8cd1d84707ad" args="(const filter_t< T_, V_ > &, const filter_t< V_, U_ > &)" -->
-template<typename T_, typename V_, typename U_> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00283.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>operator &</b> (const <a class="el" href="a00283.html">filter_t</a>< T_, V_ > &, const <a class="el" href="a00283.html">filter_t</a>< V_, U_ > &)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">check whether bucket is locked for write <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa6314b861c574f86ed189b124cf5853"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::operator()" ref="fa6314b861c574f86ed189b124cf5853" args="()" -->
+bucket * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#fa6314b861c574f86ed189b124cf5853">operator()</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">get bucket pointer <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename U><br>
- class tbb::interface6::filter_t< T, U ></h3>
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</h3>
-Class representing a chain of type-safe pipeline filters.
+bucket accessor is to find, rehash, acquire a lock, and access a bucket
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00587.html">pipeline.h</a></ul>
+<li>concurrent_hash_map.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00284.html b/doc/html/a00284.html
index 7d3edb6..46c3b04 100644
--- a/doc/html/a00284.html
+++ b/doc/html/a00284.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::final_scan_tag Struct Reference</title>
+<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,30 +21,79 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00284.html">final_scan_tag</a></div>
-<h1>tbb::final_scan_tag Struct Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::final_scan_tag" -->Used to indicate that the final scan is being performed.
+<a class="el" href="a00428.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00281.html">concurrent_hash_map</a>::<a class="el" href="a00284.html">const_accessor</a></div>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::const_accessor" -->Combines data access, locking, and garbage collection.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00562.html">parallel_scan.h</a>></code>
+<code>#include <concurrent_hash_map.h></code>
<p>
-<a href="a00097.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor:
+<p><center><img src="a00284.png" usemap="#tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map" border="0" alt=""></center>
+<map name="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map">
+<area href="a00282.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor" shape="rect" coords="0,56,530,80">
+</map>
+<a href="a00022.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06888e4a548788fcb2c15542d428d8c9"></a><!-- doxytag: member="tbb::final_scan_tag::is_final_scan" ref="06888e4a548788fcb2c15542d428d8c9" args="()" -->
-static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8e50238483ba451363dccebd981d346"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::value_type" ref="a8e50238483ba451363dccebd981d346" args="" -->
+typedef const concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#a8e50238483ba451363dccebd981d346">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84c3080d0c6124d55c8bb4cf6055e65f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::empty" ref="84c3080d0c6124d55c8bb4cf6055e65f" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if result is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7db006d41b49dc5f1716a913769d4698"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::release" ref="7db006d41b49dc5f1716a913769d4698" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#7db006d41b49dc5f1716a913769d4698">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set to null. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9411df8197ceb4881ec4c7368a0a7f88"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::operator *" ref="9411df8197ceb4881ec4c7368a0a7f88" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d03a48ecb8cd9549bd8be64b09c9b0d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::operator->" ref="3d03a48ecb8cd9549bd8be64b09c9b0d" args="() const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27399c613eb1aecd4660803955dda09d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::const_accessor" ref="27399c613eb1aecd4660803955dda09d" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#27399c613eb1aecd4660803955dda09d">const_accessor</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Create empty result. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="928769b139d53427e7075c1f86148e4c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::~const_accessor" ref="928769b139d53427e7075c1f86148e4c" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy result after releasing the underlying reference. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45ab59454c6f11fe938bbcab637cdd73"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::is_writer" ref="45ab59454c6f11fe938bbcab637cdd73" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>is_writer</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="21856da696b0765cc3db90663160d95e"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::my_node" ref="21856da696b0765cc3db90663160d95e" args="" -->
+node * </td><td class="memItemRight" valign="bottom"><b>my_node</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4936cc9432926ed38f0207828b388e24"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::my_hash" ref="4936cc9432926ed38f0207828b388e24" args="" -->
+hashcode_t </td><td class="memItemRight" valign="bottom"><b>my_hash</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d062d8ecb243a6ec62fa30bca52a1bcf"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::concurrent_hash_map< Key, T, HashCompare, Allocator >" ref="d062d8ecb243a6ec62fa30bca52a1bcf" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ddd77aff56c12366acc02d0f1588a706"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::accessor" ref="ddd77aff56c12366acc02d0f1588a706" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>accessor</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Used to indicate that the final scan is being performed.
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</h3>
+
+Combines data access, locking, and garbage collection.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00562.html">parallel_scan.h</a></ul>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li>concurrent_hash_map.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00272.png b/doc/html/a00284.png
similarity index 100%
rename from doc/html/a00272.png
rename to doc/html/a00284.png
diff --git a/doc/html/a00285.html b/doc/html/a00285.html
index e7c54d5..21fcc55 100644
--- a/doc/html/a00285.html
+++ b/doc/html/a00285.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::flow_control Class Reference</title>
+<title>tbb::interface5::concurrent_priority_queue< T, Compare, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,31 +21,325 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00285.html">flow_control</a></div>
-<h1>tbb::interface6::flow_control Class Reference</h1><!-- doxytag: class="tbb::interface6::flow_control" -->input_filter control to signal end-of-input for parallel_pipeline
+<a class="el" href="a00428.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00285.html">concurrent_priority_queue</a></div>
+<h1>tbb::interface5::concurrent_priority_queue< T, Compare, A > Class Template Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_priority_queue" -->Concurrent priority queue.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00587.html">pipeline.h</a>></code>
+<code>#include <concurrent_priority_queue.h></code>
<p>
-<a href="a00108.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00031.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c611a6b5b8f94b0e7f2afc97e31efb1"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::value_type" ref="7c611a6b5b8f94b0e7f2afc97e31efb1" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5804b3c708ef4e50d603f918ef2b9e58"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::reference" ref="5804b3c708ef4e50d603f918ef2b9e58" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4ded8601a434098605be0dcc4febc60"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::const_reference" ref="a4ded8601a434098605be0dcc4febc60" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#a4ded8601a434098605be0dcc4febc60">const_reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b679eea8d01d041625a39f719ca2b7ed"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::size_type" ref="b679eea8d01d041625a39f719ca2b7ed" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77399bc76b3ecd60e33f7e35a5becd87"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::difference_type" ref="77399bc76b3ecd60e33f7e35a5becd87" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1712cb3a46bc1821fccc5e2cd83d5cd7"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::allocator_type" ref="1712cb3a46bc1821fccc5e2cd83d5cd7" args="" -->
+typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b2c7123577587e3c26506db3e5abe62"></a><!-- doxytag: member="tbb::interface6::flow_control::stop" ref="4b2c7123577587e3c26506db3e5abe62" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>stop</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eefa40599afe00ea393897d8f5662e65"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="eefa40599afe00ea393897d8f5662e65" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a> (const <a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00285.html">concurrent_priority_queue</a> with default capacity. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4555b4a55415a70024c4004b51e9f385"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="4555b4a55415a70024c4004b51e9f385" args="(size_type init_capacity, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a> (<a class="el" href="a00285.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, const <a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00285.html">concurrent_priority_queue</a> with init_sz capacity. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9147cb4207017c260a0c3929c12cd40f"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="9147cb4207017c260a0c3929c12cd40f" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00285.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a> (const <a class="el" href="a00285.html">concurrent_priority_queue</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <a href="#509419e320f200456d89dc54a65140b3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#c8b20e7430c5302936030bef59a562be">concurrent_priority_queue</a> (const <a class="el" href="a00285.html">concurrent_priority_queue</a> &src, const <a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor with specific allocator. <a href="#c8b20e7430c5302936030bef59a562be"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00285.html">concurrent_priority_queue</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a> (const <a class="el" href="a00285.html">concurrent_priority_queue</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment operator. <a href="#2ab7f7808891027ac0f0f5b3a4be51e9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#317c508fa92df218be5d014c26c09bb7">empty</a> () const </td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15bb80e25fbcc4213e0053d558df6462"></a><!-- doxytag: member="tbb::interface6::flow_control::internal::concrete_filter" ref="15bb80e25fbcc4213e0053d558df6462" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concrete_filter</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if empty, false otherwise. <a href="#317c508fa92df218be5d014c26c09bb7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00285.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of elements contained in the queue. <a href="#8b2ae25c61338c6fd59e94fe09822ba5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#d905af7b8f6defff562f5ae9c3275763">push</a> (<a class="el" href="a00285.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> elem)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pushes elem onto the queue, increasing capacity of queue if necessary. <a href="#d905af7b8f6defff562f5ae9c3275763"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a> (<a class="el" href="a00285.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> elem)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Gets a reference to and removes highest priority element. <a href="#e036461a29cc40902a2bb79abf9f5146"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue; not thread-safe. <a href="#0bdcdf7cde9fd369edca845bec34ca94"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#0ecdc6a04aa259374425d424ca2a6082">swap</a> (<a class="el" href="a00285.html">concurrent_priority_queue</a> &q)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Swap this queue with another; not thread-safe. <a href="#0ecdc6a04aa259374425d424ca2a6082"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d545d444fb0d16148f9b61fd89f9a337"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::get_allocator" ref="d545d444fb0d16148f9b61fd89f9a337" args="() const " -->
+<a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>cpq_operation</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>my_functor_t</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-input_filter control to signal end-of-input for parallel_pipeline
+<h3>template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>><br>
+ class tbb::interface5::concurrent_priority_queue< T, Compare, A ></h3>
+
+Concurrent priority queue.
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="509419e320f200456d89dc54a65140b3"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="509419e320f200456d89dc54a65140b3" args="(const concurrent_priority_queue &src)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00285.html">concurrent_priority_queue</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="a00285.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
+ <td class="paramname"> <em>src</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, explicit]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Copy constructor.
+<p>
+This operation is unsafe if there are pending concurrent operations on the src queue.
+</div>
+</div><p>
+<a class="anchor" name="c8b20e7430c5302936030bef59a562be"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="c8b20e7430c5302936030bef59a562be" args="(const concurrent_priority_queue &src, const allocator_type &a)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00285.html">concurrent_priority_queue</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="a00285.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
+ <td class="paramname"> <em>src</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> & </td>
+ <td class="paramname"> <em>a</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Copy constructor with specific allocator.
+<p>
+This operation is unsafe if there are pending concurrent operations on the src queue.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="0bdcdf7cde9fd369edca845bec34ca94"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::clear" ref="0bdcdf7cde9fd369edca845bec34ca94" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::clear </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Clear the queue; not thread-safe.
+<p>
+This operation is unsafe if there are pending concurrent operations on the queue. Resets size, effectively emptying queue; does not free space. May not clear elements added in pending operations.
+</div>
+</div><p>
+<a class="anchor" name="317c508fa92df218be5d014c26c09bb7"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::empty" ref="317c508fa92df218be5d014c26c09bb7" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::empty </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns true if empty, false otherwise.
+<p>
+Returned value may not reflect results of pending operations. This operation reads shared data and will trigger a race condition.
+</div>
+</div><p>
+<a class="anchor" name="2ab7f7808891027ac0f0f5b3a4be51e9"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::operator=" ref="2ab7f7808891027ac0f0f5b3a4be51e9" args="(const concurrent_priority_queue &src)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00285.html">concurrent_priority_queue</a>& <a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="a00285.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
+ <td class="paramname"> <em>src</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Assignment operator.
+<p>
+This operation is unsafe if there are pending concurrent operations on the src queue.
+</div>
+</div><p>
+<a class="anchor" name="d905af7b8f6defff562f5ae9c3275763"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::push" ref="d905af7b8f6defff562f5ae9c3275763" args="(const_reference elem)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::push </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00285.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> </td>
+ <td class="paramname"> <em>elem</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Pushes elem onto the queue, increasing capacity of queue if necessary.
+<p>
+This operation can be safely used concurrently with other push, try_pop or reserve operations.
+</div>
+</div><p>
+<a class="anchor" name="8b2ae25c61338c6fd59e94fe09822ba5"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::size" ref="8b2ae25c61338c6fd59e94fe09822ba5" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00285.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::size </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns the current number of elements contained in the queue.
+<p>
+Returned value may not reflect results of pending operations. This operation reads shared data and will trigger a race condition.
+</div>
+</div><p>
+<a class="anchor" name="0ecdc6a04aa259374425d424ca2a6082"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::swap" ref="0ecdc6a04aa259374425d424ca2a6082" args="(concurrent_priority_queue &q)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::swap </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00285.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
+ <td class="paramname"> <em>q</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Swap this queue with another; not thread-safe.
+<p>
+This operation is unsafe if there are pending concurrent operations on the queue.
+</div>
+</div><p>
+<a class="anchor" name="e036461a29cc40902a2bb79abf9f5146"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::try_pop" ref="e036461a29cc40902a2bb79abf9f5146" args="(reference elem)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::try_pop </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00285.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> </td>
+ <td class="paramname"> <em>elem</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Gets a reference to and removes highest priority element.
<p>
+If a highest priority element was found, sets elem and returns true, otherwise returns false. This operation can be safely used concurrently with other push, try_pop or reserve operations.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00587.html">pipeline.h</a></ul>
+<li>concurrent_priority_queue.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00286.html b/doc/html/a00286.html
index 3b12c8b..616dbcf 100644
--- a/doc/html/a00286.html
+++ b/doc/html/a00286.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::function_node< Input, Output,, Allocator > Class Template Reference</title>
+<title>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,71 +21,146 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00286.html">function_node</a></div>
-<h1>tbb::flow::interface6::function_node< Input, Output,, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::function_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->Implements a function node that supports Input -> Output.
+<a class="el" href="a00428.html">tbb</a>::<b>strict_ppl</b>::<a class="el" href="a00286.html">concurrent_queue</a></div>
+<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00442.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::strict_ppl::concurrent_queue" -->A high-performance thread-safe non-blocking concurrent queue.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <concurrent_queue.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::function_node< Input, Output,, Allocator >:
-<p><center><img src="a00286.png" usemap="#tbb::flow::interface6::function_node< Input, Output,, Allocator >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::function_node< Input, Output,, Allocator >_map">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,368,24">
-</map>
-<a href="a00062.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00035.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eed5be58daf252aebed0df276ef9829b"></a><!-- doxytag: member="tbb::flow::interface6::function_node::input_type" ref="eed5be58daf252aebed0df276ef9829b" args="" -->
-typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="682c3978d5cb0620000994f11c44a476"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::value_type" ref="682c3978d5cb0620000994f11c44a476" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#682c3978d5cb0620000994f11c44a476">value_type</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a6b1ada4ae95bcc11f3ecc7d8b407038"></a><!-- doxytag: member="tbb::flow::interface6::function_node::output_type" ref="a6b1ada4ae95bcc11f3ecc7d8b407038" args="" -->
-typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8d725c50a9834bb7af5b67c0aff92b8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::reference" ref="a8d725c50a9834bb7af5b67c0aff92b8" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bffd3b755433095325cc554ea2ae752"></a><!-- doxytag: member="tbb::flow::interface6::function_node::predecessor_type" ref="7bffd3b755433095325cc554ea2ae752" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< input_type > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d48e7ff93f81636bca2c74f7da34750"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_reference" ref="4d48e7ff93f81636bca2c74f7da34750" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c24f9bbb872a81053cea4f38e214f458"></a><!-- doxytag: member="tbb::flow::interface6::function_node::successor_type" ref="c24f9bbb872a81053cea4f38e214f458" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fc30e93f8342a1960357f71e4fe8a2b"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::size_type" ref="8fc30e93f8342a1960357f71e4fe8a2b" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ad406125e6938567d61b5b7ad7039a0"></a><!-- doxytag: member="tbb::flow::interface6::function_node::fInput_type" ref="3ad406125e6938567d61b5b7ad7039a0" args="" -->
-typedef internal::function_input<<br>
- input_type, output_type,<br>
- Allocator > </td><td class="memItemRight" valign="bottom"><b>fInput_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="068576d16c7e4e05d52f9db7a45b5b65"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::difference_type" ref="068576d16c7e4e05d52f9db7a45b5b65" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6bde48df8336f0bdc4fbb8c1879e13d6"></a><!-- doxytag: member="tbb::flow::interface6::function_node::fOutput_type" ref="6bde48df8336f0bdc4fbb8c1879e13d6" args="" -->
-typedef internal::function_output<<br>
- output_type > </td><td class="memItemRight" valign="bottom"><b>fOutput_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a3956341728eaa558d8827063718cac"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::allocator_type" ref="5a3956341728eaa558d8827063718cac" args="" -->
+typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9736ac047d6da3363895c7e5b121d0c4"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::iterator" ref="9736ac047d6da3363895c7e5b121d0c4" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00286.html">concurrent_queue</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9cd76d19af8c78be1bafc6ca0123ac0d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_iterator" ref="9cd76d19af8c78be1bafc6ca0123ac0d" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00286.html">concurrent_queue</a>, const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5c215b40e3daf73d1c6802ecb5aded6c"></a><!-- doxytag: member="tbb::flow::interface6::function_node::function_node" ref="5c215b40e3daf73d1c6802ecb5aded6c" args="(graph &g, size_t concurrency, Body body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00286.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a> (<a class="el" href="a00288.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c48a05a94a1f4f98fdfadfbef98ecf6"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="7c48a05a94a1f4f98fdfadfbef98ecf6" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="25209656c84f2f9b030e2f9162713341"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="25209656c84f2f9b030e2f9162713341" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00286.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5132323fd2ac6a00ea0c78beda78723"></a><!-- doxytag: member="tbb::flow::interface6::function_node::function_node" ref="d5132323fd2ac6a00ea0c78beda78723" args="(const function_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#d5132323fd2ac6a00ea0c78beda78723">function_node</a> (const <a class="el" href="a00286.html">function_node</a> &src)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a6b98ea11a867db8ac868f0113ca429"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="8a6b98ea11a867db8ac868f0113ca429" args="(const concurrent_queue &src, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00286.html">concurrent_queue</a> &src, const <a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bac36ad296662eb7e77ccd3a56688b64"></a><!-- doxytag: member="tbb::flow::interface6::function_node::try_put" ref="bac36ad296662eb7e77ccd3a56688b64" args="(const input_type &i)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>try_put</b> (const input_type &i)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="830b33753d6b149c366344e29b2edd8c"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::~concurrent_queue" ref="830b33753d6b149c366344e29b2edd8c" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="73c47563ffcc4c2f6452f25a04ebe2e2"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::push" ref="73c47563ffcc4c2f6452f25a04ebe2e2" args="(const T &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a> (const T &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a> (T &result)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#ae31ca0db34ef96ef1e74aa0d28c95f8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eaa35a5274606779802e9a669a706260"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_size" ref="eaa35a5274606779802e9a669a706260" args="() const " -->
+<a class="el" href="a00286.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#eaa35a5274606779802e9a669a706260">unsafe_size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the number of items in the queue; thread unsafe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3f6fce0cfa2d581d6f3b47e0613ad64"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::empty" ref="f3f6fce0cfa2d581d6f3b47e0613ad64" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to size()==0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c32e8e84c0524155133b4aae32d2a827"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::clear" ref="c32e8e84c0524155133b4aae32d2a827" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#c32e8e84c0524155133b4aae32d2a827">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue. not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f034f70caef445fe8abc9113ec926a8d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::get_allocator" ref="f034f70caef445fe8abc9113ec926a8d" args="() const " -->
+<a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a> () const </td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ffad8dcf70ebebc751dcf2c82cd5e1ad"></a><!-- doxytag: member="tbb::flow::interface6::function_node::successors" ref="ffad8dcf70ebebc751dcf2c82cd5e1ad" args="()" -->
-internal::broadcast_cache<<br>
- output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6297f48808dd7c14e6c2fe81559ca190"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="6297f48808dd7c14e6c2fe81559ca190" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1569f70e70521fe71944a5b0138c6ef5"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="1569f70e70521fe71944a5b0138c6ef5" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3e6746f7b6ecfbc16f781665ac51112"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="e3e6746f7b6ecfbc16f781665ac51112" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83bf90849c08f44d25dd7a3b207a8956"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="83bf90849c08f44d25dd7a3b207a8956" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Input, typename Output = continue_msg, graph_buffer_policy = queueing, typename Allocator = cache_aligned_allocator<Input>><br>
- class tbb::flow::interface6::function_node< Input, Output,, Allocator ></h3>
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::strict_ppl::concurrent_queue< T, A ></h3>
-Implements a function node that supports Input -> Output.
+A high-performance thread-safe non-blocking concurrent queue.
+<p>
+Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="ae31ca0db34ef96ef1e74aa0d28c95f8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::try_pop" ref="ae31ca0db34ef96ef1e74aa0d28c95f8" args="(T &result)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue</a>< T, A >::try_pop </td>
+ <td>(</td>
+ <td class="paramtype">T & </td>
+ <td class="paramname"> <em>result</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Attempt to dequeue an item from head of queue.
<p>
+Does not wait for item to become available. Returns true if successful; false otherwise.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>concurrent_queue.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00287.html b/doc/html/a00287.html
index 44f643a..b1e7e6f 100644
--- a/doc/html/a00287.html
+++ b/doc/html/a00287.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Class Template Reference</title>
+<title>tbb::deprecated::concurrent_queue< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,75 +21,131 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00287.html">function_node< Input, Output, queueing, Allocator ></a></div>
-<h1>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->Implements a function node that supports Input -> Output.
+<a class="el" href="a00428.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00287.html">concurrent_queue</a></div>
+<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00442.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::deprecated::concurrent_queue" --><!-- doxytag: inherits="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <concurrent_queue.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >:
-<p><center><img src="a00287.png" usemap="#tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >_map">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,424,24">
+<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
+<p><center><img src="a00287.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::deprecated::concurrent_queue< T, A >_map">
+<area href="a00280.html" alt="tbb::concurrent_bounded_queue< T, A >" shape="rect" coords="0,0,257,24">
</map>
-<a href="a00063.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00038.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2d8e92791b85100f8a53f7b2335c60c"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::input_type" ref="d2d8e92791b85100f8a53f7b2335c60c" args="" -->
-typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8861a9cdf232a20b5f2569754a281871"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::iterator" ref="8861a9cdf232a20b5f2569754a281871" args="" -->
+typedef <a class="el" href="a00280.html">concurrent_bounded_queue</a><<br>
+ T, A >::iterator </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="df1b2d30d065b64efcee71021129760a"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::output_type" ref="df1b2d30d065b64efcee71021129760a" args="" -->
-typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7117842ce3ed7c5147d3c886922e64d0"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::const_iterator" ref="7117842ce3ed7c5147d3c886922e64d0" args="" -->
+typedef <a class="el" href="a00280.html">concurrent_bounded_queue</a><<br>
+ T, A >::const_iterator </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8d8519eb42d5ddbba668a575b24a720a"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::predecessor_type" ref="8d8519eb42d5ddbba668a575b24a720a" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< input_type > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aaf19bd7337b72f3131ece60f7315ef7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="aaf19bd7337b72f3131ece60f7315ef7" args="(const A &a=A())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a> (const A &a=A())</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb82369d652cd58b169f9a2e8f7ed023"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::successor_type" ref="eb82369d652cd58b169f9a2e8f7ed023" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fc092b9082f233482f3513fc3bb670f7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="fc092b9082f233482f3513fc3bb670f7" args="(const concurrent_queue &src, const A &a=A())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00287.html">concurrent_queue</a> &src, const A &a=A())</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6083108a1ca5a4f1464511e378e4bedf"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::fInput_type" ref="6083108a1ca5a4f1464511e378e4bedf" args="" -->
-typedef internal::function_input<<br>
- input_type, output_type,<br>
- Allocator > </td><td class="memItemRight" valign="bottom"><b>fInput_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9102b897776bd2d9e908e6604ff16b5f"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="9102b897776bd2d9e908e6604ff16b5f" args="(InputIterator b, InputIterator e, const A &a=A())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00287.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a> (InputIterator b, InputIterator e, const A &a=A())</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4259f2853fb3af09518df3efb44ed8d5"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::queue_type" ref="4259f2853fb3af09518df3efb44ed8d5" args="" -->
-typedef internal::function_input_queue<<br>
- input_type, Allocator > </td><td class="memItemRight" valign="bottom"><b>queue_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a> (const T &source)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="431ce7232e788562d9152493961ee4b9"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::fOutput_type" ref="431ce7232e788562d9152493961ee4b9" args="" -->
-typedef internal::function_output<<br>
- output_type > </td><td class="memItemRight" valign="bottom"><b>fOutput_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full. <a href="#7c45561bafe71107d09b2bc1b8f4e681"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5b9019c1e6e9b2c41c986a384bd179db"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::function_node" ref="5b9019c1e6e9b2c41c986a384bd179db" args="(graph &g, size_t concurrency, Body body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00287.html#5b9019c1e6e9b2c41c986a384bd179db">function_node</a> (<a class="el" href="a00288.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#48da3536245318af6cb5fd58bac78039"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed7202cd273ae36463e6ac57e9472670"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="ed7202cd273ae36463e6ac57e9472670" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01055081ed477714503820035db3a965"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::function_node" ref="01055081ed477714503820035db3a965" args="(const function_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#01055081ed477714503820035db3a965">function_node</a> (const <a class="el" href="a00286.html">function_node</a> &src)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35fbb0d7e135545eb1daec2b4ae894cd"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="35fbb0d7e135545eb1daec2b4ae894cd" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b86c76d70a008960f3261e927f846367"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::try_put" ref="b86c76d70a008960f3261e927f846367" args="(const input_type &i)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>try_put</b> (const input_type &i)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="62f31fe653e1158e64ddb0e163d0335c"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="62f31fe653e1158e64ddb0e163d0335c" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34125123f0c8d9c13dbd6f52148608a1"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::successors" ref="34125123f0c8d9c13dbd6f52148608a1" args="()" -->
-internal::broadcast_cache<<br>
- output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d42ddc4a6fe42350750a930302863d1"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="3d42ddc4a6fe42350750a930302863d1" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Input, typename Output, typename Allocator><br>
- class tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></h3>
+<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
+ class tbb::deprecated::concurrent_queue< T, A ></h3>
-Implements a function node that supports Input -> Output.
+A high-performance thread-safe blocking concurrent bounded queue.
+<p>
+This is the pre-PPL TBB concurrent queue which support boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="48da3536245318af6cb5fd58bac78039"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::pop_if_present" ref="48da3536245318af6cb5fd58bac78039" args="(T &destination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue</a>< T, A >::pop_if_present </td>
+ <td>(</td>
+ <td class="paramtype">T & </td>
+ <td class="paramname"> <em>destination</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Attempt to dequeue an item from head of queue.
+<p>
+Does not wait for item to become available. Returns true if successful; false otherwise. <dl compact><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Use <a class="el" href="a00280.html#0ca487019bbb00a196442aff78a1e4f7">try_pop()</a> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7c45561bafe71107d09b2bc1b8f4e681"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::push_if_not_full" ref="7c45561bafe71107d09b2bc1b8f4e681" args="(const T &source)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00287.html">tbb::deprecated::concurrent_queue</a>< T, A >::push_if_not_full </td>
+ <td>(</td>
+ <td class="paramtype">const T & </td>
+ <td class="paramname"> <em>source</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enqueue an item at tail of queue if queue is not already full.
<p>
+Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>concurrent_queue.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00287.png b/doc/html/a00287.png
index 349b919..6aac5a0 100644
Binary files a/doc/html/a00287.png and b/doc/html/a00287.png differ
diff --git a/doc/html/a00288.html b/doc/html/a00288.html
index 39862a8..d4f07eb 100644
--- a/doc/html/a00288.html
+++ b/doc/html/a00288.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::graph Class Reference</title>
+<title>tbb::concurrent_vector< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,112 +21,337 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00288.html">graph</a></div>
-<h1>tbb::flow::interface6::graph Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::graph" -->The graph class.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00288.html">concurrent_vector</a></div>
+<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00442.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::concurrent_vector" -->Concurrent vector container.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <concurrent_vector.h></code>
<p>
-<a href="a00057.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00046.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec5db0443a1320850f8fa05b5eed2ea4"></a><!-- doxytag: member="tbb::flow::interface6::graph::iterator" ref="ec5db0443a1320850f8fa05b5eed2ea4" args="" -->
-typedef graph_iterator< <a class="el" href="a00288.html">graph</a>,<br>
- <a class="el" href="a00289.html">graph_node</a> > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc85684238d4bb5e422cb8ea0bdc438f"></a><!-- doxytag: member="tbb::concurrent_vector::size_type" ref="bc85684238d4bb5e422cb8ea0bdc438f" args="" -->
+typedef internal::concurrent_vector_base_v3::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3e677faaf2d66684cd32ccf5492dda4e"></a><!-- doxytag: member="tbb::flow::interface6::graph::const_iterator" ref="3e677faaf2d66684cd32ccf5492dda4e" args="" -->
-typedef graph_iterator< const <br>
-<a class="el" href="a00288.html">graph</a>, const <a class="el" href="a00289.html">graph_node</a> > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac7083635ab59834e9afc15e6c168df5"></a><!-- doxytag: member="tbb::concurrent_vector::allocator_type" ref="ac7083635ab59834e9afc15e6c168df5" args="" -->
+typedef internal::allocator_base<<br>
+ T, A >::allocator_type </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4543d7d45b2e461d3f8ef416974ec1f1"></a><!-- doxytag: member="tbb::concurrent_vector::value_type" ref="4543d7d45b2e461d3f8ef416974ec1f1" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e655e67dd14ed6d0cbfe7981d5fa350e"></a><!-- doxytag: member="tbb::concurrent_vector::difference_type" ref="e655e67dd14ed6d0cbfe7981d5fa350e" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c29033785d76e240ea96ae40610275d"></a><!-- doxytag: member="tbb::concurrent_vector::reference" ref="8c29033785d76e240ea96ae40610275d" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b2a6241ab3fa9ab4f4074893fecd47"></a><!-- doxytag: member="tbb::concurrent_vector::const_reference" ref="b0b2a6241ab3fa9ab4f4074893fecd47" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74319c908a32d5dcdc6a080f9c2b8803"></a><!-- doxytag: member="tbb::concurrent_vector::pointer" ref="74319c908a32d5dcdc6a080f9c2b8803" args="" -->
+typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd80729019220cdb80872ea6b905ffb1"></a><!-- doxytag: member="tbb::concurrent_vector::const_pointer" ref="dd80729019220cdb80872ea6b905ffb1" args="" -->
+typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a049674e7f386de3ea09ff2ed6d6bbbe"></a><!-- doxytag: member="tbb::concurrent_vector::iterator" ref="a049674e7f386de3ea09ff2ed6d6bbbe" args="" -->
+typedef internal::vector_iterator<<br>
+ <a class="el" href="a00288.html">concurrent_vector</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b51a1baa7da67e283806c0d4f2fe9c69"></a><!-- doxytag: member="tbb::concurrent_vector::const_iterator" ref="b51a1baa7da67e283806c0d4f2fe9c69" args="" -->
+typedef internal::vector_iterator<<br>
+ <a class="el" href="a00288.html">concurrent_vector</a>, const <br>
+T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7e4d252bef7af22286041c39c62abe"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="2c7e4d252bef7af22286041c39c62abe" args="" -->
+typedef std::reverse_iterator<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c59c3f9412b666a31a9052b789fb58bc"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="c59c3f9412b666a31a9052b789fb58bc" args="" -->
+typedef std::reverse_iterator<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c3901b092e9e8185bdc3cae5913e625"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="0c3901b092e9e8185bdc3cae5913e625" args="" -->
+typedef std::reverse_iterator<<br>
+ iterator, T, T &, T * > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="426145d7bd5913bc08e701c14b221046"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="426145d7bd5913bc08e701c14b221046" args="" -->
+typedef std::reverse_iterator<<br>
+ const_iterator, T, const <br>
+T &, const T * > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61fd90288dba6f8808d6dafe9a249ec5"></a><!-- doxytag: member="tbb::concurrent_vector::range_type" ref="61fd90288dba6f8808d6dafe9a249ec5" args="" -->
+typedef generic_range_type<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d6ddf0312a820a98efd9a5f394cb9dbd"></a><!-- doxytag: member="tbb::concurrent_vector::const_range_type" ref="d6ddf0312a820a98efd9a5f394cb9dbd" args="" -->
+typedef generic_range_type<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4ab3d4b5208ece28c4c3ced647e26e12"></a><!-- doxytag: member="tbb::flow::interface6::graph::graph" ref="4ab3d4b5208ece28c4c3ced647e26e12" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c8ca9cabfcd30ad5943324c853664b5"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2c8ca9cabfcd30ad5943324c853664b5" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a> (const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty vector. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b4937fc82ba4c8245a87a079476d80a"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="4b4937fc82ba4c8245a87a079476d80a" args="(std::initializer_list< T > init_list, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#4b4937fc82ba4c8245a87a079476d80a">concurrent_vector</a> (std::initializer_list< T > init_list, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor from initializer_list. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd8a200b99a8088435a37934b58fe335"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="dd8a200b99a8088435a37934b58fe335" args="(const concurrent_vector &vector, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00288.html">concurrent_vector</a> &vector, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="64432f13f7b29bfe4acfb5568f34f3a8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="64432f13f7b29bfe4acfb5568f34f3a8" args="(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())" -->
+template<class M> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00288.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00288.html">concurrent_vector</a>< T, M > &vector, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor for vector with different allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2a2e261dfe1cab3f73f7b1a94137cfca"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2a2e261dfe1cab3f73f7b1a94137cfca" args="(size_type n)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3883a8a908b44e249a57f454de3f55d8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="3883a8a908b44e249a57f454de3f55d8" args="(size_type n, const_reference t, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a> (size_type n, const_reference t, const allocator_type &a=allocator_type())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a graph with isolated <a class="el" href="a00340.html">task_group_context</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="104d4f3775f596b43177c29e6b7b7656"></a><!-- doxytag: member="tbb::flow::interface6::graph::graph" ref="104d4f3775f596b43177c29e6b7b7656" args="(task_group_context &use_this_context)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#104d4f3775f596b43177c29e6b7b7656">graph</a> (<a class="el" href="a00339.html">task_group_context</a> &use_this_context)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n, initialization by copying of t, and given allocator instance. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4450de83c5862ea4bcd9443fd7e67419"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="4450de83c5862ea4bcd9443fd7e67419" args="(I first, I last, const allocator_type &a=allocator_type())" -->
+template<class I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00288.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a graph with use_this_context as context. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="691f0f3cda3e489c37a657016e375eaf"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="691f0f3cda3e489c37a657016e375eaf" args="(const concurrent_vector &vector)" -->
+<a class="el" href="a00288.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00288.html">concurrent_vector</a> &vector)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys the graph. <a href="#8a7d424c0616a1c37a908ead182e2fe5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="19f4ab88a01b0fd056af3bba463e7bd6"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="19f4ab88a01b0fd056af3bba463e7bd6" args="(const concurrent_vector< T, M > &vector)" -->
+template<class M> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00288.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00288.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00288.html">concurrent_vector</a>< T, M > &vector)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to register that an external entity may still interact with the graph. <a href="#a993b789d1e488e0c3929135beae560e"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment for vector with different allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="85cc876b1dec457b831b4745be274be1"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="85cc876b1dec457b831b4745be274be1" args="(const std::initializer_list< T > &init_list)" -->
+<a class="el" href="a00288.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#85cc876b1dec457b831b4745be274be1">operator=</a> (const std::initializer_list< T > &init_list)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Deregisters an external entity that may have interacted with the graph. <a href="#29b85506870f13a884a21655aec2a65d"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename Receiver, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00288.html#50a7938df01b6148ab2c0696835f002e">run</a> (Receiver &r, Body body)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment for initializer_list. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#30484e3959892fd5392fa93c873c31f0">grow_by</a> (size_type delta)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawns a task that runs a body and puts its output to a specific receiver. <a href="#50a7938df01b6148ab2c0696835f002e"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00288.html#c1145b00e063793a7e7bf994d202c7a0">run</a> (Body body)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements. <a href="#30484e3959892fd5392fa93c873c31f0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a> (size_type delta)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawns a task that runs a function object. <a href="#c1145b00e063793a7e7bf994d202c7a0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#38274ab3f772ecba600c7daca7690102">grow_by</a> (size_type delta, const_reference t)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls. <a href="#a66b0020f7514b86d030fa8aea073d37"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7f4e3ae90811a5d8b597146b5b586d10"></a><!-- doxytag: member="tbb::flow::interface6::graph::root_task" ref="7f4e3ae90811a5d8b597146b5b586d10" args="()" -->
-<a class="el" href="a00337.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements using copying constructor. <a href="#38274ab3f772ecba600c7daca7690102"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#473a59a4c9308b93411b898b3110d26c">grow_by</a> (size_type delta, const_reference t)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the root task of the graph. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b028cb585ec21e5de523d0075d0fa880"></a><!-- doxytag: member="tbb::flow::interface6::graph::begin" ref="b028cb585ec21e5de523d0075d0fa880" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#b028cb585ec21e5de523d0075d0fa880">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Append minimal sequence of elements such that <a class="el" href="a00288.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n. <a href="#47fe588214dd5fa06ab6e8ab78d83874"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a> (size_type n)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a> (const_reference item) iterator push_back(const _reference item)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Push item. <a href="#e94e038f915c0268fdf2d3d7f87d81b8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a> (size_type index)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. <a href="#4c52f2950bb1832886bd4458eb09d7eb"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6fade5c732cc95274d1d8277ea619d1"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="c6fade5c732cc95274d1d8277ea619d1" args="(size_type index) const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a> (size_type index) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c073ca43e787c7cbf7b0e26d2221748"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="0c073ca43e787c7cbf7b0e26d2221748" args="(size_type index)" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#0c073ca43e787c7cbf7b0e26d2221748">at</a> (size_type index)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. Throws exceptions on errors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23e14a38af748edff96a7adc3a0f1c58"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="23e14a38af748edff96a7adc3a0f1c58" args="(size_type index) const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#23e14a38af748edff96a7adc3a0f1c58">at</a> (size_type index) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. Throws exceptions on errors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4c6ffff3bf08b92939aa2fc516edfba"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="a4c6ffff3bf08b92939aa2fc516edfba" args="(size_t grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a> (size_t grainsize=1)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for iterating with parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d09ccfb581b879ae64203741035e193"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="3d09ccfb581b879ae64203741035e193" args="(size_t grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#3d09ccfb581b879ae64203741035e193">range</a> (size_t grainsize=1) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for iterating with parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="715fe313c4a9c22731cc404dd80c9ec9"></a><!-- doxytag: member="tbb::concurrent_vector::size" ref="715fe313c4a9c22731cc404dd80c9ec9" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#715fe313c4a9c22731cc404dd80c9ec9">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return size of vector. It may include elements under construction. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6426cb93cf20d3af40f3c90f1f0481a"></a><!-- doxytag: member="tbb::concurrent_vector::empty" ref="c6426cb93cf20d3af40f3c90f1f0481a" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return false if vector is not empty or has elements under construction at least. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ed6b9ae7217af5103d974045b6f5cd5"></a><!-- doxytag: member="tbb::concurrent_vector::capacity" ref="3ed6b9ae7217af5103d974045b6f5cd5" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum size to which array can grow without allocating more memory. Concurrent allocations are not included in the value. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate enough space to grow to size n without having to allocate more memory later. <a href="#5a0ce05026994b010018f72cfdeb72c1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8dfb0cb0eef96d440b4dcf801807a718"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="8dfb0cb0eef96d440b4dcf801807a718" args="(size_type n)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector. Not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98ce6b2c6d2622f0c030b46dfac3880c"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="98ce6b2c6d2622f0c030b46dfac3880c" args="(size_type n, const_reference t)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a> (size_type n, const_reference t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector, copy t for new elements. Not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1693d1da41b1a8235871be9c6633be35"></a><!-- doxytag: member="tbb::concurrent_vector::compact" ref="1693d1da41b1a8235871be9c6633be35" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00288.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit()</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="03c6f4cf66532bf4cc907ee738a9a186"></a><!-- doxytag: member="tbb::concurrent_vector::shrink_to_fit" ref="03c6f4cf66532bf4cc907ee738a9a186" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Optimize memory usage and fragmentation. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c248a017f0576df3e7cd99627836fd6"></a><!-- doxytag: member="tbb::concurrent_vector::max_size" ref="2c248a017f0576df3e7cd99627836fd6" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#2c248a017f0576df3e7cd99627836fd6">max_size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on argument to reserve. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="730b23a251ecb6d37f692fb22f38e029"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="730b23a251ecb6d37f692fb22f38e029" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#730b23a251ecb6d37f692fb22f38e029">begin</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">start iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a167c62511ddacaa152daa64ab2d6aac"></a><!-- doxytag: member="tbb::flow::interface6::graph::end" ref="a167c62511ddacaa152daa64ab2d6aac" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#a167c62511ddacaa152daa64ab2d6aac">end</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c0b51160e5a764982ec97a455f94f2c6"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="c0b51160e5a764982ec97a455f94f2c6" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#c0b51160e5a764982ec97a455f94f2c6">end</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f63c3b7d03098b57fc16b71c57b303e5"></a><!-- doxytag: member="tbb::flow::interface6::graph::begin" ref="f63c3b7d03098b57fc16b71c57b303e5" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#f63c3b7d03098b57fc16b71c57b303e5">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78a06182276ff758788d4c0623ae0d71"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="78a06182276ff758788d4c0623ae0d71" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#78a06182276ff758788d4c0623ae0d71">begin</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="907bd06606818c36f52420fe8d469d35"></a><!-- doxytag: member="tbb::flow::interface6::graph::end" ref="907bd06606818c36f52420fe8d469d35" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#907bd06606818c36f52420fe8d469d35">end</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e6aa764ce5a1cbd24526f68bc0a2f6b"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="1e6aa764ce5a1cbd24526f68bc0a2f6b" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e183dfc3f89dc8f57c06ba165fb89f66"></a><!-- doxytag: member="tbb::flow::interface6::graph::cbegin" ref="e183dfc3f89dc8f57c06ba165fb89f66" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#e183dfc3f89dc8f57c06ba165fb89f66">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f88fcf1c920693c39bd9709db33c199f"></a><!-- doxytag: member="tbb::concurrent_vector::cbegin" ref="f88fcf1c920693c39bd9709db33c199f" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4866156e6a31d0399b61c6eb82ee81fd"></a><!-- doxytag: member="tbb::flow::interface6::graph::cend" ref="4866156e6a31d0399b61c6eb82ee81fd" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#4866156e6a31d0399b61c6eb82ee81fd">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c15a5d0f1cf75d687dabba07da1d46b"></a><!-- doxytag: member="tbb::concurrent_vector::cend" ref="0c15a5d0f1cf75d687dabba07da1d46b" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="227ea140dc2c68f79a4e5a34a8367b58"></a><!-- doxytag: member="tbb::flow::interface6::graph::is_cancelled" ref="227ea140dc2c68f79a4e5a34a8367b58" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#227ea140dc2c68f79a4e5a34a8367b58">is_cancelled</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e220926d09236d98f04fe0721e5f9a1"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="5e220926d09236d98f04fe0721e5f9a1" args="()" -->
+reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">return status of graph execution <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e48ff6b3b7433ce6ee2c2518b79d1a7c"></a><!-- doxytag: member="tbb::flow::interface6::graph::exception_thrown" ref="e48ff6b3b7433ce6ee2c2518b79d1a7c" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>exception_thrown</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="290119a4eb43cd6a9e98fa17016ba3c2"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="290119a4eb43cd6a9e98fa17016ba3c2" args="()" -->
+reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a> ()</td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9143fb4f732c36d5587e467e21a0e7f6"></a><!-- doxytag: member="tbb::flow::interface6::graph::graph_node" ref="9143fb4f732c36d5587e467e21a0e7f6" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>graph_node</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f9c103e18d5f212703805354074ad44"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="9f9c103e18d5f212703805354074ad44" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#9f9c103e18d5f212703805354074ad44">rbegin</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621c092f8466e55743ceef04b0bde9ce"></a><!-- doxytag: member="tbb::flow::interface6::graph::graph_iterator" ref="621c092f8466e55743ceef04b0bde9ce" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>graph_iterator</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d438b9b32ea3a8ffb703015b6dce055b"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="d438b9b32ea3a8ffb703015b6dce055b" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db78a1d28c9c966050e8a2926d834a33"></a><!-- doxytag: member="tbb::concurrent_vector::crbegin" ref="db78a1d28c9c966050e8a2926d834a33" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff9cece89438587997ebedf93c5e962"></a><!-- doxytag: member="tbb::concurrent_vector::crend" ref="fff9cece89438587997ebedf93c5e962" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#fff9cece89438587997ebedf93c5e962">crend</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15181759c0bfa2ddce5d10c7550e0002"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="15181759c0bfa2ddce5d10c7550e0002" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#15181759c0bfa2ddce5d10c7550e0002">front</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="502615a858eb9fa0390ee59169065e90"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="502615a858eb9fa0390ee59169065e90" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#502615a858eb9fa0390ee59169065e90">front</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item const <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41ce48d6015a1a2812d41cf620ec3476"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="41ce48d6015a1a2812d41cf620ec3476" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#41ce48d6015a1a2812d41cf620ec3476">back</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd518e204107d07fd08d0ec5bdfd383d"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="bd518e204107d07fd08d0ec5bdfd383d" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#bd518e204107d07fd08d0ec5bdfd383d">back</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item const <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fdba8e90de6a4d2300222236d46758e"></a><!-- doxytag: member="tbb::concurrent_vector::get_allocator" ref="2fdba8e90de6a4d2300222236d46758e" args="() const " -->
+allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="423e5aa15e0e3309ad86d026fd85f6f6"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="423e5aa15e0e3309ad86d026fd85f6f6" args="(size_type n, const_reference t)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a> (size_type n, const_reference t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">assign n items by copying t item <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="93a06b3112cb804f42f40efb5e7387b4"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="93a06b3112cb804f42f40efb5e7387b4" args="(I first, I last)" -->
+template<class I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00288.html#93a06b3112cb804f42f40efb5e7387b4">assign</a> (I first, I last)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">assign range [first, last) <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c04d64fe86696a084afa117d34384b5f"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="c04d64fe86696a084afa117d34384b5f" args="(std::initializer_list< T > init_list)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#c04d64fe86696a084afa117d34384b5f">assign</a> (std::initializer_list< T > init_list)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">assigns an initializer list <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c9c4bd968ed3edb8dd276854d2dae0"></a><!-- doxytag: member="tbb::concurrent_vector::swap" ref="96c9c4bd968ed3edb8dd276854d2dae0" args="(concurrent_vector &vector)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00288.html">concurrent_vector</a> &vector)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#26f937a359a66b6aae904c3cd9a3c444">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear container while keeping memory allocated. <a href="#26f937a359a66b6aae904c3cd9a3c444"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="da2444b28bb840d38f60d0030333a5fc"></a><!-- doxytag: member="tbb::concurrent_vector::~concurrent_vector" ref="da2444b28bb840d38f60d0030333a5fc" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear and destroy vector. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bb5ae659871478f1f5c68039e1273e12"></a><!-- doxytag: member="tbb::concurrent_vector::internal_vector_base" ref="bb5ae659871478f1f5c68039e1273e12" args="() const " -->
+const internal::concurrent_vector_base_v3 & </td><td class="memItemRight" valign="bottom"><b>internal_vector_base</b> () const </td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30086a58bff79a91103723be20916b96"></a><!-- doxytag: member="tbb::concurrent_vector::internal::vector_iterator" ref="30086a58bff79a91103723be20916b96" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::vector_iterator</b></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>run_and_put_task</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>run_task</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>internal_loop_guide</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception-aware helper class for filling a segment by exception-danger operators of user class. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The graph class.
+<h3>template<typename T, class A><br>
+ class tbb::concurrent_vector< T, A ></h3>
+
+Concurrent vector container.
<p>
-This class serves as a handle to the graph
+<a class="el" href="a00288.html">concurrent_vector</a> is a container having the following main properties:<ul>
+<li>It provides random indexed access to its elements. The index of the first element is 0.</li><li>It ensures safe concurrent growing its size (different threads can safely append new elements).</li><li>Adding new elements does not invalidate existing iterators and does not change indices of existing items.</li></ul>
+<p>
+<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements and Reversible Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1). But it doesn't meet Sequence Requirements due to absence of insert() and erase() methods.</dd></dl>
+<dl compact><dt><b>Exception Safety</b></dt><dd>Methods working with memory allocation and/or new elements construction can throw an exception if allocator fails to allocate memory or element's default constructor throws one. Concurrent vector's element of type T must conform to the following requirements:<ul>
+<li>Throwing an exception is forbidden for destructor of T.</li><li>Default constructor of T must not throw an exception OR its non-virtual destructor must safely work when its object memory is zero-initialized.</li></ul>
+Otherwise, the program's behavior is undefined. </dd></dl>
+<dl compact><dt><b></b></dt><dd>If an exception happens inside growth or assignment operation, an instance of the vector becomes invalid unless it is stated otherwise in the method documentation. Invalid state means:<ul>
+<li>There are no guarantees that all items were initialized by a constructor. The rest of items is zero-filled, including item where exception happens.</li><li>An invalid vector instance cannot be repaired; it is unable to grow anymore.</li><li>Size and capacity reported by the vector are incorrect, and calculated as if the failed operation were successful.</li><li>Attempt to access not allocated elements using operator[] or iterators results in access violation or segmentation fault exc [...]
+If a concurrent grow operation successfully completes, all the elements it has added to the vector will remain valid and accessible even if one of subsequent grow operations fails.</dd></dl>
+<dl compact><dt><b>Fragmentation</b></dt><dd>Unlike an STL vector, a <a class="el" href="a00288.html">concurrent_vector</a> does not move existing elements if it needs to allocate more memory. The container is divided into a series of contiguous arrays of elements. The first reservation, growth, or assignment operation determines the size of the first array. Using small number of elements as initial size incurs fragmentation that may increase element access time. Internal layout can be o [...]
+<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
+<li>Fixed guarantees of <a class="el" href="a00288.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00288.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00288.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00288.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a> to get the end [...]
+</dd></dl>
+<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
+<li>Implemented exception-safety guarantees</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Faster index calculation</li><li>First growth call specifies a number of segments to be merged in the first allocation.</li><li>Fixed memory blow up for swarm of vector's instances of small size</li><li>Added <a class="el" href="a00288.html#38274ab3f772ecba600c7daca7690102">grow_by(size_type n, const_reference t)</a> growth using copying const [...]
+</dd></dl>
+
<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="8a7d424c0616a1c37a908ead182e2fe5"></a><!-- doxytag: member="tbb::flow::interface6::graph::~graph" ref="8a7d424c0616a1c37a908ead182e2fe5" args="()" -->
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="26f937a359a66b6aae904c3cd9a3c444"></a><!-- doxytag: member="tbb::concurrent_vector::clear" ref="26f937a359a66b6aae904c3cd9a3c444" args="()" -->
<div class="memitem">
<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
<table class="memname">
<tr>
- <td class="memname">tbb::flow::interface6::graph::~graph </td>
+ <td class="memname">void <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::clear </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
@@ -137,20 +362,86 @@ This class serves as a handle to the graph
<div class="memdoc">
<p>
-Destroys the graph.
+Clear container while keeping memory allocated.
<p>
-Calls wait_for_all, then destroys the root task and context.
+To free up the memory, use in conjunction with method <a class="el" href="a00288.html#1693d1da41b1a8235871be9c6633be35">compact()</a>. Not thread safe
</div>
</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="29b85506870f13a884a21655aec2a65d"></a><!-- doxytag: member="tbb::flow::interface6::graph::decrement_wait_count" ref="29b85506870f13a884a21655aec2a65d" args="()" -->
+<a class="anchor" name="473a59a4c9308b93411b898b3110d26c"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="473a59a4c9308b93411b898b3110d26c" args="(size_type delta, const_reference t)" -->
<div class="memitem">
<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
<table class="memname">
<tr>
- <td class="memname">void tbb::flow::interface6::graph::decrement_wait_count </td>
+ <td class="memname">iterator <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
<td>(</td>
- <td class="paramname"> </td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>delta</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const_reference </td>
+ <td class="paramname"> <em>t</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns iterator pointing to the first new element.
+</div>
+</div><p>
+<a class="anchor" name="38274ab3f772ecba600c7daca7690102"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="38274ab3f772ecba600c7daca7690102" args="(size_type delta, const_reference t)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">size_type <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>delta</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const_reference </td>
+ <td class="paramname"> <em>t</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Grow by "delta" elements using copying constructor.
+<p>
+Returns old size.
+</div>
+</div><p>
+<a class="anchor" name="c8177b1865270ea68aa1ab9148e5e35e"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="c8177b1865270ea68aa1ab9148e5e35e" args="(size_type delta)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">iterator <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>delta</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -159,19 +450,20 @@ Calls wait_for_all, then destroys the root task and context.
<div class="memdoc">
<p>
-Deregisters an external entity that may have interacted with the graph.
-<p>
-The graph will not return from wait_for_all until all the number of decrement_wait_count calls matches the number of increment_wait_count calls.
+Returns iterator pointing to the first new element.
</div>
</div><p>
-<a class="anchor" name="a993b789d1e488e0c3929135beae560e"></a><!-- doxytag: member="tbb::flow::interface6::graph::increment_wait_count" ref="a993b789d1e488e0c3929135beae560e" args="()" -->
+<a class="anchor" name="30484e3959892fd5392fa93c873c31f0"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="30484e3959892fd5392fa93c873c31f0" args="(size_type delta)" -->
<div class="memitem">
<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
<table class="memname">
<tr>
- <td class="memname">void tbb::flow::interface6::graph::increment_wait_count </td>
+ <td class="memname">size_type <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
<td>(</td>
- <td class="paramname"> </td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>delta</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -180,22 +472,22 @@ The graph will not return from wait_for_all until all the number of decrement_wa
<div class="memdoc">
<p>
-Used to register that an external entity may still interact with the graph.
+Grow by "delta" elements.
<p>
-The graph will not return from wait_for_all until a matching number of decrement_wait_count calls is made.
+Returns old size.
</div>
</div><p>
-<a class="anchor" name="c1145b00e063793a7e7bf994d202c7a0"></a><!-- doxytag: member="tbb::flow::interface6::graph::run" ref="c1145b00e063793a7e7bf994d202c7a0" args="(Body body)" -->
+<a class="anchor" name="a7e3b67c8ccab16d0aecc80899ae799d"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="a7e3b67c8ccab16d0aecc80899ae799d" args="(size_type n)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename Body> </div>
+template<typename T, class A> </div>
<table class="memname">
<tr>
- <td class="memname">void tbb::flow::interface6::graph::run </td>
+ <td class="memname">iterator <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least </td>
<td>(</td>
- <td class="paramtype">Body </td>
- <td class="paramname"> <em>body</em> </td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>n</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -204,52 +496,92 @@ template<typename Body> </div>
<div class="memdoc">
<p>
-Spawns a task that runs a function object.
-<p>
-The task is spawned as a child of the graph. This is useful for running tasks that need to block a <a class="el" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all()</a> on the graph. For example a one-off source.
+The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads. Returns iterator that points to beginning of appended sequence. If no elements were appended, returns iterator pointing to nth element.
</div>
</div><p>
-<a class="anchor" name="50a7938df01b6148ab2c0696835f002e"></a><!-- doxytag: member="tbb::flow::interface6::graph::run" ref="50a7938df01b6148ab2c0696835f002e" args="(Receiver &r, Body body)" -->
+<a class="anchor" name="47fe588214dd5fa06ab6e8ab78d83874"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="47fe588214dd5fa06ab6e8ab78d83874" args="(size_type n)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename Receiver, typename Body> </div>
+template<typename T, class A> </div>
<table class="memname">
<tr>
- <td class="memname">void tbb::flow::interface6::graph::run </td>
+ <td class="memname">void <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least </td>
<td>(</td>
- <td class="paramtype">Receiver & </td>
- <td class="paramname"> <em>r</em>, </td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>n</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
</tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Append minimal sequence of elements such that <a class="el" href="a00288.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n.
+<p>
+The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads.
+</div>
+</div><p>
+<a class="anchor" name="4c52f2950bb1832886bd4458eb09d7eb"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="4c52f2950bb1832886bd4458eb09d7eb" args="(size_type index)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
<tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">Body </td>
- <td class="paramname"> <em>body</em></td><td> </td>
+ <td class="memname">reference <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>index</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
</tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Get reference to element at given index.
+<p>
+This method is thread-safe for concurrent reads, and also while growing the vector, as long as the calling thread has checked that index<<a class="el" href="a00288.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>.
+</div>
+</div><p>
+<a class="anchor" name="e94e038f915c0268fdf2d3d7f87d81b8"></a><!-- doxytag: member="tbb::concurrent_vector::push_back" ref="e94e038f915c0268fdf2d3d7f87d81b8" args="(const_reference item) iterator push_back(const _reference item)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
<tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ <td class="memname">size_type <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::push_back </td>
+ <td>(</td>
+ <td class="paramtype">const_reference </td>
+ <td class="paramname"> <em>item</em> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Spawns a task that runs a body and puts its output to a specific receiver.
+Push item.
<p>
-The task is spawned as a child of the graph. This is useful for running tasks that need to block a <a class="el" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all()</a> on the graph. For example a one-off source.
+Returns iterator pointing to the new element.
</div>
</div><p>
-<a class="anchor" name="a66b0020f7514b86d030fa8aea073d37"></a><!-- doxytag: member="tbb::flow::interface6::graph::wait_for_all" ref="a66b0020f7514b86d030fa8aea073d37" args="()" -->
+<a class="anchor" name="5a0ce05026994b010018f72cfdeb72c1"></a><!-- doxytag: member="tbb::concurrent_vector::reserve" ref="5a0ce05026994b010018f72cfdeb72c1" args="(size_type n)" -->
<div class="memitem">
<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
<table class="memname">
<tr>
- <td class="memname">void tbb::flow::interface6::graph::wait_for_all </td>
+ <td class="memname">void <a class="el" href="a00288.html">tbb::concurrent_vector</a>< T, A >::reserve </td>
<td>(</td>
- <td class="paramname"> </td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>n</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -258,16 +590,16 @@ The task is spawned as a child of the graph. This is useful for running tasks th
<div class="memdoc">
<p>
-Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls.
+Allocate enough space to grow to size n without having to allocate more memory later.
<p>
-The waiting thread will go off and steal work while it is block in the wait_for_all.
+Like most of the methods provided for STL compatibility, this method is *not* thread safe. The capacity afterwards may be bigger than the requested reservation.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>concurrent_vector.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00289.html b/doc/html/a00289.html
index 8fa3c46..9be621d 100644
--- a/doc/html/a00289.html
+++ b/doc/html/a00289.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::graph_node Class Reference</title>
+<title>tbb::flow::interface6::continue_msg Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,57 +21,23 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00289.html">graph_node</a></div>
-<h1>tbb::flow::interface6::graph_node Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::graph_node" -->The base of all graph nodes.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00289.html">continue_msg</a></div>
+<h1>tbb::flow::interface6::continue_msg Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::continue_msg" -->An empty class used for messages that mean "I'm done".
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::graph_node:
-<p><center><img src="a00289.png" usemap="#tbb::flow::interface6::graph_node_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::graph_node_map">
-<area href="a00262.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="511,56,1012,80">
-<area href="a00263.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="511,112,1012,136">
-<area href="a00278.html" alt="tbb::flow::interface6::continue_node< Output >" shape="rect" coords="511,168,1012,192">
-<area href="a00286.html" alt="tbb::flow::interface6::function_node< Input, Output,, Allocator >" shape="rect" coords="511,224,1012,248">
-<area href="a00287.html" alt="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >" shape="rect" coords="511,280,1012,304">
-<area href="a00292.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="511,336,1012,360">
-<area href="a00300.html" alt="tbb::flow::interface6::multifunction_node< Input, Output,, Allocator >" shape="rect" coords="511,392,1012,416">
-<area href="a00300.html" alt="tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator >" shape="rect" coords="511,448,1012,472">
-<area href="a00330.html" alt="tbb::flow::interface6::source_node< Output >" shape="rect" coords="511,504,1012,528">
-</map>
-<a href="a00060.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f3a9aad30268e2a9f1416eab325f7e5"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::graph_node" ref="4f3a9aad30268e2a9f1416eab325f7e5" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><b>graph_node</b> (<a class="el" href="a00288.html">graph</a> &g)</td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f51137fff91095fa3e6a736b71c27cc"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::my_graph" ref="6f51137fff91095fa3e6a736b71c27cc" args="" -->
-<a class="el" href="a00288.html">graph</a> & </td><td class="memItemRight" valign="bottom"><b>my_graph</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1ce68896f6d366dcc3fad19f6fd55d1"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::next" ref="d1ce68896f6d366dcc3fad19f6fd55d1" args="" -->
-<a class="el" href="a00289.html">graph_node</a> * </td><td class="memItemRight" valign="bottom"><b>next</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28049e438b241b0d6051767bbeacc0b9"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::prev" ref="28049e438b241b0d6051767bbeacc0b9" args="" -->
-<a class="el" href="a00289.html">graph_node</a> * </td><td class="memItemRight" valign="bottom"><b>prev</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="137c56ab53c02049fca0b78c49294314"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::graph" ref="137c56ab53c02049fca0b78c49294314" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>graph</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621c092f8466e55743ceef04b0bde9ce"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::graph_iterator" ref="621c092f8466e55743ceef04b0bde9ce" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>graph_iterator</b></td></tr>
-
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The base of all graph nodes.
+An empty class used for messages that mean "I'm done".
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00290.html b/doc/html/a00290.html
index 4e99ce7..db7254e 100644
--- a/doc/html/a00290.html
+++ b/doc/html/a00290.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::improper_lock Class Reference</title>
+<title>tbb::flow::interface6::continue_node< Output > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,27 +21,85 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00290.html">improper_lock</a></div>
-<h1>tbb::improper_lock Class Reference</h1><!-- doxytag: class="tbb::improper_lock" -->Exception for PPL locks.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00290.html">continue_node</a></div>
+<h1>tbb::flow::interface6::continue_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::continue_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->Implements an executable node that supports <a class="el" href="a00289.html">continue_msg</a> -> Output.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<a href="a00153.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::continue_node< Output >:
+<p><center><img src="a00290.png" usemap="#tbb::flow::interface6::continue_node< Output >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::continue_node< Output >_map">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,271,24">
+</map>
+<a href="a00070.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7a06613c9cda6f13a6010e7f2f8d0c23"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::input_type" ref="7a06613c9cda6f13a6010e7f2f8d0c23" args="" -->
+typedef <a class="el" href="a00289.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01b4d78a352cfb7d62b5ce2d1baa24f3"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::output_type" ref="01b4d78a352cfb7d62b5ce2d1baa24f3" args="" -->
+typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9ae7fda69d7d69c55cf8b57ae7b4b613"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::predecessor_type" ref="9ae7fda69d7d69c55cf8b57ae7b4b613" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< <a class="el" href="a00289.html">input_type</a> > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5a647a2b302232fe9a8f44940987f21"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::successor_type" ref="d5a647a2b302232fe9a8f44940987f21" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d189e966366f2cf0fb036df6db247e72"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::fInput_type" ref="d189e966366f2cf0fb036df6db247e72" args="" -->
+typedef internal::continue_input<<br>
+ Output > </td><td class="memItemRight" valign="bottom"><b>fInput_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="868190ed9818d1d23eb65c87689657d5"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::fOutput_type" ref="868190ed9818d1d23eb65c87689657d5" args="" -->
+typedef internal::function_output<<br>
+ output_type > </td><td class="memItemRight" valign="bottom"><b>fOutput_type</b></td></tr>
+
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74213c2d20407e1fa16b70ca55ef27c6"></a><!-- doxytag: member="tbb::improper_lock::what" ref="74213c2d20407e1fa16b70ca55ef27c6" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="2f200db877d2f80c08d09422e8bffd5a"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::continue_node" ref="2f200db877d2f80c08d09422e8bffd5a" args="(graph &g, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00290.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a> (<a class="el" href="a00300.html">graph</a> &g, Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for executable node with <a class="el" href="a00289.html">continue_msg</a> -> Output. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7817aebf22dd125ca04df53ac488d163"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::continue_node" ref="7817aebf22dd125ca04df53ac488d163" args="(graph &g, int number_of_predecessors, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00290.html#7817aebf22dd125ca04df53ac488d163">continue_node</a> (<a class="el" href="a00300.html">graph</a> &g, int number_of_predecessors, Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for executable node with <a class="el" href="a00289.html">continue_msg</a> -> Output. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="869562787fcb5c57a90aea120f26d492"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::continue_node" ref="869562787fcb5c57a90aea120f26d492" args="(const continue_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html#869562787fcb5c57a90aea120f26d492">continue_node</a> (const <a class="el" href="a00290.html">continue_node</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5291ce2b36a6a23d143c0bdf2a5f875"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::reset" ref="a5291ce2b36a6a23d143c0bdf2a5f875" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23d3b09e13e2dbc32a6308a821e8ba29"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::successors" ref="23d3b09e13e2dbc32a6308a821e8ba29" args="()" -->
+internal::broadcast_cache<<br>
+ output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621bab40a858d214db69ef08d88b67c1"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::run_and_put_task" ref="621bab40a858d214db69ef08d88b67c1" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>run_and_put_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4fa30d87bc0bfa80942f97a8d58f1bd"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::internal::broadcast_cache" ref="e4fa30d87bc0bfa80942f97a8d58f1bd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::broadcast_cache</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31ba00ea3e3e5a421b38840bd0dc2589"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::internal::round_robin_cache" ref="31ba00ea3e3e5a421b38840bd0dc2589" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::round_robin_cache</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for PPL locks.
+<h3>template<typename Output><br>
+ class tbb::flow::interface6::continue_node< Output ></h3>
+
+Implements an executable node that supports <a class="el" href="a00289.html">continue_msg</a> -> Output.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00278.png b/doc/html/a00290.png
similarity index 100%
copy from doc/html/a00278.png
copy to doc/html/a00290.png
diff --git a/doc/html/a00291.html b/doc/html/a00291.html
index 9bd2357..fbd027a 100644
--- a/doc/html/a00291.html
+++ b/doc/html/a00291.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::invalid_multiple_scheduling Class Reference</title>
+<title>tbb::flow::interface6::continue_receiver Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,27 +21,147 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00291.html">invalid_multiple_scheduling</a></div>
-<h1>tbb::invalid_multiple_scheduling Class Reference</h1><!-- doxytag: class="tbb::invalid_multiple_scheduling" -->Exception for repeated scheduling of the same task_handle.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00291.html">continue_receiver</a></div>
+<h1>tbb::flow::interface6::continue_receiver Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::continue_receiver" --><!-- doxytag: inherits="tbb::flow::interface6::receiver" -->Base class for receivers of completion messages.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<a href="a00156.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::continue_receiver:
+<p><center><img src="a00291.png" usemap="#tbb::flow::interface6::continue_receiver_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::continue_receiver_map">
+<area href="a00333.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="0,0,230,24">
+</map>
+<a href="a00057.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c43c166af832d9187035985841e0a7f"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::input_type" ref="3c43c166af832d9187035985841e0a7f" args="" -->
+typedef <a class="el" href="a00289.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#3c43c166af832d9187035985841e0a7f">input_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9c58b3e9c46afd2518d0fd8957a5a2f"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::predecessor_type" ref="f9c58b3e9c46afd2518d0fd8957a5a2f" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< <a class="el" href="a00289.html">continue_msg</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#f9c58b3e9c46afd2518d0fd8957a5a2f">predecessor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57082ccac880db17144db76c0f94701e"></a><!-- doxytag: member="tbb::invalid_multiple_scheduling::what" ref="57082ccac880db17144db76c0f94701e" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="177db82d548a1f8471371331890b91a8"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::continue_receiver" ref="177db82d548a1f8471371331890b91a8" args="(int number_of_predecessors=0)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#177db82d548a1f8471371331890b91a8">continue_receiver</a> (int number_of_predecessors=0)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0b292ed7fa6556b2a735f6d1e82dc74"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::continue_receiver" ref="a0b292ed7fa6556b2a735f6d1e82dc74" args="(const continue_receiver &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#a0b292ed7fa6556b2a735f6d1e82dc74">continue_receiver</a> (const <a class="el" href="a00291.html">continue_receiver</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e14828fa079b9835ff7267df5ee45d7"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::~continue_receiver" ref="1e14828fa079b9835ff7267df5ee45d7" args="()" -->
+virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fcfa4990a42417bbeb1f3c8b9ac8a22"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::register_predecessor" ref="2fcfa4990a42417bbeb1f3c8b9ac8a22" args="(predecessor_type &)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a> (<a class="el" href="a00339.html">predecessor_type</a> &)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Increments the trigger threshold. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a> (<a class="el" href="a00339.html">predecessor_type</a> &)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Decrements the trigger threshold. <a href="#cb691b18416d4742265aed84d496ebbd"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d376c9412b0b5953ee2f2705ba993589"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::try_put_task" ref="d376c9412b0b5953ee2f2705ba993589" args="(const input_type &)" -->
+<a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>try_put_task</b> (const <a class="el" href="a00289.html">input_type</a> &)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e884193748f7637fded5bda02e3b7a9d"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::reset_receiver" ref="e884193748f7637fded5bda02e3b7a9d" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset_receiver</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#2165b726212975be532cff7b2f001834">execute</a> ()=0</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Does whatever should happen when the threshold is reached. <a href="#2165b726212975be532cff7b2f001834"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7adfecde604fd68d9b0e1e6ae28d9783"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::is_continue_receiver" ref="7adfecde604fd68d9b0e1e6ae28d9783" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>is_continue_receiver</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5cddbd33109e94a68fb5457682a62110"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_mutex" ref="5cddbd33109e94a68fb5457682a62110" args="" -->
+<a class="el" href="a00343.html">spin_mutex</a> </td><td class="memItemRight" valign="bottom"><b>my_mutex</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="66df49f67e70e7f8e9831d0e362ba84c"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_predecessor_count" ref="66df49f67e70e7f8e9831d0e362ba84c" args="" -->
+int </td><td class="memItemRight" valign="bottom"><b>my_predecessor_count</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05fd1ce3c3fd7be3e74817b31fd2f068"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_current_count" ref="05fd1ce3c3fd7be3e74817b31fd2f068" args="" -->
+int </td><td class="memItemRight" valign="bottom"><b>my_current_count</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a0d4c3084fd13902c2d38f31c1dc232"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_initial_predecessor_count" ref="8a0d4c3084fd13902c2d38f31c1dc232" args="" -->
+int </td><td class="memItemRight" valign="bottom"><b>my_initial_predecessor_count</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621bab40a858d214db69ef08d88b67c1"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::run_and_put_task" ref="621bab40a858d214db69ef08d88b67c1" args="" -->
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">put item to successor; return task to run the successor if possible. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4fa30d87bc0bfa80942f97a8d58f1bd"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::internal::broadcast_cache" ref="e4fa30d87bc0bfa80942f97a8d58f1bd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::broadcast_cache</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31ba00ea3e3e5a421b38840bd0dc2589"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::internal::round_robin_cache" ref="31ba00ea3e3e5a421b38840bd0dc2589" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::round_robin_cache</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3b6d13039c2a8c1e369e5790895b0088"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::limiter_node" ref="3b6d13039c2a8c1e369e5790895b0088" args="" -->
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#3b6d13039c2a8c1e369e5790895b0088">limiter_node</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">put receiver back in initial state <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7e5acd3345f7903a0265a1ef9f3b66bc"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::internal::successor_cache" ref="7e5acd3345f7903a0265a1ef9f3b66bc" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::successor_cache</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for repeated scheduling of the same task_handle.
+Base class for receivers of completion messages.
+<p>
+These receivers automatically reset, but cannot be explicitly waited on
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="2165b726212975be532cff7b2f001834"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::execute" ref="2165b726212975be532cff7b2f001834" args="()=0" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual <a class="el" href="a00349.html">task</a>* tbb::flow::interface6::continue_receiver::execute </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [protected, pure virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Does whatever should happen when the threshold is reached.
+<p>
+This should be very fast or else spawn a task. This is called while the sender is blocked in the <a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put()</a>.
+</div>
+</div><p>
+<a class="anchor" name="cb691b18416d4742265aed84d496ebbd"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::remove_predecessor" ref="cb691b18416d4742265aed84d496ebbd" args="(predecessor_type &)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool tbb::flow::interface6::continue_receiver::remove_predecessor </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00339.html">predecessor_type</a> & </td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Decrements the trigger threshold.
<p>
+Does not check to see if the removal of the predecessor now makes the current count exceed the new threshold. So removing a predecessor while the graph is active can cause unexpected results.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00279.png b/doc/html/a00291.png
similarity index 100%
rename from doc/html/a00279.png
rename to doc/html/a00291.png
diff --git a/doc/html/a00292.html b/doc/html/a00292.html
index ec23c70..8e766df 100644
--- a/doc/html/a00292.html
+++ b/doc/html/a00292.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::limiter_node< T > Class Template Reference</title>
+<title>tbb::empty_task Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,120 +21,31 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00292.html">limiter_node</a></div>
-<h1>tbb::flow::interface6::limiter_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::limiter_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::receiver,tbb::flow::interface6::sender" -->Forwards messages only if the threshold has not been reached.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00292.html">empty_task</a></div>
+<h1>tbb::empty_task Class Reference<br>
+<small>
+[<a class="el" href="a00446.html">Task Scheduling</a>]</small>
+</h1><!-- doxytag: class="tbb::empty_task" --><!-- doxytag: inherits="tbb::task" -->task that does nothing. Useful for synchronization.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <task.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::limiter_node< T >:
-<p><center><img src="a00292.png" usemap="#tbb::flow::interface6::limiter_node< T >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::limiter_node< T >_map">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,226,24">
-<area href="a00321.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="236,0,462,24">
-<area href="a00327.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="472,0,698,24">
+<p>Inheritance diagram for tbb::empty_task:
+<p><center><img src="a00292.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
+<map name="tbb::empty_task_map">
+<area href="a00349.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
</map>
-<a href="a00077.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00136.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="035196d3c9240ef041f528ebcde8baa7"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::input_type" ref="035196d3c9240ef041f528ebcde8baa7" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#035196d3c9240ef041f528ebcde8baa7">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6e67fc480147c0b88a483b85db6457b0"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::output_type" ref="6e67fc480147c0b88a483b85db6457b0" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#6e67fc480147c0b88a483b85db6457b0">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f89fcf44f38eb33f965ee5362d3e68e9"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::predecessor_type" ref="f89fcf44f38eb33f965ee5362d3e68e9" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< <a class="el" href="a00292.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#f89fcf44f38eb33f965ee5362d3e68e9">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8945e4dd6ea759ff9e4735da13f12ef"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::successor_type" ref="e8945e4dd6ea759ff9e4735da13f12ef" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00292.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#e8945e4dd6ea759ff9e4735da13f12ef">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="831b06576f46fe2bf3ed0f86b793c1b2"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::limiter_node" ref="831b06576f46fe2bf3ed0f86b793c1b2" args="(graph &g, size_t threshold, int num_decrement_predecessors=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a> (<a class="el" href="a00288.html">graph</a> &g, size_t threshold, int num_decrement_predecessors=0)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83d3ab884543b070ee5b345a87f241fa"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::limiter_node" ref="83d3ab884543b070ee5b345a87f241fa" args="(const limiter_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#83d3ab884543b070ee5b345a87f241fa">limiter_node</a> (const <a class="el" href="a00292.html">limiter_node</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c76561d8d871b4769876988a4de12a9b"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::register_successor" ref="c76561d8d871b4769876988a4de12a9b" args="(receiver< output_type > &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#c76561d8d871b4769876988a4de12a9b">register_successor</a> (<a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00292.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Replace the current successor with this new successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#275e328063c121b3e506ccef2a825d28">remove_successor</a> (<a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00292.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <a href="#275e328063c121b3e506ccef2a825d28"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55a02d458a4d8ffa6accd7a70605da2f"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::try_put" ref="55a02d458a4d8ffa6accd7a70605da2f" args="(const T &t)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#55a02d458a4d8ffa6accd7a70605da2f">try_put</a> (const T &t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Puts an item to this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="de70a0e88ce7655d8c14b6af57f7496f"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::register_predecessor" ref="de70a0e88ce7655d8c14b6af57f7496f" args="(predecessor_type &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a> (<a class="el" href="a00327.html">predecessor_type</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes src from the list of cached predecessors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c530e7b469454e2340460795f2da3317"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::remove_predecessor" ref="c530e7b469454e2340460795f2da3317" args="(predecessor_type &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a> (<a class="el" href="a00327.html">predecessor_type</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes src from the list of cached predecessors. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3344b2461966631b6ee34b79fb105c7"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::decrement" ref="a3344b2461966631b6ee34b79fb105c7" args="" -->
-internal::decrementer< <a class="el" href="a00292.html">limiter_node</a><<br>
- T > > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">decrement</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The internal receiver< continue_msg > that decrements the count. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed05e0c262c5a8869bf1395e1fb4bcf9"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::internal::forward_task< limiter_node< T > >" ref="ed05e0c262c5a8869bf1395e1fb4bcf9" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::forward_task< limiter_node< T > ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b43677b60c786d1071a7efd6f195c3be"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::internal::decrementer< limiter_node< T > >" ref="b43677b60c786d1071a7efd6f195c3be" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::decrementer< limiter_node< T > ></b></td></tr>
-
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::flow::interface6::limiter_node< T ></h3>
-
-Forwards messages only if the threshold has not been reached.
+task that does nothing. Useful for synchronization.
<p>
-This node forwards items until its threshold is reached. It contains no buffering. If the downstream node rejects, the message is dropped.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="275e328063c121b3e506ccef2a825d28"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::remove_successor" ref="275e328063c121b3e506ccef2a825d28" args="(receiver< output_type > &r)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00292.html">tbb::flow::interface6::limiter_node</a>< T >::remove_successor </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00292.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > & </td>
- <td class="paramname"> <em>r</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Removes a successor from this node.
-<p>
-r.remove_predecessor(*this) is also called.
-<p>
-Implements <a class="el" href="a00327.html#82f363bfb1738bb8789e167590b10ef9">tbb::flow::interface6::sender< T ></a>.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>task.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00292.png b/doc/html/a00292.png
index 4eedec5..2fa6419 100644
Binary files a/doc/html/a00292.png and b/doc/html/a00292.png differ
diff --git a/doc/html/a00293.html b/doc/html/a00293.html
index 68f7f6b..c72ca8f 100644
--- a/doc/html/a00293.html
+++ b/doc/html/a00293.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::machine_load_store_relaxed< T, S > Struct Template Reference</title>
+<title>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,30 +21,174 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>internal</b>::<a class="el" href="a00293.html">machine_load_store_relaxed</a></div>
-<h1>tbb::internal::machine_load_store_relaxed< T, S > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::machine_load_store_relaxed" --><code>#include <<a class="el" href="a00640.html">tbb_machine.h</a>></code>
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00293.html">enumerable_thread_specific</a></div>
+<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference<br>
+<small>
+[<a class="el" href="a00442.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::interface6::enumerable_thread_specific" -->The <a class="el" href="a00293.html">enumerable_thread_specific</a> container.
+<a href="#_details">More...</a>
<p>
-<a href="a00170.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<code>#include <enumerable_thread_specific.h></code>
+<p>
+<a href="a00051.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="de10ed2fe8788773adb55f265db38587"></a><!-- doxytag: member="tbb::internal::machine_load_store_relaxed::load" ref="de10ed2fe8788773adb55f265db38587" args="(const volatile T &location)" -->
-static T </td><td class="memItemRight" valign="bottom"><b>load</b> (const volatile T &location)</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c03eb40955b933b01987222722ac4bd"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::allocator_type" ref="3c03eb40955b933b01987222722ac4bd" args="" -->
+typedef Allocator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Basic types. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e93f3b75e82eaa845cc1a0514eaba31a"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::value_type" ref="e93f3b75e82eaa845cc1a0514eaba31a" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0fd259a6b20641c768079f41d3213904"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::reference" ref="0fd259a6b20641c768079f41d3213904" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c1d47e24439524fea72d9c10df25d54"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_reference" ref="2c1d47e24439524fea72d9c10df25d54" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27cf20b87f4381a69203aed11e5a34dc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::pointer" ref="27cf20b87f4381a69203aed11e5a34dc" args="" -->
+typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e132e2a40dd6ce5472f8e13a1e80947"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_pointer" ref="0e132e2a40dd6ce5472f8e13a1e80947" args="" -->
+typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c67c208bec3e8b77190d545bd1f150e3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size_type" ref="c67c208bec3e8b77190d545bd1f150e3" args="" -->
+typedef internal_collection_type::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eda9be9a80bed094d4657948b5b7831f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::difference_type" ref="eda9be9a80bed094d4657948b5b7831f" args="" -->
+typedef internal_collection_type::difference_type </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd6f8e0af3c5e5166a4223f88b03e0a5"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::iterator" ref="bd6f8e0af3c5e5166a4223f88b03e0a5" args="" -->
+typedef internal::enumerable_thread_specific_iterator<<br>
+ <a class="el" href="a00288.html">internal_collection_type</a>,<br>
+ value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ff2ff1a117048f5d57aedebb12d57e1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_iterator" ref="8ff2ff1a117048f5d57aedebb12d57e1" args="" -->
+typedef internal::enumerable_thread_specific_iterator<<br>
+ <a class="el" href="a00288.html">internal_collection_type</a>,<br>
+ const value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d4c23a666adbf88bd3280873de9d7f39"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range_type" ref="d4c23a666adbf88bd3280873de9d7f39" args="" -->
+typedef generic_range_type<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ce41c6603d8f547f11df05d1ccb2184"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_range_type" ref="0ce41c6603d8f547f11df05d1ccb2184" args="" -->
+typedef generic_range_type<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0cfa3a5c8f2be3bbf313d93b1fa8cdb3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="0cfa3a5c8f2be3bbf313d93b1fa8cdb3" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor. Each local instance of T is default constructed. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8d4b456ff9d7b289c73254eccc11db45"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="8d4b456ff9d7b289c73254eccc11db45" args="(Finit finit)" -->
+template<typename Finit> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00293.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a> (Finit finit)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor with initializer functor. Each local instance of T is constructed by T(finit()). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bce6829981c9efe3f59cae2355e383e"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="7bce6829981c9efe3f59cae2355e383e" args="(const T &exemplar)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a> (const T &exemplar)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor with exemplar. Each local instance of T is copied-constructed from the exemplar. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7907d9e3e5b18e7a7b55211ef3213f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::~enumerable_thread_specific" ref="5a7907d9e3e5b18e7a7b55211ef3213f" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8d5265ccbd5e4485996b3f3baaa5ba1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="c8d5265ccbd5e4485996b3f3baaa5ba1" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">returns reference to local, discarding exists <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7dc79058d2832f7447de8e691c3455ea"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="7dc79058d2832f7447de8e691c3455ea" args="(bool &exists)" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#7dc79058d2832f7447de8e691c3455ea">local</a> (bool &exists)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns reference to calling thread's local copy, creating one if necessary. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="33fd6593da1ed14340f10f67d5a69130"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size" ref="33fd6593da1ed14340f10f67d5a69130" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#33fd6593da1ed14340f10f67d5a69130">size</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d72090653905a4c94aa6836bc190044"></a><!-- doxytag: member="tbb::internal::machine_load_store_relaxed::store" ref="1d72090653905a4c94aa6836bc190044" args="(volatile T &location, T value)" -->
-static void </td><td class="memItemRight" valign="bottom"><b>store</b> (volatile T &location, T value)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get the number of local copies. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72595886d0ac8fd0543f90038570510d"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::empty" ref="72595886d0ac8fd0543f90038570510d" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#72595886d0ac8fd0543f90038570510d">empty</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">true if there have been no local copies created <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01d7baf8e913ab2819e97917a2ac795f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="01d7baf8e913ab2819e97917a2ac795f" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#01d7baf8e913ab2819e97917a2ac795f">begin</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">begin iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2456ff88252fc921b01cd8907628a4ee"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="2456ff88252fc921b01cd8907628a4ee" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#2456ff88252fc921b01cd8907628a4ee">end</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84afb3906a39e399cde1c950d6351300"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="84afb3906a39e399cde1c950d6351300" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#84afb3906a39e399cde1c950d6351300">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">begin const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cb448bb4977ce366ceb7344085cc7050"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="cb448bb4977ce366ceb7344085cc7050" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#cb448bb4977ce366ceb7344085cc7050">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b22c54990b2362cd93c1a8f73de140bc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="b22c54990b2362cd93c1a8f73de140bc" args="(size_t grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#b22c54990b2362cd93c1a8f73de140bc">range</a> (size_t grainsize=1)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3b068000cf4dbf9b40f8bb7e3fc53e0b"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="3b068000cf4dbf9b40f8bb7e3fc53e0b" args="(size_t grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a> (size_t grainsize=1) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8764176d4b6014c5d65f1051851abc8"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::clear" ref="a8764176d4b6014c5d65f1051851abc8" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#a8764176d4b6014c5d65f1051851abc8">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys local copies. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="43bbf3a313c5431559df2946f76221e0"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="43bbf3a313c5431559df2946f76221e0" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
+template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00293.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="25a9c336cfd5a171c29cbdd0feb84249"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="25a9c336cfd5a171c29cbdd0feb84249" args="(const enumerable_thread_specific &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00293.html">enumerable_thread_specific</a> &other)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f8f467eb4c44c58614d0f9dce687477"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="1f8f467eb4c44c58614d0f9dce687477" args="(const enumerable_thread_specific &other)" -->
+<a class="el" href="a00293.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00293.html">enumerable_thread_specific</a> &other)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0e7ebbfd8e04eb22fe59b581206e7888"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="0e7ebbfd8e04eb22fe59b581206e7888" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
+template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00293.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00293.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1eac7eff6e21b7fc299b67acb36eb3c7"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine" ref="1eac7eff6e21b7fc299b67acb36eb3c7" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f671d7bd4c1d3a750b4be4c32a489c55"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine_each" ref="f671d7bd4c1d3a750b4be4c32a489c55" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45364b2f249ceb935cff05c29fcfcf5c"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="45364b2f249ceb935cff05c29fcfcf5c" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A generic range, used to create range objects from the iterators. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, size_t S><br>
- struct tbb::internal::machine_load_store_relaxed< T, S ></h3>
+<h3>template<typename T, typename Allocator = cache_aligned_allocator<T>, ets_key_usage_type ETS_key_type = ets_no_key><br>
+ class tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></h3>
+
+The <a class="el" href="a00293.html">enumerable_thread_specific</a> container.
+<p>
+<a class="el" href="a00293.html">enumerable_thread_specific</a> has the following properties:<ul>
+<li>thread-local copies are lazily created, with default, exemplar or function initialization.</li><li>thread-local copies do not move (during lifetime, and excepting <a class="el" href="a00293.html#a8764176d4b6014c5d65f1051851abc8">clear()</a>) so the address of a copy is invariant.</li><li>the contained objects need not have operator=() defined if combine is not used.</li><li><a class="el" href="a00293.html">enumerable_thread_specific</a> containers may be copy-constructed or assigned. [...]
+<p>
+<dl compact><dt><b>Segmented iterator</b></dt><dd>When the thread-local objects are containers with input_iterators defined, a segmented iterator may be used to iterate over all the elements of all thread-local copies.</dd></dl>
+<dl compact><dt><b>combine and combine_each</b></dt><dd><ul>
+<li>Both methods are defined for <a class="el" href="a00293.html">enumerable_thread_specific</a>.</li><li>combine() requires the the type T have operator=() defined.</li><li>neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)</li><li>Both are evaluated in serial context (the methods are assumed to be non-benign.) </li></ul>
+</dd></dl>
-Volatile should not incur any additional cost on IA32, Intel64, and Sparc TSO architectures. However on architectures with weak memory ordering compiler may generate code with acquire/release semantics for operations on volatile data.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00640.html">tbb_machine.h</a></ul>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li>enumerable_thread_specific.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00294.html b/doc/html/a00294.html
index 90ce8b2..a48e547 100644
--- a/doc/html/a00294.html
+++ b/doc/html/a00294.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::machine_load_store_seq_cst< T, 8 > Struct Template Reference</title>
+<title>tbb::filter Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,30 +21,213 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>internal</b>::<a class="el" href="a00294.html">machine_load_store_seq_cst< T, 8 ></a></div>
-<h1>tbb::internal::machine_load_store_seq_cst< T, 8 > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::machine_load_store_seq_cst< T, 8 >" --><code>#include <<a class="el" href="a00640.html">tbb_machine.h</a>></code>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00294.html">filter</a></div>
+<h1>tbb::filter Class Reference<br>
+<small>
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::filter" -->A stage in a pipeline.
+<a href="#_details">More...</a>
<p>
-<a href="a00169.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<code>#include <pipeline.h></code>
+<p>
+<p>Inheritance diagram for tbb::filter:
+<p><center><img src="a00294.png" usemap="#tbb::filter_map" border="0" alt=""></center>
+<map name="tbb::filter_map">
+<area href="a00361.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
+</map>
+<a href="a00107.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e765439a2cd7ddd871b20dc72148d600"></a><!-- doxytag: member="tbb::internal::machine_load_store_seq_cst< T, 8 >::load" ref="e765439a2cd7ddd871b20dc72148d600" args="(const volatile T &location)" -->
-static T </td><td class="memItemRight" valign="bottom"><b>load</b> (const volatile T &location)</td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcfec27656a69ff2072802ac001e936f"></a><!-- doxytag: member="tbb::filter::is_serial" ref="fcfec27656a69ff2072802ac001e936f" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#fcfec27656a69ff2072802ac001e936f">is_serial</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is serial. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd53206c4795ef2df5df26b795caf692"></a><!-- doxytag: member="tbb::filter::is_ordered" ref="cd53206c4795ef2df5df26b795caf692" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter must receive stream in order. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15c29cae5d237e6d63dbfe5c94af89d5"></a><!-- doxytag: member="tbb::filter::is_bound" ref="15c29cae5d237e6d63dbfe5c94af89d5" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is thread-bound. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ec4dfe053e94a2349d56781ddea8477"></a><!-- doxytag: member="tbb::filter::object_may_be_null" ref="8ec4dfe053e94a2349d56781ddea8477" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">true if an input filter can emit null <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a> (void *item)=0</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Operate on an item from the input stream, and return item for output stream. <a href="#fa1b3dc1f4f47563ccab7f4d92f5b543"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#66d159f362293e3964ba3da8bc1d2604">~filter</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy filter. <a href="#66d159f362293e3964ba3da8bc1d2604"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#56275eb889c77c4807967133e21401bd">finalize</a> (void *)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys item if pipeline was cancelled. <a href="#56275eb889c77c4807967133e21401bd"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1edba30e1e64e82ee4b7c6f227825817"></a><!-- doxytag: member="tbb::filter::x1" ref="1edba30e1e64e82ee4b7c6f227825817" args="((is_serial_?serial:parallel)|exact_exception_propagation))" -->
+ </td><td class="memItemRight" valign="bottom"><b>x1</b> ((is_serial_?serial:parallel)|<a class="el" href="a00294.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>))</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a06145c3e7ad273ece95eb8be642b0a2"></a><!-- doxytag: member="tbb::filter::prev_filter_in_pipeline" ref="a06145c3e7ad273ece95eb8be642b0a2" args="(not_in_pipeline())" -->
+ </td><td class="memItemRight" valign="bottom"><b>prev_filter_in_pipeline</b> (not_in_pipeline())</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7a54082a9165275bf7725970d756f132"></a><!-- doxytag: member="tbb::filter::my_pipeline" ref="7a54082a9165275bf7725970d756f132" args="(NULL)" -->
+ </td><td class="memItemRight" valign="bottom"><b>my_pipeline</b> (NULL)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d66d6e9e27b1be74fdb9c07f899d4837"></a><!-- doxytag: member="tbb::filter::next_segment" ref="d66d6e9e27b1be74fdb9c07f899d4837" args="(NULL)" -->
+ </td><td class="memItemRight" valign="bottom"><b>next_segment</b> (NULL)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3f49df3c34a3e5a8884001c30230a94"></a><!-- doxytag: member="tbb::filter::filter" ref="a3f49df3c34a3e5a8884001c30230a94" args="(mode filter_mode)" -->
+ </td><td class="memItemRight" valign="bottom"><b>filter</b> (mode filter_mode)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2b9c0dd8123a8186b46bc100d9469f5"></a><!-- doxytag: member="tbb::filter::set_end_of_input" ref="b2b9c0dd8123a8186b46bc100d9469f5" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set_end_of_input</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Static Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b7de3a76e744f3d9c1bc5d437ea851d"></a><!-- doxytag: member="tbb::filter::filter_is_serial" ref="4b7de3a76e744f3d9c1bc5d437ea851d" args="" -->
+static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> = 0x1</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The lowest bit 0 is for parallel vs. serial. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a> = 0x1<<4</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">4th bit distinguishes ordered vs unordered filters. <a href="#2e5eb65f95d8050186278077e433c5b1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd6a6e7210efc9bcaf2c5e08767d92b5"></a><!-- doxytag: member="tbb::filter::filter_is_bound" ref="dd6a6e7210efc9bcaf2c5e08767d92b5" args="" -->
+static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> = 0x1<<5</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">5th bit distinguishes thread-bound and regular filters. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bdd02a434a6e7499dd1e8f43aae96793"></a><!-- doxytag: member="tbb::filter::filter_may_emit_null" ref="bdd02a434a6e7499dd1e8f43aae96793" args="" -->
+static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> = 0x1<<6</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">6th bit marks input filters emitting small objects <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05fcfe2752cabb32ff9db4fbef59bb8b"></a><!-- doxytag: member="tbb::internal::machine_load_store_seq_cst< T, 8 >::store" ref="05fcfe2752cabb32ff9db4fbef59bb8b" args="(volatile T &location, T value)" -->
-static void </td><td class="memItemRight" valign="bottom"><b>store</b> (volatile T &location, T value)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">7th bit defines exception propagation mode expected by the application. <a href="#f17200974c33be21f42a5f00893de028"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::filter::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::filter::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b211ee58bada099e24280d478017cbff"></a><!-- doxytag: member="tbb::filter::pipeline" ref="b211ee58bada099e24280d478017cbff" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>pipeline</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::filter::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- struct tbb::internal::machine_load_store_seq_cst< T, 8 ></h3>
+A stage in a pipeline.
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="66d159f362293e3964ba3da8bc1d2604"></a><!-- doxytag: member="tbb::filter::~filter" ref="66d159f362293e3964ba3da8bc1d2604" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::filter::~filter </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroy filter.
+<p>
+If the filter was added to a pipeline, the pipeline must be destroyed first.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="56275eb889c77c4807967133e21401bd"></a><!-- doxytag: member="tbb::filter::finalize" ref="56275eb889c77c4807967133e21401bd" args="(void *)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void tbb::filter::finalize </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroys item if pipeline was cancelled.
+<p>
+Required to prevent memory leaks. Note it can be called concurrently even for serial filters.
+</div>
+</div><p>
+<a class="anchor" name="fa1b3dc1f4f47563ccab7f4d92f5b543"></a><!-- doxytag: member="tbb::filter::operator()" ref="fa1b3dc1f4f47563ccab7f4d92f5b543" args="(void *item)=0" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void* tbb::filter::operator() </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"> <em>item</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [pure virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-The implementation does not use functions __TBB_machine_load8/store8 as they are not required to be sequentially consistent.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00640.html">tbb_machine.h</a></ul>
+Operate on an item from the input stream, and return item for output stream.
+<p>
+Returns NULL if filter is a sink.
+</div>
+</div><p>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="f17200974c33be21f42a5f00893de028"></a><!-- doxytag: member="tbb::filter::exact_exception_propagation" ref="f17200974c33be21f42a5f00893de028" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const unsigned char <a class="el" href="a00294.html#f17200974c33be21f42a5f00893de028">tbb::filter::exact_exception_propagation</a><code> [static, protected]</code> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<b>Initial value:</b><div class="fragment"><pre class="fragment">
+<span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<span class="preprocessor"> 0x0</span>
+</pre></div>7th bit defines exception propagation mode expected by the application.
+<p>
+
+</div>
+</div><p>
+<a class="anchor" name="2e5eb65f95d8050186278077e433c5b1"></a><!-- doxytag: member="tbb::filter::filter_is_out_of_order" ref="2e5eb65f95d8050186278077e433c5b1" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const unsigned char <a class="el" href="a00294.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter::filter_is_out_of_order</a> = 0x1<<4<code> [static, protected]</code> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+4th bit distinguishes ordered vs unordered filters.
+<p>
+The bit was not set for parallel filters in TBB 2.1 and earlier, but <a class="el" href="a00294.html#cd53206c4795ef2df5df26b795caf692">is_ordered()</a> function always treats parallel filters as out of order.
+</div>
+</div><p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li>pipeline.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00282.png b/doc/html/a00294.png
similarity index 100%
copy from doc/html/a00282.png
copy to doc/html/a00294.png
diff --git a/doc/html/a00295.html b/doc/html/a00295.html
index c405804..a9696a8 100644
--- a/doc/html/a00295.html
+++ b/doc/html/a00295.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::memory_pool< Alloc > Class Template Reference</title>
+<title>tbb::interface6::filter_t< T, U > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,35 +21,53 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00295.html">memory_pool</a></div>
-<h1>tbb::interface6::memory_pool< Alloc > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::memory_pool" -->Thread-safe growable pool allocator for variable-size requests.
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00295.html">filter_t</a></div>
+<h1>tbb::interface6::filter_t< T, U > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::filter_t" -->Class representing a chain of type-safe pipeline filters.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00524.html">memory_pool.h</a>></code>
+<code>#include <pipeline.h></code>
<p>
-<a href="a00086.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00111.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2822528265718a4c779591fc37c02ca8"></a><!-- doxytag: member="tbb::interface6::memory_pool::memory_pool" ref="2822528265718a4c779591fc37c02ca8" args="(const Alloc &src=Alloc())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#2822528265718a4c779591fc37c02ca8">memory_pool</a> (const Alloc &src=Alloc())</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af1a36ca22e38eacd72eb256ee2ecef0"></a><!-- doxytag: member="tbb::interface6::filter_t::filter_t" ref="af1a36ca22e38eacd72eb256ee2ecef0" args="(const filter_t< T, U > &rhs)" -->
+ </td><td class="memItemRight" valign="bottom"><b>filter_t</b> (const <a class="el" href="a00295.html">filter_t</a>< T, U > &rhs)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">construct pool with underlying allocator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdad7c4ed08332ec384491a71b721957"></a><!-- doxytag: member="tbb::interface6::memory_pool::~memory_pool" ref="fdad7c4ed08332ec384491a71b721957" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#fdad7c4ed08332ec384491a71b721957">~memory_pool</a> ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="b80632a312f984a16b2a0db77859ee08"></a><!-- doxytag: member="tbb::interface6::filter_t::filter_t" ref="b80632a312f984a16b2a0db77859ee08" args="(tbb::filter::mode mode, const Body &body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>filter_t</b> (tbb::filter::mode mode, const Body &body)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d87c68b6beaff12dcec7231d96d7b4c"></a><!-- doxytag: member="tbb::interface6::filter_t::operator=" ref="2d87c68b6beaff12dcec7231d96d7b4c" args="(const filter_t< T, U > &rhs)" -->
+void </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00295.html">filter_t</a>< T, U > &rhs)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f299d149b932c2c78006c6f703b83eef"></a><!-- doxytag: member="tbb::interface6::filter_t::clear" ref="f299d149b932c2c78006c6f703b83eef" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff802cb5656e3788a89f3314aed2efe"></a><!-- doxytag: member="tbb::interface6::filter_t::internal::pipeline_proxy" ref="fff802cb5656e3788a89f3314aed2efe" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_proxy</b></td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="85c2892eff1fddcd06e28911e75838bd"></a><!-- doxytag: member="tbb::interface6::filter_t::make_filter" ref="85c2892eff1fddcd06e28911e75838bd" args="(tbb::filter::mode, const Body &)" -->
+template<typename T_, typename U_, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00295.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00295.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a> (tbb::filter::mode, const Body &)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Create a filter to participate in parallel_pipeline. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="6b9b1f5ce7f2121f093b8cd1d84707ad"></a><!-- doxytag: member="tbb::interface6::filter_t::operator &" ref="6b9b1f5ce7f2121f093b8cd1d84707ad" args="(const filter_t< T_, V_ > &, const filter_t< V_, U_ > &)" -->
+template<typename T_, typename V_, typename U_> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00295.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>operator &</b> (const <a class="el" href="a00295.html">filter_t</a>< T_, V_ > &, const <a class="el" href="a00295.html">filter_t</a>< V_, U_ > &)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">destroy pool <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Alloc><br>
- class tbb::interface6::memory_pool< Alloc ></h3>
+<h3>template<typename T, typename U><br>
+ class tbb::interface6::filter_t< T, U ></h3>
-Thread-safe growable pool allocator for variable-size requests.
+Class representing a chain of type-safe pipeline filters.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00524.html">memory_pool.h</a></ul>
+<li>pipeline.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00296.html b/doc/html/a00296.html
index 2edbf1f..e8bd2f9 100644
--- a/doc/html/a00296.html
+++ b/doc/html/a00296.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::memory_pool_allocator< T, P > Class Template Reference</title>
+<title>tbb::final_scan_tag Struct Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,109 +21,30 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00296.html">memory_pool_allocator</a></div>
-<h1>tbb::interface6::memory_pool_allocator< T, P > Class Template Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00296.html">final_scan_tag</a></div>
+<h1>tbb::final_scan_tag Struct Reference<br>
<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::interface6::memory_pool_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::final_scan_tag" -->Used to indicate that the final scan is being performed.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00524.html">memory_pool.h</a>></code>
+<code>#include <parallel_scan.h></code>
<p>
-<a href="a00082.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00099.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="364d1a4b2174091802a0c1a7177fd037"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::value_type" ref="364d1a4b2174091802a0c1a7177fd037" args="" -->
-typedef tbb::internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="841174744c7bebbe9a8ec4cd35b7e8c8"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::pointer" ref="841174744c7bebbe9a8ec4cd35b7e8c8" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8867631698ca08b5b8c849693f45cef4"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::const_pointer" ref="8867631698ca08b5b8c849693f45cef4" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4419d14b95793fea5e80c1a7ad85b4b3"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::reference" ref="4419d14b95793fea5e80c1a7ad85b4b3" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57a51cd687993c94d486a0ff0b7a783f"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::const_reference" ref="57a51cd687993c94d486a0ff0b7a783f" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fd9f0aaee1039cc64fa4342ee93fd43e"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::size_type" ref="fd9f0aaee1039cc64fa4342ee93fd43e" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4340f60415582d0eca834b47b22f5d62"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::difference_type" ref="4340f60415582d0eca834b47b22f5d62" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d06264c6dc8ed178d8c14998f0511b27"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="d06264c6dc8ed178d8c14998f0511b27" args="(pool_type &pool)" -->
- </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (pool_type &pool) throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="655f7aef5ba5dbe79f76b493270794af"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="655f7aef5ba5dbe79f76b493270794af" args="(const memory_pool_allocator &src)" -->
- </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00296.html">memory_pool_allocator</a> &src) throw ()</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0d1d98389a82d65a4229db8e28363420"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="0d1d98389a82d65a4229db8e28363420" args="(const memory_pool_allocator< U, P > &src)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00296.html">memory_pool_allocator</a>< U, P > &src) throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="727129bc029510733b3e95ea10f6bee3"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::address" ref="727129bc029510733b3e95ea10f6bee3" args="(reference x) const " -->
-pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e250b83998b01dbea88c43085e15139a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::address" ref="e250b83998b01dbea88c43085e15139a" args="(const_reference x) const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="365bd64d284c80d85bb2149a12681526"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::allocate" ref="365bd64d284c80d85bb2149a12681526" args="(size_type n, const void *=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#365bd64d284c80d85bb2149a12681526">allocate</a> (size_type n, const void *=0)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4e24a03de38638af07548383024c54ab"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::deallocate" ref="4e24a03de38638af07548383024c54ab" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#4e24a03de38638af07548383024c54ab">deallocate</a> (pointer p, size_type)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="beebdb6144df8ba219fadfad4de866ea"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::max_size" ref="beebdb6144df8ba219fadfad4de866ea" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#beebdb6144df8ba219fadfad4de866ea">max_size</a> () const throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="3491a81e0597c1696a163e7c8fa8706a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::construct" ref="3491a81e0597c1696a163e7c8fa8706a" args="(pointer p, Args &&...args)" -->
-template<typename... Args> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00296.html#3491a81e0597c1696a163e7c8fa8706a">construct</a> (pointer p, Args &&...args)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b9b545d2d31ef4b711ca87ba7aa18976"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::pool_type" ref="b9b545d2d31ef4b711ca87ba7aa18976" args="" -->
-typedef P </td><td class="memItemRight" valign="bottom"><b>pool_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f22e947018eb99cde5f44ee3d339499"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::my_pool" ref="9f22e947018eb99cde5f44ee3d339499" args="" -->
-pool_type * </td><td class="memItemRight" valign="bottom"><b>my_pool</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="193c7eeb6ed852d587b652828f52ca92"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="193c7eeb6ed852d587b652828f52ca92" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b></td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f4fe0fa75b911081eff469ddb3e7e52a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::operator==" ref="f4fe0fa75b911081eff469ddb3e7e52a" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
-template<typename V, typename U, typename R> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00296.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00296.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4bb06a39de4a5290b4ec03be19d61c36"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::operator!=" ref="4bb06a39de4a5290b4ec03be19d61c36" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
-template<typename V, typename U, typename R> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00296.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00296.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06888e4a548788fcb2c15542d428d8c9"></a><!-- doxytag: member="tbb::final_scan_tag::is_final_scan" ref="06888e4a548788fcb2c15542d428d8c9" args="()" -->
+static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename P = internal::pool_base><br>
- class tbb::interface6::memory_pool_allocator< T, P ></h3>
-
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
+Used to indicate that the final scan is being performed.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00524.html">memory_pool.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li>parallel_scan.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00297.html b/doc/html/a00297.html
index afd1246..9a53f20 100644
--- a/doc/html/a00297.html
+++ b/doc/html/a00297.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::memory_pool_allocator< void, P > Class Template Reference</title>
+<title>tbb::interface6::flow_control Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,72 +21,31 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00297.html">memory_pool_allocator< void, P ></a></div>
-<h1>tbb::interface6::memory_pool_allocator< void, P > Class Template Reference<br>
-<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::interface6::memory_pool_allocator< void, P >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00297.html">flow_control</a></div>
+<h1>tbb::interface6::flow_control Class Reference</h1><!-- doxytag: class="tbb::interface6::flow_control" -->input_filter control to signal end-of-input for parallel_pipeline
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00524.html">memory_pool.h</a>></code>
+<code>#include <pipeline.h></code>
<p>
-<a href="a00084.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00110.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7cc2e35b1d34d0543b5a029414ef41f8"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::pool_type" ref="7cc2e35b1d34d0543b5a029414ef41f8" args="" -->
-typedef P </td><td class="memItemRight" valign="bottom"><b>pool_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48afbf9aed30662f09217c1fe229861d"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::pointer" ref="48afbf9aed30662f09217c1fe229861d" args="" -->
-typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="94ac6954c897981fc8adf6bf5978145b"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::const_pointer" ref="94ac6954c897981fc8adf6bf5978145b" args="" -->
-typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2b9b8af832a8b240cf22c5cc37406f45"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::value_type" ref="2b9b8af832a8b240cf22c5cc37406f45" args="" -->
-typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1601367c80ed73278e1234012631df24"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="1601367c80ed73278e1234012631df24" args="(pool_type &pool)" -->
- </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (pool_type &pool) throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4ce5d3f231c9e786aee8f64d53c7f1a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="e4ce5d3f231c9e786aee8f64d53c7f1a" args="(const memory_pool_allocator &src)" -->
- </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00296.html">memory_pool_allocator</a> &src) throw ()</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="49bd821cb72e23714d7efc480ac4cc9d"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="49bd821cb72e23714d7efc480ac4cc9d" args="(const memory_pool_allocator< U, P > &src)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00296.html">memory_pool_allocator</a>< U, P > &src) throw ()</td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67b8e6e057db62e7fdbe985ce275b039"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::my_pool" ref="67b8e6e057db62e7fdbe985ce275b039" args="" -->
-pool_type * </td><td class="memItemRight" valign="bottom"><b>my_pool</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b2c7123577587e3c26506db3e5abe62"></a><!-- doxytag: member="tbb::interface6::flow_control::stop" ref="4b2c7123577587e3c26506db3e5abe62" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>stop</b> ()</td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="193c7eeb6ed852d587b652828f52ca92"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="193c7eeb6ed852d587b652828f52ca92" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b></td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f4fe0fa75b911081eff469ddb3e7e52a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::operator==" ref="f4fe0fa75b911081eff469ddb3e7e52a" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
-template<typename V, typename U, typename R> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00296.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00296.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4bb06a39de4a5290b4ec03be19d61c36"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::operator!=" ref="4bb06a39de4a5290b4ec03be19d61c36" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
-template<typename V, typename U, typename R> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00296.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00296.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15bb80e25fbcc4213e0053d558df6462"></a><!-- doxytag: member="tbb::interface6::flow_control::internal::concrete_filter" ref="15bb80e25fbcc4213e0053d558df6462" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concrete_filter</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename P><br>
- class tbb::interface6::memory_pool_allocator< void, P ></h3>
-
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+input_filter control to signal end-of-input for parallel_pipeline
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00524.html">memory_pool.h</a></ul>
+<li>pipeline.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00298.html b/doc/html/a00298.html
index d8e0333..4356801 100644
--- a/doc/html/a00298.html
+++ b/doc/html/a00298.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::missing_wait Class Reference</title>
+<title>tbb::flow::interface6::function_node< Input, Output,, Allocator > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,27 +21,81 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00298.html">missing_wait</a></div>
-<h1>tbb::missing_wait Class Reference</h1><!-- doxytag: class="tbb::missing_wait" -->Exception for missing wait on structured_task_group.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00298.html">function_node</a></div>
+<h1>tbb::flow::interface6::function_node< Input, Output,, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::function_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->Implements a function node that supports Input -> Output.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<a href="a00155.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::function_node< Input, Output,, Allocator >:
+<p><center><img src="a00298.png" usemap="#tbb::flow::interface6::function_node< Input, Output,, Allocator >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::function_node< Input, Output,, Allocator >_map">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,368,24">
+</map>
+<a href="a00064.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eed5be58daf252aebed0df276ef9829b"></a><!-- doxytag: member="tbb::flow::interface6::function_node::input_type" ref="eed5be58daf252aebed0df276ef9829b" args="" -->
+typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a6b1ada4ae95bcc11f3ecc7d8b407038"></a><!-- doxytag: member="tbb::flow::interface6::function_node::output_type" ref="a6b1ada4ae95bcc11f3ecc7d8b407038" args="" -->
+typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bffd3b755433095325cc554ea2ae752"></a><!-- doxytag: member="tbb::flow::interface6::function_node::predecessor_type" ref="7bffd3b755433095325cc554ea2ae752" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< input_type > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c24f9bbb872a81053cea4f38e214f458"></a><!-- doxytag: member="tbb::flow::interface6::function_node::successor_type" ref="c24f9bbb872a81053cea4f38e214f458" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ad406125e6938567d61b5b7ad7039a0"></a><!-- doxytag: member="tbb::flow::interface6::function_node::fInput_type" ref="3ad406125e6938567d61b5b7ad7039a0" args="" -->
+typedef internal::function_input<<br>
+ input_type, output_type,<br>
+ Allocator > </td><td class="memItemRight" valign="bottom"><b>fInput_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6bde48df8336f0bdc4fbb8c1879e13d6"></a><!-- doxytag: member="tbb::flow::interface6::function_node::fOutput_type" ref="6bde48df8336f0bdc4fbb8c1879e13d6" args="" -->
+typedef internal::function_output<<br>
+ output_type > </td><td class="memItemRight" valign="bottom"><b>fOutput_type</b></td></tr>
+
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe3f8527f9013266dc845a4ff22dd2cf"></a><!-- doxytag: member="tbb::missing_wait::what" ref="fe3f8527f9013266dc845a4ff22dd2cf" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5c215b40e3daf73d1c6802ecb5aded6c"></a><!-- doxytag: member="tbb::flow::interface6::function_node::function_node" ref="5c215b40e3daf73d1c6802ecb5aded6c" args="(graph &g, size_t concurrency, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00298.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a> (<a class="el" href="a00300.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5132323fd2ac6a00ea0c78beda78723"></a><!-- doxytag: member="tbb::flow::interface6::function_node::function_node" ref="d5132323fd2ac6a00ea0c78beda78723" args="(const function_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#d5132323fd2ac6a00ea0c78beda78723">function_node</a> (const <a class="el" href="a00298.html">function_node</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a2f67f16e52b111e33365120f47d094c"></a><!-- doxytag: member="tbb::flow::interface6::function_node::reset" ref="a2f67f16e52b111e33365120f47d094c" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ffad8dcf70ebebc751dcf2c82cd5e1ad"></a><!-- doxytag: member="tbb::flow::interface6::function_node::successors" ref="ffad8dcf70ebebc751dcf2c82cd5e1ad" args="()" -->
+internal::broadcast_cache<<br>
+ output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621bab40a858d214db69ef08d88b67c1"></a><!-- doxytag: member="tbb::flow::interface6::function_node::run_and_put_task" ref="621bab40a858d214db69ef08d88b67c1" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>run_and_put_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4fa30d87bc0bfa80942f97a8d58f1bd"></a><!-- doxytag: member="tbb::flow::interface6::function_node::internal::broadcast_cache" ref="e4fa30d87bc0bfa80942f97a8d58f1bd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::broadcast_cache</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31ba00ea3e3e5a421b38840bd0dc2589"></a><!-- doxytag: member="tbb::flow::interface6::function_node::internal::round_robin_cache" ref="31ba00ea3e3e5a421b38840bd0dc2589" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::round_robin_cache</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for missing wait on structured_task_group.
+<h3>template<typename Input, typename Output = continue_msg, graph_buffer_policy = queueing, typename Allocator = cache_aligned_allocator<Input>><br>
+ class tbb::flow::interface6::function_node< Input, Output,, Allocator ></h3>
+
+Implements a function node that supports Input -> Output.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00286.png b/doc/html/a00298.png
similarity index 100%
rename from doc/html/a00286.png
rename to doc/html/a00298.png
diff --git a/doc/html/a00299.html b/doc/html/a00299.html
index b081baf..c632e00 100644
--- a/doc/html/a00299.html
+++ b/doc/html/a00299.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::movable_exception< ExceptionData > Class Template Reference</title>
+<title>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,148 +21,85 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00299.html">movable_exception</a></div>
-<h1>tbb::movable_exception< ExceptionData > Class Template Reference</h1><!-- doxytag: class="tbb::movable_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00299.html">function_node< Input, Output, queueing, Allocator ></a></div>
+<h1>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->Implements a function node that supports Input -> Output.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<p>Inheritance diagram for tbb::movable_exception< ExceptionData >:
-<p><center><img src="a00299.png" usemap="#tbb::movable_exception< ExceptionData >_map" border="0" alt=""></center>
-<map name="tbb::movable_exception< ExceptionData >_map">
-<area href="a00345.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,248,24">
+<p>Inheritance diagram for tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >:
+<p><center><img src="a00299.png" usemap="#tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >_map">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,424,24">
</map>
-<a href="a00159.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00065.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="43dfdc5298df3aa8a7d7d146604f84ef"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="43dfdc5298df3aa8a7d7d146604f84ef" args="(const ExceptionData &data_)" -->
- </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const ExceptionData &data_)</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2d8e92791b85100f8a53f7b2335c60c"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::input_type" ref="d2d8e92791b85100f8a53f7b2335c60c" args="" -->
+typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48f97fbf1e5d66c5977891f4375ee4d9"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="48f97fbf1e5d66c5977891f4375ee4d9" args="(const movable_exception &src)" -->
- </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const <a class="el" href="a00299.html">movable_exception</a> &src) throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="df1b2d30d065b64efcee71021129760a"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::output_type" ref="df1b2d30d065b64efcee71021129760a" args="" -->
+typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dfafefe27f2afaa7c7894ca9c71cc568"></a><!-- doxytag: member="tbb::movable_exception::operator=" ref="dfafefe27f2afaa7c7894ca9c71cc568" args="(const movable_exception &src)" -->
-const <a class="el" href="a00299.html">movable_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00299.html">movable_exception</a> &src)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8d8519eb42d5ddbba668a575b24a720a"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::predecessor_type" ref="8d8519eb42d5ddbba668a575b24a720a" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< input_type > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="47114cbc20c8e13cac3108749a3e085d"></a><!-- doxytag: member="tbb::movable_exception::data" ref="47114cbc20c8e13cac3108749a3e085d" args="()" -->
-ExceptionData & </td><td class="memItemRight" valign="bottom"><b>data</b> () throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb82369d652cd58b169f9a2e8f7ed023"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::successor_type" ref="eb82369d652cd58b169f9a2e8f7ed023" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7d93c000d862d2558efd9a34817adbce"></a><!-- doxytag: member="tbb::movable_exception::data" ref="7d93c000d862d2558efd9a34817adbce" args="() const " -->
-const ExceptionData & </td><td class="memItemRight" valign="bottom"><b>data</b> () const throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6083108a1ca5a4f1464511e378e4bedf"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::fInput_type" ref="6083108a1ca5a4f1464511e378e4bedf" args="" -->
+typedef internal::function_input<<br>
+ input_type, output_type,<br>
+ Allocator > </td><td class="memItemRight" valign="bottom"><b>fInput_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc5f5c4739b17ac5211ac58226c2f5a5"></a><!-- doxytag: member="tbb::movable_exception::name" ref="bc5f5c4739b17ac5211ac58226c2f5a5" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4259f2853fb3af09518df3efb44ed8d5"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::queue_type" ref="4259f2853fb3af09518df3efb44ed8d5" args="" -->
+typedef internal::function_input_queue<<br>
+ input_type, Allocator > </td><td class="memItemRight" valign="bottom"><b>queue_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b33a89bccf0c63106f1270c7bfaaf54f"></a><!-- doxytag: member="tbb::movable_exception::what" ref="b33a89bccf0c63106f1270c7bfaaf54f" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="431ce7232e788562d9152493961ee4b9"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::fOutput_type" ref="431ce7232e788562d9152493961ee4b9" args="" -->
+typedef internal::function_output<<br>
+ output_type > </td><td class="memItemRight" valign="bottom"><b>fOutput_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00299.html#b33a89bccf0c63106f1270c7bfaaf54f">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00299.html">movable_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5b9019c1e6e9b2c41c986a384bd179db"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::function_node" ref="5b9019c1e6e9b2c41c986a384bd179db" args="(graph &g, size_t concurrency, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00299.html#5b9019c1e6e9b2c41c986a384bd179db">function_node</a> (<a class="el" href="a00300.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object. <a href="#1aea0ad179d6f0481fe7f3495f66adf9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01055081ed477714503820035db3a965"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::function_node" ref="01055081ed477714503820035db3a965" args="(const function_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#01055081ed477714503820035db3a965">function_node</a> (const <a class="el" href="a00298.html">function_node</a> &src)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">move()</a> method. <a href="#7a46873119d9f85a7b0009c13e41a258"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#17cffba35811c92b7e65d63506b69602">throw_self</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c8cf2a4fe8786e1d544fd987e142e47"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::reset" ref="8c8cf2a4fe8786e1d544fd987e142e47" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object. <a href="#17cffba35811c92b7e65d63506b69602"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8c0ae2089ae784b28907cf748b89416"></a><!-- doxytag: member="tbb::movable_exception::my_exception_data" ref="a8c0ae2089ae784b28907cf748b89416" args="" -->
-ExceptionData </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34125123f0c8d9c13dbd6f52148608a1"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::successors" ref="34125123f0c8d9c13dbd6f52148608a1" args="()" -->
+internal::broadcast_cache<<br>
+ output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">User data. <br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename ExceptionData><br>
- class tbb::movable_exception< ExceptionData ></h3>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621bab40a858d214db69ef08d88b67c1"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::run_and_put_task" ref="621bab40a858d214db69ef08d88b67c1" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>run_and_put_task</b></td></tr>
-Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread.
-<p>
-Code using TBB can instantiate this template with an arbitrary ExceptionData type and throw this exception object. Such exceptions are intercepted by the TBB scheduler and delivered to the root thread (). <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00345.html">tbb::tbb_exception</a> </dd></dl>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4fa30d87bc0bfa80942f97a8d58f1bd"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::internal::broadcast_cache" ref="e4fa30d87bc0bfa80942f97a8d58f1bd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::broadcast_cache</b></td></tr>
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="7a46873119d9f85a7b0009c13e41a258"></a><!-- doxytag: member="tbb::movable_exception::destroy" ref="7a46873119d9f85a7b0009c13e41a258" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename ExceptionData> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00299.html">tbb::movable_exception</a>< ExceptionData >::destroy </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31ba00ea3e3e5a421b38840bd0dc2589"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::internal::round_robin_cache" ref="31ba00ea3e3e5a421b38840bd0dc2589" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::round_robin_cache</b></td></tr>
-<p>
-Destroys objects created by the <a class="el" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">move()</a> method.
-<p>
-Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
-<p>
-Implements <a class="el" href="a00345.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="1aea0ad179d6f0481fe7f3495f66adf9"></a><!-- doxytag: member="tbb::movable_exception::move" ref="1aea0ad179d6f0481fe7f3495f66adf9" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename ExceptionData> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00299.html">movable_exception</a>* <a class="el" href="a00299.html">tbb::movable_exception</a>< ExceptionData >::move </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Creates and returns pointer to the deep copy of this exception object.
-<p>
-Move semantics is allowed.
-<p>
-Implements <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="17cffba35811c92b7e65d63506b69602"></a><!-- doxytag: member="tbb::movable_exception::throw_self" ref="17cffba35811c92b7e65d63506b69602" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename ExceptionData> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00299.html">tbb::movable_exception</a>< ExceptionData >::throw_self </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<typename Input, typename Output, typename Allocator><br>
+ class tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></h3>
+Implements a function node that supports Input -> Output.
<p>
-Throws this exception object.
-<p>
-Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
-<p>
-Implements <a class="el" href="a00345.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00299.png b/doc/html/a00299.png
index a85d170..349b919 100644
Binary files a/doc/html/a00299.png and b/doc/html/a00299.png differ
diff --git a/doc/html/a00300.html b/doc/html/a00300.html
index 38a6f25..5e8206f 100644
--- a/doc/html/a00300.html
+++ b/doc/html/a00300.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::multifunction_node< Input, Output,, Allocator > Class Template Reference</title>
+<title>tbb::flow::interface6::graph Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,48 +21,256 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00300.html">multifunction_node</a></div>
-<h1>tbb::flow::interface6::multifunction_node< Input, Output,, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::multifunction_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->implements a function node that supports Input -> (set of outputs)
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00300.html">graph</a></div>
+<h1>tbb::flow::interface6::graph Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::graph" -->The graph class.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::multifunction_node< Input, Output,, Allocator >:
-<p><center><img src="a00300.png" usemap="#tbb::flow::interface6::multifunction_node< Input, Output,, Allocator >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::multifunction_node< Input, Output,, Allocator >_map">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,393,24">
-</map>
-<a href="a00064.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00059.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f8f076085598fc5687fdc00d7756ad4"></a><!-- doxytag: member="tbb::flow::interface6::multifunction_node::input_type" ref="9f8f076085598fc5687fdc00d7756ad4" args="" -->
-typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec5db0443a1320850f8fa05b5eed2ea4"></a><!-- doxytag: member="tbb::flow::interface6::graph::iterator" ref="ec5db0443a1320850f8fa05b5eed2ea4" args="" -->
+typedef graph_iterator< <a class="el" href="a00300.html">graph</a>,<br>
+ <a class="el" href="a00301.html">graph_node</a> > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48523618e24d62c7d60f55d58e1323fd"></a><!-- doxytag: member="tbb::flow::interface6::multifunction_node::output_ports_type" ref="48523618e24d62c7d60f55d58e1323fd" args="" -->
-typedef internal::wrap_tuple_elements<<br>
- N, internal::function_output,<br>
- Output >::type </td><td class="memItemRight" valign="bottom"><b>output_ports_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3e677faaf2d66684cd32ccf5492dda4e"></a><!-- doxytag: member="tbb::flow::interface6::graph::const_iterator" ref="3e677faaf2d66684cd32ccf5492dda4e" args="" -->
+typedef graph_iterator< const <br>
+<a class="el" href="a00300.html">graph</a>, const <a class="el" href="a00301.html">graph_node</a> > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5112769f6063d733734c1631ab105911"></a><!-- doxytag: member="tbb::flow::interface6::multifunction_node::multifunction_node" ref="5112769f6063d733734c1631ab105911" args="(graph &g, size_t concurrency, Body body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>multifunction_node</b> (<a class="el" href="a00288.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4ab3d4b5208ece28c4c3ced647e26e12"></a><!-- doxytag: member="tbb::flow::interface6::graph::graph" ref="4ab3d4b5208ece28c4c3ced647e26e12" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4aa18bfb6faef08ddf94364013ef0f28"></a><!-- doxytag: member="tbb::flow::interface6::multifunction_node::multifunction_node" ref="4aa18bfb6faef08ddf94364013ef0f28" args="(const multifunction_node &other)" -->
- </td><td class="memItemRight" valign="bottom"><b>multifunction_node</b> (const <a class="el" href="a00300.html">multifunction_node</a> &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a graph with isolated <a class="el" href="a00352.html">task_group_context</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="104d4f3775f596b43177c29e6b7b7656"></a><!-- doxytag: member="tbb::flow::interface6::graph::graph" ref="104d4f3775f596b43177c29e6b7b7656" args="(task_group_context &use_this_context)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#104d4f3775f596b43177c29e6b7b7656">graph</a> (<a class="el" href="a00353.html">task_group_context</a> &use_this_context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a graph with use_this_context as context. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys the graph. <a href="#8a7d424c0616a1c37a908ead182e2fe5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to register that an external entity may still interact with the graph. <a href="#a993b789d1e488e0c3929135beae560e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Deregisters an external entity that may have interacted with the graph. <a href="#29b85506870f13a884a21655aec2a65d"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename Receiver, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00300.html#50a7938df01b6148ab2c0696835f002e">run</a> (Receiver &r, Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawns a task that runs a body and puts its output to a specific receiver. <a href="#50a7938df01b6148ab2c0696835f002e"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00300.html#c1145b00e063793a7e7bf994d202c7a0">run</a> (Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawns a task that runs a function object. <a href="#c1145b00e063793a7e7bf994d202c7a0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls. <a href="#a66b0020f7514b86d030fa8aea073d37"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7f4e3ae90811a5d8b597146b5b586d10"></a><!-- doxytag: member="tbb::flow::interface6::graph::root_task" ref="7f4e3ae90811a5d8b597146b5b586d10" args="()" -->
+<a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the root task of the graph. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b028cb585ec21e5de523d0075d0fa880"></a><!-- doxytag: member="tbb::flow::interface6::graph::begin" ref="b028cb585ec21e5de523d0075d0fa880" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#b028cb585ec21e5de523d0075d0fa880">begin</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">start iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a167c62511ddacaa152daa64ab2d6aac"></a><!-- doxytag: member="tbb::flow::interface6::graph::end" ref="a167c62511ddacaa152daa64ab2d6aac" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#a167c62511ddacaa152daa64ab2d6aac">end</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f63c3b7d03098b57fc16b71c57b303e5"></a><!-- doxytag: member="tbb::flow::interface6::graph::begin" ref="f63c3b7d03098b57fc16b71c57b303e5" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#f63c3b7d03098b57fc16b71c57b303e5">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="907bd06606818c36f52420fe8d469d35"></a><!-- doxytag: member="tbb::flow::interface6::graph::end" ref="907bd06606818c36f52420fe8d469d35" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#907bd06606818c36f52420fe8d469d35">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e183dfc3f89dc8f57c06ba165fb89f66"></a><!-- doxytag: member="tbb::flow::interface6::graph::cbegin" ref="e183dfc3f89dc8f57c06ba165fb89f66" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#e183dfc3f89dc8f57c06ba165fb89f66">cbegin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4866156e6a31d0399b61c6eb82ee81fd"></a><!-- doxytag: member="tbb::flow::interface6::graph::cend" ref="4866156e6a31d0399b61c6eb82ee81fd" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#4866156e6a31d0399b61c6eb82ee81fd">cend</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="227ea140dc2c68f79a4e5a34a8367b58"></a><!-- doxytag: member="tbb::flow::interface6::graph::is_cancelled" ref="227ea140dc2c68f79a4e5a34a8367b58" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html#227ea140dc2c68f79a4e5a34a8367b58">is_cancelled</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">return status of graph execution <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e48ff6b3b7433ce6ee2c2518b79d1a7c"></a><!-- doxytag: member="tbb::flow::interface6::graph::exception_thrown" ref="e48ff6b3b7433ce6ee2c2518b79d1a7c" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>exception_thrown</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="11cdff0b9201b4b9fa173265a8d7b9f4"></a><!-- doxytag: member="tbb::flow::interface6::graph::reset" ref="11cdff0b9201b4b9fa173265a8d7b9f4" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9143fb4f732c36d5587e467e21a0e7f6"></a><!-- doxytag: member="tbb::flow::interface6::graph::graph_node" ref="9143fb4f732c36d5587e467e21a0e7f6" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>graph_node</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621c092f8466e55743ceef04b0bde9ce"></a><!-- doxytag: member="tbb::flow::interface6::graph::graph_iterator" ref="621c092f8466e55743ceef04b0bde9ce" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>graph_iterator</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>run_and_put_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>run_task</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Input, typename Output, graph_buffer_policy = queueing, typename Allocator = cache_aligned_allocator<Input>><br>
- class tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></h3>
+The graph class.
+<p>
+This class serves as a handle to the graph
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="8a7d424c0616a1c37a908ead182e2fe5"></a><!-- doxytag: member="tbb::flow::interface6::graph::~graph" ref="8a7d424c0616a1c37a908ead182e2fe5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tbb::flow::interface6::graph::~graph </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroys the graph.
+<p>
+Calls wait_for_all, then destroys the root task and context.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="29b85506870f13a884a21655aec2a65d"></a><!-- doxytag: member="tbb::flow::interface6::graph::decrement_wait_count" ref="29b85506870f13a884a21655aec2a65d" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::flow::interface6::graph::decrement_wait_count </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-implements a function node that supports Input -> (set of outputs)
<p>
+Deregisters an external entity that may have interacted with the graph.
+<p>
+The graph will not return from wait_for_all until all the number of decrement_wait_count calls matches the number of increment_wait_count calls.
+</div>
+</div><p>
+<a class="anchor" name="a993b789d1e488e0c3929135beae560e"></a><!-- doxytag: member="tbb::flow::interface6::graph::increment_wait_count" ref="a993b789d1e488e0c3929135beae560e" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::flow::interface6::graph::increment_wait_count </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Used to register that an external entity may still interact with the graph.
+<p>
+The graph will not return from wait_for_all until a matching number of decrement_wait_count calls is made.
+</div>
+</div><p>
+<a class="anchor" name="c1145b00e063793a7e7bf994d202c7a0"></a><!-- doxytag: member="tbb::flow::interface6::graph::run" ref="c1145b00e063793a7e7bf994d202c7a0" args="(Body body)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Body> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::flow::interface6::graph::run </td>
+ <td>(</td>
+ <td class="paramtype">Body </td>
+ <td class="paramname"> <em>body</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Spawns a task that runs a function object.
+<p>
+The task is spawned as a child of the graph. This is useful for running tasks that need to block a <a class="el" href="a00300.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all()</a> on the graph. For example a one-off source.
+</div>
+</div><p>
+<a class="anchor" name="50a7938df01b6148ab2c0696835f002e"></a><!-- doxytag: member="tbb::flow::interface6::graph::run" ref="50a7938df01b6148ab2c0696835f002e" args="(Receiver &r, Body body)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Receiver, typename Body> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::flow::interface6::graph::run </td>
+ <td>(</td>
+ <td class="paramtype">Receiver & </td>
+ <td class="paramname"> <em>r</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">Body </td>
+ <td class="paramname"> <em>body</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Spawns a task that runs a body and puts its output to a specific receiver.
+<p>
+The task is spawned as a child of the graph. This is useful for running tasks that need to block a <a class="el" href="a00300.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all()</a> on the graph. For example a one-off source.
+</div>
+</div><p>
+<a class="anchor" name="a66b0020f7514b86d030fa8aea073d37"></a><!-- doxytag: member="tbb::flow::interface6::graph::wait_for_all" ref="a66b0020f7514b86d030fa8aea073d37" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::flow::interface6::graph::wait_for_all </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls.
+<p>
+The waiting thread will go off and steal work while it is block in the wait_for_all.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00300.png b/doc/html/a00300.png
deleted file mode 100644
index cdab3e3..0000000
Binary files a/doc/html/a00300.png and /dev/null differ
diff --git a/doc/html/a00301.html b/doc/html/a00301.html
index 06efb66..f423ebf 100644
--- a/doc/html/a00301.html
+++ b/doc/html/a00301.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::mutex Class Reference</title>
+<title>tbb::flow::interface6::graph_node Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,113 +21,61 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00301.html">mutex</a></div>
-<h1>tbb::mutex Class Reference<br>
-<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::mutex" -->Wrapper around the platform's native reader-writer lock.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00301.html">graph_node</a></div>
+<h1>tbb::flow::interface6::graph_node Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::graph_node" -->The base of all graph nodes.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00531.html">mutex.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<a href="a00088.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::graph_node:
+<p><center><img src="a00301.png" usemap="#tbb::flow::interface6::graph_node_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::graph_node_map">
+<area href="a00274.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="511,56,1012,80">
+<area href="a00275.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="511,112,1012,136">
+<area href="a00290.html" alt="tbb::flow::interface6::continue_node< Output >" shape="rect" coords="511,168,1012,192">
+<area href="a00298.html" alt="tbb::flow::interface6::function_node< Input, Output,, Allocator >" shape="rect" coords="511,224,1012,248">
+<area href="a00299.html" alt="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >" shape="rect" coords="511,280,1012,304">
+<area href="a00304.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="511,336,1012,360">
+<area href="a00312.html" alt="tbb::flow::interface6::multifunction_node< Input, Output,, Allocator >" shape="rect" coords="511,392,1012,416">
+<area href="a00312.html" alt="tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator >" shape="rect" coords="511,448,1012,472">
+<area href="a00342.html" alt="tbb::flow::interface6::source_node< Output >" shape="rect" coords="511,504,1012,528">
+</map>
+<a href="a00062.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f1ec84d5815263ceae853f06ddb4cac"></a><!-- doxytag: member="tbb::mutex::native_handle_type" ref="9f1ec84d5815263ceae853f06ddb4cac" args="" -->
-typedef LPCRITICAL_SECTION </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return native_handle. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1f4d4b88a03eb3e95c76569b91a0792"></a><!-- doxytag: member="tbb::mutex::native_handle_type" ref="a1f4d4b88a03eb3e95c76569b91a0792" args="" -->
-typedef pthread_mutex_t * </td><td class="memItemRight" valign="bottom"><b>native_handle_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab196034e5963fe9e27d7c4d0a2d4ffa24a50a7"></a><!-- doxytag: member="tbb::mutex::INITIALIZED" ref="c907aa5ae5274da759c4188c8ab196034e5963fe9e27d7c4d0a2d4ffa24a50a7" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>INITIALIZED</b> = 0x1234</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd"></a><!-- doxytag: member="tbb::mutex::DESTROYED" ref="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>DESTROYED</b> = 0x789A</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab196031de5796ebbbaa1e30d19e5d54f0f6555"></a><!-- doxytag: member="tbb::mutex::HELD" ref="c907aa5ae5274da759c4188c8ab196031de5796ebbbaa1e30d19e5d54f0f6555" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>HELD</b> = 0x56CD</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>state_t</b> { <b>INITIALIZED</b> = 0x1234,
-<b>DESTROYED</b> = 0x789A,
-<b>HELD</b> = 0x56CD
- }</td></tr>
-
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05313cb77d4f85213103d4dab74ed454"></a><!-- doxytag: member="tbb::mutex::mutex" ref="05313cb77d4f85213103d4dab74ed454" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#05313cb77d4f85213103d4dab74ed454">mutex</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4470e61c24c129a0299ca6c17240adbb"></a><!-- doxytag: member="tbb::mutex::lock" ref="4470e61c24c129a0299ca6c17240adbb" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#4470e61c24c129a0299ca6c17240adbb">lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f3a9aad30268e2a9f1416eab325f7e5"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::graph_node" ref="4f3a9aad30268e2a9f1416eab325f7e5" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><b>graph_node</b> (<a class="el" href="a00300.html">graph</a> &g)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#4331652c79dea1c1131bd59ab161b234">try_lock</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f8e8e9ccaec123836b008991d518cb42"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::reset" ref="f8e8e9ccaec123836b008991d518cb42" args="()=0" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()=0</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#4331652c79dea1c1131bd59ab161b234"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fc9ef443ae75d966695546be399cc6b"></a><!-- doxytag: member="tbb::mutex::unlock" ref="5fc9ef443ae75d966695546be399cc6b" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#5fc9ef443ae75d966695546be399cc6b">unlock</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f51137fff91095fa3e6a736b71c27cc"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::my_graph" ref="6f51137fff91095fa3e6a736b71c27cc" args="" -->
+<a class="el" href="a00300.html">graph</a> & </td><td class="memItemRight" valign="bottom"><b>my_graph</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="caf34349c0fbe7b44f1a2ca0a3150dd0"></a><!-- doxytag: member="tbb::mutex::native_handle" ref="caf34349c0fbe7b44f1a2ca0a3150dd0" args="()" -->
-<a class="el" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1ce68896f6d366dcc3fad19f6fd55d1"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::next" ref="d1ce68896f6d366dcc3fad19f6fd55d1" args="" -->
+<a class="el" href="a00301.html">graph_node</a> * </td><td class="memItemRight" valign="bottom"><b>next</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="795649a185b0d6af6dc81c5f378616dd"></a><!-- doxytag: member="tbb::mutex::set_state" ref="795649a185b0d6af6dc81c5f378616dd" args="(state_t to)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#795649a185b0d6af6dc81c5f378616dd">set_state</a> (state_t to)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the internal state. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17b78176054e2bac1ff35b9535d1ea0c"></a><!-- doxytag: member="tbb::mutex::is_rw_mutex" ref="17b78176054e2bac1ff35b9535d1ea0c" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d4558e5a7c5b8d8e158ec7a1079669bd"></a><!-- doxytag: member="tbb::mutex::is_recursive_mutex" ref="d4558e5a7c5b8d8e158ec7a1079669bd" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f023a29c61451d02359095cbff0f3d45"></a><!-- doxytag: member="tbb::mutex::is_fair_mutex" ref="f023a29c61451d02359095cbff0f3d45" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28049e438b241b0d6051767bbeacc0b9"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::prev" ref="28049e438b241b0d6051767bbeacc0b9" args="" -->
+<a class="el" href="a00301.html">graph_node</a> * </td><td class="memItemRight" valign="bottom"><b>prev</b></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="137c56ab53c02049fca0b78c49294314"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::graph" ref="137c56ab53c02049fca0b78c49294314" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>graph</b></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621c092f8466e55743ceef04b0bde9ce"></a><!-- doxytag: member="tbb::flow::interface6::graph_node::graph_iterator" ref="621c092f8466e55743ceef04b0bde9ce" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>graph_iterator</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00302.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Wrapper around the platform's native reader-writer lock.
-<p>
-For testing purposes only.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="4331652c79dea1c1131bd59ab161b234"></a><!-- doxytag: member="tbb::mutex::try_lock" ref="4331652c79dea1c1131bd59ab161b234" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::mutex::try_lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Try acquiring lock (non-blocking).
+The base of all graph nodes.
<p>
-Return true if lock acquired; false otherwise.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00531.html">mutex.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00289.png b/doc/html/a00301.png
similarity index 100%
rename from doc/html/a00289.png
rename to doc/html/a00301.png
diff --git a/doc/html/a00302.html b/doc/html/a00302.html
index b3cc37f..9236187 100644
--- a/doc/html/a00302.html
+++ b/doc/html/a00302.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::mutex::scoped_lock Class Reference</title>
+<title>tbb::improper_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,54 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00301.html">mutex</a>::<a class="el" href="a00302.html">scoped_lock</a></div>
-<h1>tbb::mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::mutex::scoped_lock" -->The scoped locking pattern.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00302.html">improper_lock</a></div>
+<h1>tbb::improper_lock Class Reference</h1><!-- doxytag: class="tbb::improper_lock" -->Exception for PPL locks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00531.html">mutex.h</a>></code>
+<code>#include <tbb_exception.h></code>
<p>
-<a href="a00089.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00157.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d403ae51b484df5d86d85ae38f11e6e"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="1d403ae51b484df5d86d85ae38f11e6e" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="605a6b9af0f8cdabdf81825e0de99600"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="605a6b9af0f8cdabdf81825e0de99600" args="(mutex &mutex)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a> (<a class="el" href="a00301.html">mutex</a> &<a class="el" href="a00301.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ebbbecaf4311e9df7362cb76ceaa368"></a><!-- doxytag: member="tbb::mutex::scoped_lock::~scoped_lock" ref="0ebbbecaf4311e9df7362cb76ceaa368" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="862e022841cdc522e4296a5533b22efd"></a><!-- doxytag: member="tbb::mutex::scoped_lock::acquire" ref="862e022841cdc522e4296a5533b22efd" args="(mutex &mutex)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#862e022841cdc522e4296a5533b22efd">acquire</a> (<a class="el" href="a00301.html">mutex</a> &<a class="el" href="a00301.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="591e0c49b82bcedffcbe0923f1b915ec"></a><!-- doxytag: member="tbb::mutex::scoped_lock::try_acquire" ref="591e0c49b82bcedffcbe0923f1b915ec" args="(mutex &mutex)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a> (<a class="el" href="a00301.html">mutex</a> &<a class="el" href="a00301.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d51d18cd99df3b2e93bf07378d0992c"></a><!-- doxytag: member="tbb::mutex::scoped_lock::release" ref="0d51d18cd99df3b2e93bf07378d0992c" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#0d51d18cd99df3b2e93bf07378d0992c">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93062a14ad2e50e2b7b485b913170779"></a><!-- doxytag: member="tbb::mutex::scoped_lock::mutex" ref="93062a14ad2e50e2b7b485b913170779" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>mutex</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74213c2d20407e1fa16b70ca55ef27c6"></a><!-- doxytag: member="tbb::improper_lock::what" ref="74213c2d20407e1fa16b70ca55ef27c6" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern.
-<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+Exception for PPL locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00531.html">mutex.h</a></ul>
+<li>tbb_exception.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00303.html b/doc/html/a00303.html
index 03fde40..a557725 100644
--- a/doc/html/a00303.html
+++ b/doc/html/a00303.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::null_mutex Class Reference</title>
+<title>tbb::invalid_multiple_scheduling Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00303.html">null_mutex</a></div>
-<h1>tbb::null_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::null_mutex" -->A mutex which does nothing.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00303.html">invalid_multiple_scheduling</a></div>
+<h1>tbb::invalid_multiple_scheduling Class Reference</h1><!-- doxytag: class="tbb::invalid_multiple_scheduling" -->Exception for repeated scheduling of the same task_handle.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00533.html">null_mutex.h</a>></code>
+<code>#include <tbb_exception.h></code>
<p>
-<a href="a00090.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00160.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a960bed8b19a4d111ca047de206f5f77"></a><!-- doxytag: member="tbb::null_mutex::is_rw_mutex" ref="a960bed8b19a4d111ca047de206f5f77" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57082ccac880db17144db76c0f94701e"></a><!-- doxytag: member="tbb::invalid_multiple_scheduling::what" ref="57082ccac880db17144db76c0f94701e" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0fefed74b341d43ccf0e2fc30d31b75"></a><!-- doxytag: member="tbb::null_mutex::is_recursive_mutex" ref="a0fefed74b341d43ccf0e2fc30d31b75" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="707cf399055d68177b1d64c2e112603a"></a><!-- doxytag: member="tbb::null_mutex::is_fair_mutex" ref="707cf399055d68177b1d64c2e112603a" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00304.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A mutex which does nothing.
-<p>
-A <a class="el" href="a00303.html">null_mutex</a> does no operation and simulates success.
+Exception for repeated scheduling of the same task_handle.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00533.html">null_mutex.h</a></ul>
+<li>tbb_exception.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00304.html b/doc/html/a00304.html
index 3b24d67..7cf9482 100644
--- a/doc/html/a00304.html
+++ b/doc/html/a00304.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::null_mutex::scoped_lock Class Reference</title>
+<title>tbb::flow::interface6::limiter_node< T > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,36 +21,137 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00303.html">null_mutex</a>::<a class="el" href="a00304.html">scoped_lock</a></div>
-<h1>tbb::null_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_mutex::scoped_lock" -->Represents acquisition of a mutex.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00304.html">limiter_node</a></div>
+<h1>tbb::flow::interface6::limiter_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::limiter_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::receiver,tbb::flow::interface6::sender" -->Forwards messages only if the threshold has not been reached.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00533.html">null_mutex.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<a href="a00091.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::limiter_node< T >:
+<p><center><img src="a00304.png" usemap="#tbb::flow::interface6::limiter_node< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::limiter_node< T >_map">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,226,24">
+<area href="a00333.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="236,0,462,24">
+<area href="a00339.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="472,0,698,24">
+</map>
+<a href="a00079.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="035196d3c9240ef041f528ebcde8baa7"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::input_type" ref="035196d3c9240ef041f528ebcde8baa7" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#035196d3c9240ef041f528ebcde8baa7">input_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6e67fc480147c0b88a483b85db6457b0"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::output_type" ref="6e67fc480147c0b88a483b85db6457b0" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#6e67fc480147c0b88a483b85db6457b0">output_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f89fcf44f38eb33f965ee5362d3e68e9"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::predecessor_type" ref="f89fcf44f38eb33f965ee5362d3e68e9" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< <a class="el" href="a00304.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#f89fcf44f38eb33f965ee5362d3e68e9">predecessor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8945e4dd6ea759ff9e4735da13f12ef"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::successor_type" ref="e8945e4dd6ea759ff9e4735da13f12ef" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00304.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#e8945e4dd6ea759ff9e4735da13f12ef">successor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="765e64065919fdd9665e78b5ec4d3c6f"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::scoped_lock" ref="765e64065919fdd9665e78b5ec4d3c6f" args="(null_mutex &)" -->
- </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b> (<a class="el" href="a00303.html">null_mutex</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="831b06576f46fe2bf3ed0f86b793c1b2"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::limiter_node" ref="831b06576f46fe2bf3ed0f86b793c1b2" args="(graph &g, size_t threshold, int num_decrement_predecessors=0)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a> (<a class="el" href="a00300.html">graph</a> &g, size_t threshold, int num_decrement_predecessors=0)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83d3ab884543b070ee5b345a87f241fa"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::limiter_node" ref="83d3ab884543b070ee5b345a87f241fa" args="(const limiter_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#83d3ab884543b070ee5b345a87f241fa">limiter_node</a> (const <a class="el" href="a00304.html">limiter_node</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c76561d8d871b4769876988a4de12a9b"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::register_successor" ref="c76561d8d871b4769876988a4de12a9b" args="(receiver< output_type > &r)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#c76561d8d871b4769876988a4de12a9b">register_successor</a> (<a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00304.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > &r)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Replace the current successor with this new successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#275e328063c121b3e506ccef2a825d28">remove_successor</a> (<a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00304.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > &r)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <a href="#275e328063c121b3e506ccef2a825d28"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="de70a0e88ce7655d8c14b6af57f7496f"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::register_predecessor" ref="de70a0e88ce7655d8c14b6af57f7496f" args="(predecessor_type &src)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a> (<a class="el" href="a00339.html">predecessor_type</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes src from the list of cached predecessors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c530e7b469454e2340460795f2da3317"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::remove_predecessor" ref="c530e7b469454e2340460795f2da3317" args="(predecessor_type &src)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a> (<a class="el" href="a00339.html">predecessor_type</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes src from the list of cached predecessors. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3344b2461966631b6ee34b79fb105c7"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::decrement" ref="a3344b2461966631b6ee34b79fb105c7" args="" -->
+internal::decrementer< <a class="el" href="a00304.html">limiter_node</a><<br>
+ T > > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#a3344b2461966631b6ee34b79fb105c7">decrement</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The internal receiver< continue_msg > that decrements the count. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ca2ff9f3379b8b5a3de2ababbca4a476"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::try_put_task" ref="ca2ff9f3379b8b5a3de2ababbca4a476" args="(const T &t)" -->
+<a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#ca2ff9f3379b8b5a3de2ababbca4a476">try_put_task</a> (const T &t)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6889f00ca3946906e89e856988bb890"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::acquire" ref="f6889f00ca3946906e89e856988bb890" args="(null_mutex &)" -->
-void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00303.html">null_mutex</a> &)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Puts an item to this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8b9c771bcf9137829f0e5b73044f8b7e"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::reset" ref="8b9c771bcf9137829f0e5b73044f8b7e" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90eb562a9de52b33362a6fe237b3df42"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::try_acquire" ref="90eb562a9de52b33362a6fe237b3df42" args="(null_mutex &)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>try_acquire</b> (<a class="el" href="a00303.html">null_mutex</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="68591a3690d26ade0610ddd6f3e076c5"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::reset_receiver" ref="68591a3690d26ade0610ddd6f3e076c5" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset_receiver</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b29fdf07b4c295850a6e433001c2c6a7"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::release" ref="b29fdf07b4c295850a6e433001c2c6a7" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74b341552e1314d2e318be9066a1d151"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::internal::forward_task_bypass< limiter_node< T > >" ref="74b341552e1314d2e318be9066a1d151" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::forward_task_bypass< limiter_node< T > ></b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b43677b60c786d1071a7efd6f195c3be"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::internal::decrementer< limiter_node< T > >" ref="b43677b60c786d1071a7efd6f195c3be" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::decrementer< limiter_node< T > ></b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621bab40a858d214db69ef08d88b67c1"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::run_and_put_task" ref="621bab40a858d214db69ef08d88b67c1" args="" -->
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">put item to successor; return task to run the successor if possible. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4fa30d87bc0bfa80942f97a8d58f1bd"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::internal::broadcast_cache" ref="e4fa30d87bc0bfa80942f97a8d58f1bd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::broadcast_cache</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31ba00ea3e3e5a421b38840bd0dc2589"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::internal::round_robin_cache" ref="31ba00ea3e3e5a421b38840bd0dc2589" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::round_robin_cache</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Represents acquisition of a mutex.
+<h3>template<typename T><br>
+ class tbb::flow::interface6::limiter_node< T ></h3>
+
+Forwards messages only if the threshold has not been reached.
+<p>
+This node forwards items until its threshold is reached. It contains no buffering. If the downstream node rejects, the message is dropped.
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="275e328063c121b3e506ccef2a825d28"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::remove_successor" ref="275e328063c121b3e506ccef2a825d28" args="(receiver< output_type > &r)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00304.html">tbb::flow::interface6::limiter_node</a>< T >::remove_successor </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00304.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > & </td>
+ <td class="paramname"> <em>r</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Removes a successor from this node.
+<p>
+r.remove_predecessor(*this) is also called.
<p>
+Implements <a class="el" href="a00339.html#82f363bfb1738bb8789e167590b10ef9">tbb::flow::interface6::sender< T ></a>.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00533.html">null_mutex.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00292.png b/doc/html/a00304.png
similarity index 100%
copy from doc/html/a00292.png
copy to doc/html/a00304.png
diff --git a/doc/html/a00305.html b/doc/html/a00305.html
index 696e0f3..9b9c160 100644
--- a/doc/html/a00305.html
+++ b/doc/html/a00305.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::null_rw_mutex Class Reference</title>
+<title>tbb::internal::machine_load_store_relaxed< T, S > Struct Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,30 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00305.html">null_rw_mutex</a></div>
-<h1>tbb::null_rw_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::null_rw_mutex" -->A rw mutex which does nothing.
-<a href="#_details">More...</a>
+<a class="el" href="a00428.html">tbb</a>::<b>internal</b>::<a class="el" href="a00305.html">machine_load_store_relaxed</a></div>
+<h1>tbb::internal::machine_load_store_relaxed< T, S > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::machine_load_store_relaxed" --><code>#include <tbb_machine.h></code>
<p>
-<code>#include <<a class="el" href="a00534.html">null_rw_mutex.h</a>></code>
-<p>
-<a href="a00092.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00174.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2f3235cbf63812f72e5755a4c820f523"></a><!-- doxytag: member="tbb::null_rw_mutex::is_rw_mutex" ref="2f3235cbf63812f72e5755a4c820f523" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e33ac3b047901e69e7997a16e221a330"></a><!-- doxytag: member="tbb::null_rw_mutex::is_recursive_mutex" ref="e33ac3b047901e69e7997a16e221a330" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e5248faf1412f9283185a0b5d72d7456"></a><!-- doxytag: member="tbb::null_rw_mutex::is_fair_mutex" ref="e5248faf1412f9283185a0b5d72d7456" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="de10ed2fe8788773adb55f265db38587"></a><!-- doxytag: member="tbb::internal::machine_load_store_relaxed::load" ref="de10ed2fe8788773adb55f265db38587" args="(const volatile T &location)" -->
+static T </td><td class="memItemRight" valign="bottom"><b>load</b> (const volatile T &location)</td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d72090653905a4c94aa6836bc190044"></a><!-- doxytag: member="tbb::internal::machine_load_store_relaxed::store" ref="1d72090653905a4c94aa6836bc190044" args="(volatile T &location, T value)" -->
+static void </td><td class="memItemRight" valign="bottom"><b>store</b> (volatile T &location, T value)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00306.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A rw mutex which does nothing.
-<p>
-A <a class="el" href="a00305.html">null_rw_mutex</a> is a rw mutex that does nothing and simulates successful operation.
+<h3>template<typename T, size_t S><br>
+ struct tbb::internal::machine_load_store_relaxed< T, S ></h3>
+
+Volatile should not incur any additional cost on IA32, Intel64, and Sparc TSO architectures. However on architectures with weak memory ordering compiler may generate code with acquire/release semantics for operations on volatile data.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00534.html">null_rw_mutex.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li>tbb_machine.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00306.html b/doc/html/a00306.html
index a7a346e..4b8eca7 100644
--- a/doc/html/a00306.html
+++ b/doc/html/a00306.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::null_rw_mutex::scoped_lock Class Reference</title>
+<title>tbb::internal::machine_load_store_seq_cst< T, 8 > Struct Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,30 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00305.html">null_rw_mutex</a>::<a class="el" href="a00306.html">scoped_lock</a></div>
-<h1>tbb::null_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_rw_mutex::scoped_lock" -->Represents acquisition of a mutex.
-<a href="#_details">More...</a>
+<a class="el" href="a00428.html">tbb</a>::<b>internal</b>::<a class="el" href="a00306.html">machine_load_store_seq_cst< T, 8 ></a></div>
+<h1>tbb::internal::machine_load_store_seq_cst< T, 8 > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::machine_load_store_seq_cst< T, 8 >" --><code>#include <tbb_machine.h></code>
<p>
-<code>#include <<a class="el" href="a00534.html">null_rw_mutex.h</a>></code>
-<p>
-<a href="a00093.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00173.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e11281a13a7b6243c6c9ab243c5ad5a8"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::scoped_lock" ref="e11281a13a7b6243c6c9ab243c5ad5a8" args="(null_rw_mutex &, bool=true)" -->
- </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b> (<a class="el" href="a00305.html">null_rw_mutex</a> &, bool=true)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72c4c302fdfc20187a650348e432b0a7"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::acquire" ref="72c4c302fdfc20187a650348e432b0a7" args="(null_rw_mutex &, bool=true)" -->
-void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00305.html">null_rw_mutex</a> &, bool=true)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa1e2a5592ee2672470ea44d98f1c498"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::upgrade_to_writer" ref="fa1e2a5592ee2672470ea44d98f1c498" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>upgrade_to_writer</b> ()</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e765439a2cd7ddd871b20dc72148d600"></a><!-- doxytag: member="tbb::internal::machine_load_store_seq_cst< T, 8 >::load" ref="e765439a2cd7ddd871b20dc72148d600" args="(const volatile T &location)" -->
+static T </td><td class="memItemRight" valign="bottom"><b>load</b> (const volatile T &location)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="efcb7948649e1652d59aaff9c8ea40f1"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::downgrade_to_reader" ref="efcb7948649e1652d59aaff9c8ea40f1" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>downgrade_to_reader</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="56686c4dfe4a32a1d9bd8e7e729130e6"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::try_acquire" ref="56686c4dfe4a32a1d9bd8e7e729130e6" args="(null_rw_mutex &, bool=true)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>try_acquire</b> (<a class="el" href="a00305.html">null_rw_mutex</a> &, bool=true)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6146c803a4ad2f14263fdc019a72b5a9"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::release" ref="6146c803a4ad2f14263fdc019a72b5a9" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05fcfe2752cabb32ff9db4fbef59bb8b"></a><!-- doxytag: member="tbb::internal::machine_load_store_seq_cst< T, 8 >::store" ref="05fcfe2752cabb32ff9db4fbef59bb8b" args="(volatile T &location, T value)" -->
+static void </td><td class="memItemRight" valign="bottom"><b>store</b> (volatile T &location, T value)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Represents acquisition of a mutex.
+<h3>template<typename T><br>
+ struct tbb::internal::machine_load_store_seq_cst< T, 8 ></h3>
+
+The implementation does not use functions __TBB_machine_load8/store8 as they are not required to be sequentially consistent.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00534.html">null_rw_mutex.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li>tbb_machine.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00307.html b/doc/html/a00307.html
index 6e27b82..9e3924f 100644
--- a/doc/html/a00307.html
+++ b/doc/html/a00307.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::parallel_do_feeder< Item > Class Template Reference</title>
+<title>tbb::interface6::memory_pool< Alloc > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,35 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00307.html">parallel_do_feeder</a></div>
-<h1>tbb::parallel_do_feeder< Item > Class Template Reference</h1><!-- doxytag: class="tbb::parallel_do_feeder" -->Class the user supplied algorithm body uses to add new tasks.
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00307.html">memory_pool</a></div>
+<h1>tbb::interface6::memory_pool< Alloc > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::memory_pool" -->Thread-safe growable pool allocator for variable-size requests.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00535.html">parallel_do.h</a>></code>
+<code>#include <memory_pool.h></code>
<p>
-<a href="a00094.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00088.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="40baaf0f6856f4491dd0adf896c93516"></a><!-- doxytag: member="tbb::parallel_do_feeder::add" ref="40baaf0f6856f4491dd0adf896c93516" args="(const Item &item)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#40baaf0f6856f4491dd0adf896c93516">add</a> (const Item &item)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2822528265718a4c779591fc37c02ca8"></a><!-- doxytag: member="tbb::interface6::memory_pool::memory_pool" ref="2822528265718a4c779591fc37c02ca8" args="(const Alloc &src=Alloc())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#2822528265718a4c779591fc37c02ca8">memory_pool</a> (const Alloc &src=Alloc())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a work item to a running parallel_do. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b381179b22f5f5e8511470c73d64b37f"></a><!-- doxytag: member="tbb::parallel_do_feeder::internal::parallel_do_feeder_impl" ref="b381179b22f5f5e8511470c73d64b37f" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::parallel_do_feeder_impl</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">construct pool with underlying allocator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdad7c4ed08332ec384491a71b721957"></a><!-- doxytag: member="tbb::interface6::memory_pool::~memory_pool" ref="fdad7c4ed08332ec384491a71b721957" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#fdad7c4ed08332ec384491a71b721957">~memory_pool</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">destroy pool <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Item><br>
- class tbb::parallel_do_feeder< Item ></h3>
-
-Class the user supplied algorithm body uses to add new tasks.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>Item</em> </td><td>Work item type </td></tr>
- </table>
-</dl>
+<h3>template<typename Alloc><br>
+ class tbb::interface6::memory_pool< Alloc ></h3>
+Thread-safe growable pool allocator for variable-size requests.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00535.html">parallel_do.h</a></ul>
+<li><a class="el" href="a00386.html">memory_pool.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00308.html b/doc/html/a00308.html
index bcf4c07..74eb79e 100644
--- a/doc/html/a00308.html
+++ b/doc/html/a00308.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::parallel_while< Body > Class Template Reference</title>
+<title>tbb::interface6::memory_pool_allocator< T, P > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,117 +21,109 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00308.html">parallel_while</a></div>
-<h1>tbb::parallel_while< Body > Class Template Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00308.html">memory_pool_allocator</a></div>
+<h1>tbb::interface6::memory_pool_allocator< T, P > Class Template Reference<br>
<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::parallel_while" -->Parallel iteration over a stream, with optional addition of more work.
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::interface6::memory_pool_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00571.html">parallel_while.h</a>></code>
+<code>#include <memory_pool.h></code>
<p>
-<a href="a00098.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00084.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa297e53d3af2a101e712bc200233e9c"></a><!-- doxytag: member="tbb::parallel_while::value_type" ref="fa297e53d3af2a101e712bc200233e9c" args="" -->
-typedef Body::argument_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#fa297e53d3af2a101e712bc200233e9c">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="364d1a4b2174091802a0c1a7177fd037"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::value_type" ref="364d1a4b2174091802a0c1a7177fd037" args="" -->
+typedef tbb::internal::allocator_type<<br>
+ T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="841174744c7bebbe9a8ec4cd35b7e8c8"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::pointer" ref="841174744c7bebbe9a8ec4cd35b7e8c8" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8867631698ca08b5b8c849693f45cef4"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::const_pointer" ref="8867631698ca08b5b8c849693f45cef4" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4419d14b95793fea5e80c1a7ad85b4b3"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::reference" ref="4419d14b95793fea5e80c1a7ad85b4b3" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57a51cd687993c94d486a0ff0b7a783f"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::const_reference" ref="57a51cd687993c94d486a0ff0b7a783f" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fd9f0aaee1039cc64fa4342ee93fd43e"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::size_type" ref="fd9f0aaee1039cc64fa4342ee93fd43e" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4340f60415582d0eca834b47b22f5d62"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::difference_type" ref="4340f60415582d0eca834b47b22f5d62" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of items. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36e26ba3880c7bcf804a97ba0cbe133f"></a><!-- doxytag: member="tbb::parallel_while::parallel_while" ref="36e26ba3880c7bcf804a97ba0cbe133f" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d06264c6dc8ed178d8c14998f0511b27"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="d06264c6dc8ed178d8c14998f0511b27" args="(pool_type &pool)" -->
+ </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (pool_type &pool) throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty non-running parallel while. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6fcfc973cc56b79c6d0fbb8a31be7e84"></a><!-- doxytag: member="tbb::parallel_while::~parallel_while" ref="6fcfc973cc56b79c6d0fbb8a31be7e84" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="655f7aef5ba5dbe79f76b493270794af"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="655f7aef5ba5dbe79f76b493270794af" args="(const memory_pool_allocator &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00308.html">memory_pool_allocator</a> &src) throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor cleans up data members before returning. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename Stream> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00308.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a> (Stream &stream, const Body &body)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0d1d98389a82d65a4229db8e28363420"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="0d1d98389a82d65a4229db8e28363420" args="(const memory_pool_allocator< U, P > &src)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00308.html">memory_pool_allocator</a>< U, P > &src) throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Apply body.apply to each item in the stream. <a href="#b32a0a6e5e09ebb7fad3e6652c19afe5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#e131c560057a58229992b61eb8dba4c6">add</a> (const <a class="el" href="a00308.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> &item)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="727129bc029510733b3e95ea10f6bee3"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::address" ref="727129bc029510733b3e95ea10f6bee3" args="(reference x) const " -->
+pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a work item while running. <a href="#e131c560057a58229992b61eb8dba4c6"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Body><br>
- class tbb::parallel_while< Body ></h3>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e250b83998b01dbea88c43085e15139a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::address" ref="e250b83998b01dbea88c43085e15139a" args="(const_reference x) const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
-Parallel iteration over a stream, with optional addition of more work.
-<p>
-The Body b has the requirement: <br>
- "b(v)" <br>
- "b.argument_type" <br>
- where v is an argument_type
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="e131c560057a58229992b61eb8dba4c6"></a><!-- doxytag: member="tbb::parallel_while::add" ref="e131c560057a58229992b61eb8dba4c6" args="(const value_type &item)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Body> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00308.html">tbb::parallel_while</a>< Body >::add </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="a00308.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> & </td>
- <td class="paramname"> <em>item</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="365bd64d284c80d85bb2149a12681526"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::allocate" ref="365bd64d284c80d85bb2149a12681526" args="(size_type n, const void *=0)" -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#365bd64d284c80d85bb2149a12681526">allocate</a> (size_type n, const void *=0)</td></tr>
-<p>
-Add a work item while running.
-<p>
-Should be executed only by body.apply or a thread spawned therefrom.
-</div>
-</div><p>
-<a class="anchor" name="b32a0a6e5e09ebb7fad3e6652c19afe5"></a><!-- doxytag: member="tbb::parallel_while::run" ref="b32a0a6e5e09ebb7fad3e6652c19afe5" args="(Stream &stream, const Body &body)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Body> </div>
-<div class="memtemplate">
-template<typename Stream> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00308.html">tbb::parallel_while</a>< Body >::run </td>
- <td>(</td>
- <td class="paramtype">Stream & </td>
- <td class="paramname"> <em>stream</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Body & </td>
- <td class="paramname"> <em>body</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4e24a03de38638af07548383024c54ab"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::deallocate" ref="4e24a03de38638af07548383024c54ab" args="(pointer p, size_type)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#4e24a03de38638af07548383024c54ab">deallocate</a> (pointer p, size_type)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="beebdb6144df8ba219fadfad4de866ea"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::max_size" ref="beebdb6144df8ba219fadfad4de866ea" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#beebdb6144df8ba219fadfad4de866ea">max_size</a> () const throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c6d3fa3032bf5d4be841729d7893e26d"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::construct" ref="c6d3fa3032bf5d4be841729d7893e26d" args="(U *p, Args &&...args)" -->
+template<typename U, typename... Args> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00308.html#c6d3fa3032bf5d4be841729d7893e26d">construct</a> (U *p, Args &&...args)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b9b545d2d31ef4b711ca87ba7aa18976"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::pool_type" ref="b9b545d2d31ef4b711ca87ba7aa18976" args="" -->
+typedef P </td><td class="memItemRight" valign="bottom"><b>pool_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f22e947018eb99cde5f44ee3d339499"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::my_pool" ref="9f22e947018eb99cde5f44ee3d339499" args="" -->
+pool_type * </td><td class="memItemRight" valign="bottom"><b>my_pool</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="193c7eeb6ed852d587b652828f52ca92"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="193c7eeb6ed852d587b652828f52ca92" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b></td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f4fe0fa75b911081eff469ddb3e7e52a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::operator==" ref="f4fe0fa75b911081eff469ddb3e7e52a" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
+template<typename V, typename U, typename R> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00308.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00308.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4bb06a39de4a5290b4ec03be19d61c36"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::operator!=" ref="4bb06a39de4a5290b4ec03be19d61c36" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
+template<typename V, typename U, typename R> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00308.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00308.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<typename T, typename P = internal::pool_base><br>
+ class tbb::interface6::memory_pool_allocator< T, P ></h3>
+
+Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<p>
-Apply body.apply to each item in the stream.
-<p>
-A Stream s has the requirements <br>
- "S::value_type" <br>
- "s.pop_if_present(value) is convertible to bool
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00571.html">parallel_while.h</a></ul>
+<li><a class="el" href="a00386.html">memory_pool.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00309.html b/doc/html/a00309.html
index a1b9bda..ba14a43 100644
--- a/doc/html/a00309.html
+++ b/doc/html/a00309.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::partition_type_base Class Reference</title>
+<title>tbb::interface6::memory_pool_allocator< void, P > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,39 +21,72 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>internal</b>::<a class="el" href="a00309.html">partition_type_base</a></div>
-<h1>tbb::internal::partition_type_base Class Reference</h1><!-- doxytag: class="tbb::internal::partition_type_base" -->Provides backward-compatible methods for partition objects without affinity.
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00309.html">memory_pool_allocator< void, P ></a></div>
+<h1>tbb::interface6::memory_pool_allocator< void, P > Class Template Reference<br>
+<small>
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::interface6::memory_pool_allocator< void, P >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00575.html">partitioner.h</a>></code>
+<code>#include <memory_pool.h></code>
<p>
-<a href="a00100.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00086.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7cc2e35b1d34d0543b5a029414ef41f8"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::pool_type" ref="7cc2e35b1d34d0543b5a029414ef41f8" args="" -->
+typedef P </td><td class="memItemRight" valign="bottom"><b>pool_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48afbf9aed30662f09217c1fe229861d"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::pointer" ref="48afbf9aed30662f09217c1fe229861d" args="" -->
+typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="94ac6954c897981fc8adf6bf5978145b"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::const_pointer" ref="94ac6954c897981fc8adf6bf5978145b" args="" -->
+typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2b9b8af832a8b240cf22c5cc37406f45"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::value_type" ref="2b9b8af832a8b240cf22c5cc37406f45" args="" -->
+typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5b43011addf53239ccf8cdeaeab76e7"></a><!-- doxytag: member="tbb::internal::partition_type_base::set_affinity" ref="d5b43011addf53239ccf8cdeaeab76e7" args="(task &)" -->
-void </td><td class="memItemRight" valign="bottom"><b>set_affinity</b> (<a class="el" href="a00337.html">task</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1601367c80ed73278e1234012631df24"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="1601367c80ed73278e1234012631df24" args="(pool_type &pool)" -->
+ </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (pool_type &pool) throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bffce16dee5796448bf12c8ccecd94c"></a><!-- doxytag: member="tbb::internal::partition_type_base::note_affinity" ref="2bffce16dee5796448bf12c8ccecd94c" args="(task::affinity_id)" -->
-void </td><td class="memItemRight" valign="bottom"><b>note_affinity</b> (<a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4ce5d3f231c9e786aee8f64d53c7f1a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="e4ce5d3f231c9e786aee8f64d53c7f1a" args="(const memory_pool_allocator &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00308.html">memory_pool_allocator</a> &src) throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="87962b93599ff172cd4b64f2995ebc71"></a><!-- doxytag: member="tbb::internal::partition_type_base::continue_after_execute_range" ref="87962b93599ff172cd4b64f2995ebc71" args="()" -->
-<a class="el" href="a00337.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>continue_after_execute_range</b> ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="49bd821cb72e23714d7efc480ac4cc9d"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="49bd821cb72e23714d7efc480ac4cc9d" args="(const memory_pool_allocator< U, P > &src)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00308.html">memory_pool_allocator</a>< U, P > &src) throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="baca041e2b854196a411f1d0ca7ae905"></a><!-- doxytag: member="tbb::internal::partition_type_base::decide_whether_to_delay" ref="baca041e2b854196a411f1d0ca7ae905" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>decide_whether_to_delay</b> ()</td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67b8e6e057db62e7fdbe985ce275b039"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::my_pool" ref="67b8e6e057db62e7fdbe985ce275b039" args="" -->
+pool_type * </td><td class="memItemRight" valign="bottom"><b>my_pool</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17686f1a5119802cad38369d0580d05f"></a><!-- doxytag: member="tbb::internal::partition_type_base::spawn_or_delay" ref="17686f1a5119802cad38369d0580d05f" args="(bool, task &b)" -->
-void </td><td class="memItemRight" valign="bottom"><b>spawn_or_delay</b> (bool, <a class="el" href="a00337.html">task</a> &b)</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="193c7eeb6ed852d587b652828f52ca92"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="193c7eeb6ed852d587b652828f52ca92" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b></td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f4fe0fa75b911081eff469ddb3e7e52a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::operator==" ref="f4fe0fa75b911081eff469ddb3e7e52a" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
+template<typename V, typename U, typename R> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00308.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00308.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4bb06a39de4a5290b4ec03be19d61c36"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::operator!=" ref="4bb06a39de4a5290b4ec03be19d61c36" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
+template<typename V, typename U, typename R> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00308.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00308.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Provides backward-compatible methods for partition objects without affinity.
+<h3>template<typename P><br>
+ class tbb::interface6::memory_pool_allocator< void, P ></h3>
+
+Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00575.html">partitioner.h</a></ul>
+<li><a class="el" href="a00386.html">memory_pool.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00310.html b/doc/html/a00310.html
index b04898f..e497251 100644
--- a/doc/html/a00310.html
+++ b/doc/html/a00310.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::pipeline Class Reference</title>
+<title>tbb::missing_wait Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,88 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00310.html">pipeline</a></div>
-<h1>tbb::pipeline Class Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::pipeline" -->A processing pipeline that applies filters to items.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00310.html">missing_wait</a></div>
+<h1>tbb::missing_wait Class Reference</h1><!-- doxytag: class="tbb::missing_wait" -->Exception for missing wait on structured_task_group.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00587.html">pipeline.h</a>></code>
+<code>#include <tbb_exception.h></code>
<p>
-<a href="a00107.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00159.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="596dc3beba27099c4c8581cb419e1a59"></a><!-- doxytag: member="tbb::pipeline::pipeline" ref="596dc3beba27099c4c8581cb419e1a59" args="()" -->
-__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty pipeline. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38fb5c9c8395dd6f89a4ae2011a83e0d"></a><!-- doxytag: member="tbb::pipeline::add_filter" ref="38fb5c9c8395dd6f89a4ae2011a83e0d" args="(filter &filter_)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00282.html">filter</a> &filter_)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add filter to end of pipeline. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f627616049b3fe36801f37ee40403ef8"></a><!-- doxytag: member="tbb::pipeline::run" ref="f627616049b3fe36801f37ee40403ef8" args="(size_t max_number_of_live_tokens)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html#f627616049b3fe36801f37ee40403ef8">run</a> (size_t max_number_of_live_tokens)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Run the pipeline to completion. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93d7fec8cd607b803dd2d79fb46bd260"></a><!-- doxytag: member="tbb::pipeline::run" ref="93d7fec8cd607b803dd2d79fb46bd260" args="(size_t max_number_of_live_tokens, tbb::task_group_context &context)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html#93d7fec8cd607b803dd2d79fb46bd260">run</a> (size_t max_number_of_live_tokens, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Run the pipeline to completion with user-supplied context. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c84aef5b834b555ee220b176e25931e"></a><!-- doxytag: member="tbb::pipeline::clear" ref="2c84aef5b834b555ee220b176e25931e" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html#2c84aef5b834b555ee220b176e25931e">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove all filters from the pipeline. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::pipeline::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c991e50853b0cac7da039550344d3ef"></a><!-- doxytag: member="tbb::pipeline::filter" ref="4c991e50853b0cac7da039550344d3ef" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>filter</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::pipeline::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9d033d41ff53a0ae6ef824aceee7ecbc"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_cleaner" ref="9d033d41ff53a0ae6ef824aceee7ecbc" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_cleaner</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1ed99300bc4520a481583c448d6fafd"></a><!-- doxytag: member="tbb::pipeline::tbb::interface6::internal::pipeline_proxy" ref="d1ed99300bc4520a481583c448d6fafd" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::internal::pipeline_proxy</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe3f8527f9013266dc845a4ff22dd2cf"></a><!-- doxytag: member="tbb::missing_wait::what" ref="fe3f8527f9013266dc845a4ff22dd2cf" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A processing pipeline that applies filters to items.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="49513c6c24f9d5bbbb27edca5efe01c9"></a><!-- doxytag: member="tbb::pipeline::~pipeline" ref="49513c6c24f9d5bbbb27edca5efe01c9" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::pipeline::~pipeline </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+Exception for missing wait on structured_task_group.
<p>
-Though the current implementation declares the destructor virtual, do not rely on this detail. The virtualness is deprecated and may disappear in future versions of TBB.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00587.html">pipeline.h</a></ul>
+<li>tbb_exception.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00311.html b/doc/html/a00311.html
index 9ac5444..6a7d0d4 100644
--- a/doc/html/a00311.html
+++ b/doc/html/a00311.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::pre_scan_tag Struct Reference</title>
+<title>tbb::movable_exception< ExceptionData > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,30 +21,148 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00311.html">pre_scan_tag</a></div>
-<h1>tbb::pre_scan_tag Struct Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::pre_scan_tag" -->Used to indicate that the initial scan is being performed.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00311.html">movable_exception</a></div>
+<h1>tbb::movable_exception< ExceptionData > Class Template Reference</h1><!-- doxytag: class="tbb::movable_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00562.html">parallel_scan.h</a>></code>
+<code>#include <tbb_exception.h></code>
<p>
-<a href="a00096.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::movable_exception< ExceptionData >:
+<p><center><img src="a00311.png" usemap="#tbb::movable_exception< ExceptionData >_map" border="0" alt=""></center>
+<map name="tbb::movable_exception< ExceptionData >_map">
+<area href="a00358.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,248,24">
+</map>
+<a href="a00163.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d45d2cf548e51140ad6faafbea8ca6b5"></a><!-- doxytag: member="tbb::pre_scan_tag::is_final_scan" ref="d45d2cf548e51140ad6faafbea8ca6b5" args="()" -->
-static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="43dfdc5298df3aa8a7d7d146604f84ef"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="43dfdc5298df3aa8a7d7d146604f84ef" args="(const ExceptionData &data_)" -->
+ </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const ExceptionData &data_)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48f97fbf1e5d66c5977891f4375ee4d9"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="48f97fbf1e5d66c5977891f4375ee4d9" args="(const movable_exception &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const <a class="el" href="a00311.html">movable_exception</a> &src) throw ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dfafefe27f2afaa7c7894ca9c71cc568"></a><!-- doxytag: member="tbb::movable_exception::operator=" ref="dfafefe27f2afaa7c7894ca9c71cc568" args="(const movable_exception &src)" -->
+const <a class="el" href="a00311.html">movable_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00311.html">movable_exception</a> &src)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="47114cbc20c8e13cac3108749a3e085d"></a><!-- doxytag: member="tbb::movable_exception::data" ref="47114cbc20c8e13cac3108749a3e085d" args="()" -->
+ExceptionData & </td><td class="memItemRight" valign="bottom"><b>data</b> () throw ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7d93c000d862d2558efd9a34817adbce"></a><!-- doxytag: member="tbb::movable_exception::data" ref="7d93c000d862d2558efd9a34817adbce" args="() const " -->
+const ExceptionData & </td><td class="memItemRight" valign="bottom"><b>data</b> () const throw ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc5f5c4739b17ac5211ac58226c2f5a5"></a><!-- doxytag: member="tbb::movable_exception::name" ref="bc5f5c4739b17ac5211ac58226c2f5a5" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b33a89bccf0c63106f1270c7bfaaf54f"></a><!-- doxytag: member="tbb::movable_exception::what" ref="b33a89bccf0c63106f1270c7bfaaf54f" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00311.html#b33a89bccf0c63106f1270c7bfaaf54f">what()</a> method. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00311.html">movable_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object. <a href="#1aea0ad179d6f0481fe7f3495f66adf9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00311.html#1aea0ad179d6f0481fe7f3495f66adf9">move()</a> method. <a href="#7a46873119d9f85a7b0009c13e41a258"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#17cffba35811c92b7e65d63506b69602">throw_self</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object. <a href="#17cffba35811c92b7e65d63506b69602"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8c0ae2089ae784b28907cf748b89416"></a><!-- doxytag: member="tbb::movable_exception::my_exception_data" ref="a8c0ae2089ae784b28907cf748b89416" args="" -->
+ExceptionData </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">User data. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Used to indicate that the initial scan is being performed.
+<h3>template<typename ExceptionData><br>
+ class tbb::movable_exception< ExceptionData ></h3>
+
+Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread.
+<p>
+Code using TBB can instantiate this template with an arbitrary ExceptionData type and throw this exception object. Such exceptions are intercepted by the TBB scheduler and delivered to the root thread (). <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00358.html">tbb::tbb_exception</a> </dd></dl>
+
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="7a46873119d9f85a7b0009c13e41a258"></a><!-- doxytag: member="tbb::movable_exception::destroy" ref="7a46873119d9f85a7b0009c13e41a258" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename ExceptionData> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00311.html">tbb::movable_exception</a>< ExceptionData >::destroy </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> throw ()<code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroys objects created by the <a class="el" href="a00311.html#1aea0ad179d6f0481fe7f3495f66adf9">move()</a> method.
+<p>
+Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
+<p>
+Implements <a class="el" href="a00358.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="1aea0ad179d6f0481fe7f3495f66adf9"></a><!-- doxytag: member="tbb::movable_exception::move" ref="1aea0ad179d6f0481fe7f3495f66adf9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename ExceptionData> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00311.html">movable_exception</a>* <a class="el" href="a00311.html">tbb::movable_exception</a>< ExceptionData >::move </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> throw ()<code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Creates and returns pointer to the deep copy of this exception object.
+<p>
+Move semantics is allowed.
+<p>
+Implements <a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="17cffba35811c92b7e65d63506b69602"></a><!-- doxytag: member="tbb::movable_exception::throw_self" ref="17cffba35811c92b7e65d63506b69602" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename ExceptionData> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00311.html">tbb::movable_exception</a>< ExceptionData >::throw_self </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Throws this exception object.
+<p>
+Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00562.html">parallel_scan.h</a></ul>
+Implements <a class="el" href="a00358.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li>tbb_exception.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00299.png b/doc/html/a00311.png
similarity index 100%
copy from doc/html/a00299.png
copy to doc/html/a00311.png
diff --git a/doc/html/a00312.html b/doc/html/a00312.html
index 14f3f9d..f08a513 100644
--- a/doc/html/a00312.html
+++ b/doc/html/a00312.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::priority_queue_node< T, Compare, A > Class Template Reference</title>
+<title>tbb::flow::interface6::multifunction_node< Input, Output,, Allocator > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,110 +21,52 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00312.html">priority_queue_node</a></div>
-<h1>tbb::flow::interface6::priority_queue_node< T, Compare, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::priority_queue_node" --><!-- doxytag: inherits="tbb::flow::interface6::buffer_node" -->Forwards messages in priority order.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00312.html">multifunction_node</a></div>
+<h1>tbb::flow::interface6::multifunction_node< Input, Output,, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::multifunction_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->implements a function node that supports Input -> (set of outputs)
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::priority_queue_node< T, Compare, A >:
-<p><center><img src="a00312.png" usemap="#tbb::flow::interface6::priority_queue_node< T, Compare, A >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::priority_queue_node< T, Compare, A >_map">
-<area href="a00263.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,352,24">
-<area href="a00321.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="362,0,714,24">
-<area href="a00327.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="724,0,1076,24">
+<p>Inheritance diagram for tbb::flow::interface6::multifunction_node< Input, Output,, Allocator >:
+<p><center><img src="a00312.png" usemap="#tbb::flow::interface6::multifunction_node< Input, Output,, Allocator >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::multifunction_node< Input, Output,, Allocator >_map">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,393,24">
</map>
-<a href="a00076.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00066.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2829b518979874ad3d2a939e14ae7bd"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::input_type" ref="b2829b518979874ad3d2a939e14ae7bd" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00312.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f8f076085598fc5687fdc00d7756ad4"></a><!-- doxytag: member="tbb::flow::interface6::multifunction_node::input_type" ref="9f8f076085598fc5687fdc00d7756ad4" args="" -->
+typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2cb099b590246b6bc93cc15e78c6ee5c"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::output_type" ref="2cb099b590246b6bc93cc15e78c6ee5c" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00312.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c812b3b65869982413f783ce7c699564"></a><!-- doxytag: member="tbb::flow::interface6::multifunction_node::output_ports_type" ref="c812b3b65869982413f783ce7c699564" args="" -->
+typedef internal::wrap_tuple_elements<<br>
+ N, internal::multifunction_output,<br>
+ Output >::type </td><td class="memItemRight" valign="bottom"><b>output_ports_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdea783bf9d5a4c98e794ac7e0f84ccf"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::predecessor_type" ref="fdea783bf9d5a4c98e794ac7e0f84ccf" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< <a class="el" href="a00312.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00312.html#fdea783bf9d5a4c98e794ac7e0f84ccf">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09ab5064ca8192e68c03da47603e68eb"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::successor_type" ref="09ab5064ca8192e68c03da47603e68eb" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00312.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00312.html#09ab5064ca8192e68c03da47603e68eb">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="497ec2612615249bf5a294eb1b7b93b3"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::priority_queue_node" ref="497ec2612615249bf5a294eb1b7b93b3" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00312.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a> (<a class="el" href="a00288.html">graph</a> &g)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17a4f66e23d54100b64805405e905d62"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::priority_queue_node" ref="17a4f66e23d54100b64805405e905d62" args="(const priority_queue_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00312.html#17a4f66e23d54100b64805405e905d62">priority_queue_node</a> (const <a class="el" href="a00312.html">priority_queue_node</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1c6c5e02b9cc144b2b3ccc9f18bf047"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::size_type" ref="d1c6c5e02b9cc144b2b3ccc9f18bf047" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
->::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb98634e74bee4d82676f1aca0f6864c"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::item_type" ref="eb98634e74bee4d82676f1aca0f6864c" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
->::item_type </td><td class="memItemRight" valign="bottom"><b>item_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f80f04dc8886a8a6b177123f094bdb43"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::prio_operation" ref="f80f04dc8886a8a6b177123f094bdb43" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
->::buffer_operation </td><td class="memItemRight" valign="bottom"><b>prio_operation</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="274cc306c7a22cf9e27c4c2c3a66ce8e579c547cd1c044d3e6190401d87ee101"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::WAIT" ref="274cc306c7a22cf9e27c4c2c3a66ce8e579c547cd1c044d3e6190401d87ee101" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="274cc306c7a22cf9e27c4c2c3a66ce8e67ced6b76fb4bcd40404499619fbd0b9"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::SUCCEEDED" ref="274cc306c7a22cf9e27c4c2c3a66ce8e67ced6b76fb4bcd40404499619fbd0b9" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5112769f6063d733734c1631ab105911"></a><!-- doxytag: member="tbb::flow::interface6::multifunction_node::multifunction_node" ref="5112769f6063d733734c1631ab105911" args="(graph &g, size_t concurrency, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>multifunction_node</b> (<a class="el" href="a00300.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="274cc306c7a22cf9e27c4c2c3a66ce8eb74545a431cbeaf85ab0bfcec52261ff"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::FAILED" ref="274cc306c7a22cf9e27c4c2c3a66ce8eb74545a431cbeaf85ab0bfcec52261ff" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0,
-<b>SUCCEEDED</b>,
-<b>FAILED</b>
- }</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4aa18bfb6faef08ddf94364013ef0f28"></a><!-- doxytag: member="tbb::flow::interface6::multifunction_node::multifunction_node" ref="4aa18bfb6faef08ddf94364013ef0f28" args="(const multifunction_node &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>multifunction_node</b> (const <a class="el" href="a00312.html">multifunction_node</a> &other)</td></tr>
<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="abff2e0891477135c24f44747e991c6c"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::handle_operations" ref="abff2e0891477135c24f44747e991c6c" args="(prio_operation *op_list)" -->
-void </td><td class="memItemRight" valign="bottom"><b>handle_operations</b> (prio_operation *op_list)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed2d8dc0a9c1c2571e4a69df2f2209e5"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_forward" ref="ed2d8dc0a9c1c2571e4a69df2f2209e5" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00312.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a> (prio_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d8747ea54ca84a7196f8cacdc81ca5"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_push" ref="05d8747ea54ca84a7196f8cacdc81ca5" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_push</b> (prio_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6c7cd11240fbe0737344f36b587492f9"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_pop" ref="6c7cd11240fbe0737344f36b587492f9" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (prio_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9238c5c44ccc46ed1be218651f36feea"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_reserve" ref="9238c5c44ccc46ed1be218651f36feea" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (prio_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="caefc7ba7a16a7120b6b37de42e705b4"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_consume" ref="caefc7ba7a16a7120b6b37de42e705b4" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (prio_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="400304719e359e66e9560157577fc2fe"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_release" ref="400304719e359e66e9560157577fc2fe" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_release</b> (prio_operation *op)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0dae0f7e38a5ddbf9eda318f366568da"></a><!-- doxytag: member="tbb::flow::interface6::multifunction_node::reset" ref="0dae0f7e38a5ddbf9eda318f366568da" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>><br>
- class tbb::flow::interface6::priority_queue_node< T, Compare, A ></h3>
+<h3>template<typename Input, typename Output, graph_buffer_policy = queueing, typename Allocator = cache_aligned_allocator<Input>><br>
+ class tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></h3>
-Forwards messages in priority order.
+implements a function node that supports Input -> (set of outputs)
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00312.png b/doc/html/a00312.png
index 1e0df07..cdab3e3 100644
Binary files a/doc/html/a00312.png and b/doc/html/a00312.png differ
diff --git a/doc/html/a00313.html b/doc/html/a00313.html
index 4c75268..ae0b6d1 100644
--- a/doc/html/a00313.html
+++ b/doc/html/a00313.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::queue_node< T, A > Class Template Reference</title>
+<title>tbb::mutex Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,98 +21,113 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00313.html">queue_node</a></div>
-<h1>tbb::flow::interface6::queue_node< T, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::queue_node" --><!-- doxytag: inherits="tbb::flow::interface6::buffer_node" -->Forwards messages in FIFO order.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00313.html">mutex</a></div>
+<h1>tbb::mutex Class Reference<br>
+<small>
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::mutex" -->Wrapper around the platform's native reader-writer lock.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <mutex.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::queue_node< T, A >:
-<p><center><img src="a00313.png" usemap="#tbb::flow::interface6::queue_node< T, A >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::queue_node< T, A >_map">
-<area href="a00263.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="280,56,550,80">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,270,24">
-<area href="a00321.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="280,0,550,24">
-<area href="a00327.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="560,0,830,24">
-<area href="a00328.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="280,168,550,192">
-</map>
-<a href="a00074.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00090.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e71030845210b6c4c7380eb9e11a2ac"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::input_type" ref="1e71030845210b6c4c7380eb9e11a2ac" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f1ec84d5815263ceae853f06ddb4cac"></a><!-- doxytag: member="tbb::mutex::native_handle_type" ref="9f1ec84d5815263ceae853f06ddb4cac" args="" -->
+typedef LPCRITICAL_SECTION </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="25b5a53ab1f9a342644fa3759bc0b1ad"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::output_type" ref="25b5a53ab1f9a342644fa3759bc0b1ad" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return native_handle. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1f4d4b88a03eb3e95c76569b91a0792"></a><!-- doxytag: member="tbb::mutex::native_handle_type" ref="a1f4d4b88a03eb3e95c76569b91a0792" args="" -->
+typedef pthread_mutex_t * </td><td class="memItemRight" valign="bottom"><b>native_handle_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e2fdd33c45d44549dee9c1638e19898"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::predecessor_type" ref="5e2fdd33c45d44549dee9c1638e19898" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< <a class="el" href="a00313.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#5e2fdd33c45d44549dee9c1638e19898">predecessor_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab196034e5963fe9e27d7c4d0a2d4ffa24a50a7"></a><!-- doxytag: member="tbb::mutex::INITIALIZED" ref="c907aa5ae5274da759c4188c8ab196034e5963fe9e27d7c4d0a2d4ffa24a50a7" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>INITIALIZED</b> = 0x1234</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f35076a19f256f9e7a61bed77ca1ccc5"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::successor_type" ref="f35076a19f256f9e7a61bed77ca1ccc5" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00313.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#f35076a19f256f9e7a61bed77ca1ccc5">successor_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd"></a><!-- doxytag: member="tbb::mutex::DESTROYED" ref="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>DESTROYED</b> = 0x789A</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c716593a92448b0f429d1f3a38e67996"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::queue_node" ref="c716593a92448b0f429d1f3a38e67996" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#c716593a92448b0f429d1f3a38e67996">queue_node</a> (<a class="el" href="a00288.html">graph</a> &g)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab196031de5796ebbbaa1e30d19e5d54f0f6555"></a><!-- doxytag: member="tbb::mutex::HELD" ref="c907aa5ae5274da759c4188c8ab196031de5796ebbbaa1e30d19e5d54f0f6555" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>HELD</b> = 0x56CD</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0226762d9ebba28311b7b1518d948ab1"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::queue_node" ref="0226762d9ebba28311b7b1518d948ab1" args="(const queue_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a> (const <a class="el" href="a00313.html">queue_node</a> &src)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>state_t</b> { <b>INITIALIZED</b> = 0x1234,
+<b>DESTROYED</b> = 0x789A,
+<b>HELD</b> = 0x56CD
+ }</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a84ab6bb43d056468ac5df3626219513"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::size_type" ref="a84ab6bb43d056468ac5df3626219513" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
->::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05313cb77d4f85213103d4dab74ed454"></a><!-- doxytag: member="tbb::mutex::mutex" ref="05313cb77d4f85213103d4dab74ed454" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#05313cb77d4f85213103d4dab74ed454">mutex</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="63c3b0a76cd7964dec2f3d54afbb05f3"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::queue_operation" ref="63c3b0a76cd7964dec2f3d54afbb05f3" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
->::buffer_operation </td><td class="memItemRight" valign="bottom"><b>queue_operation</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4470e61c24c129a0299ca6c17240adbb"></a><!-- doxytag: member="tbb::mutex::lock" ref="4470e61c24c129a0299ca6c17240adbb" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#4470e61c24c129a0299ca6c17240adbb">lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b748e310297e1e3f88952a2a9876bab979763449c8716cdd38fda58e607551f1"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::WAIT" ref="b748e310297e1e3f88952a2a9876bab979763449c8716cdd38fda58e607551f1" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#4331652c79dea1c1131bd59ab161b234">try_lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b748e310297e1e3f88952a2a9876bab923e845160e46a20fb8550132f04e94aa"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::SUCCEEDED" ref="b748e310297e1e3f88952a2a9876bab923e845160e46a20fb8550132f04e94aa" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#4331652c79dea1c1131bd59ab161b234"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fc9ef443ae75d966695546be399cc6b"></a><!-- doxytag: member="tbb::mutex::unlock" ref="5fc9ef443ae75d966695546be399cc6b" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#5fc9ef443ae75d966695546be399cc6b">unlock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b748e310297e1e3f88952a2a9876bab9ad699b139814d0746be2266041081474"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::FAILED" ref="b748e310297e1e3f88952a2a9876bab9ad699b139814d0746be2266041081474" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="caf34349c0fbe7b44f1a2ca0a3150dd0"></a><!-- doxytag: member="tbb::mutex::native_handle" ref="caf34349c0fbe7b44f1a2ca0a3150dd0" args="()" -->
+<a class="el" href="a00313.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0,
-<b>SUCCEEDED</b>,
-<b>FAILED</b>
- }</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="795649a185b0d6af6dc81c5f378616dd"></a><!-- doxytag: member="tbb::mutex::set_state" ref="795649a185b0d6af6dc81c5f378616dd" args="(state_t to)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#795649a185b0d6af6dc81c5f378616dd">set_state</a> (state_t to)</td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eadcbbb81f9a9d223afabe0f40e77ecb"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_forward" ref="eadcbbb81f9a9d223afabe0f40e77ecb" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a> (queue_operation *op)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the internal state. <br></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17b78176054e2bac1ff35b9535d1ea0c"></a><!-- doxytag: member="tbb::mutex::is_rw_mutex" ref="17b78176054e2bac1ff35b9535d1ea0c" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cfd2350a4c9d14486a8a9285acb9ca49"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_pop" ref="cfd2350a4c9d14486a8a9285acb9ca49" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (queue_operation *op)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d4558e5a7c5b8d8e158ec7a1079669bd"></a><!-- doxytag: member="tbb::mutex::is_recursive_mutex" ref="d4558e5a7c5b8d8e158ec7a1079669bd" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf478ff2ae265ec859928191e2f7dbe3"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_reserve" ref="bf478ff2ae265ec859928191e2f7dbe3" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (queue_operation *op)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f023a29c61451d02359095cbff0f3d45"></a><!-- doxytag: member="tbb::mutex::is_fair_mutex" ref="f023a29c61451d02359095cbff0f3d45" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d67eee760d9fd829064927e7fe1b54fb"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_consume" ref="d67eee760d9fd829064927e7fe1b54fb" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (queue_operation *op)</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00314.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
- class tbb::flow::interface6::queue_node< T, A ></h3>
+Wrapper around the platform's native reader-writer lock.
+<p>
+For testing purposes only.
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="4331652c79dea1c1131bd59ab161b234"></a><!-- doxytag: member="tbb::mutex::try_lock" ref="4331652c79dea1c1131bd59ab161b234" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool tbb::mutex::try_lock </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-Forwards messages in FIFO order.
<p>
+Try acquiring lock (non-blocking).
+<p>
+Return true if lock acquired; false otherwise.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00314.html b/doc/html/a00314.html
index 0690b93..9b51e7f 100644
--- a/doc/html/a00314.html
+++ b/doc/html/a00314.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::queuing_mutex Class Reference</title>
+<title>tbb::mutex::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,48 +21,54 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00314.html">queuing_mutex</a></div>
-<h1>tbb::queuing_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::queuing_mutex" -->Queuing mutex with local-only spinning.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00313.html">mutex</a>::<a class="el" href="a00314.html">scoped_lock</a></div>
+<h1>tbb::mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::mutex::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00603.html">queuing_mutex.h</a>></code>
+<code>#include <mutex.h></code>
<p>
-<a href="a00110.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00091.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b389ad9c4db7293e4bdb5b8cda69ec04"></a><!-- doxytag: member="tbb::queuing_mutex::queuing_mutex" ref="b389ad9c4db7293e4bdb5b8cda69ec04" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d403ae51b484df5d86d85ae38f11e6e"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="1d403ae51b484df5d86d85ae38f11e6e" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c1fe92760dcd1c5a7ed52c6599a72f"></a><!-- doxytag: member="tbb::queuing_mutex::internal_construct" ref="96c1fe92760dcd1c5a7ed52c6599a72f" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="605a6b9af0f8cdabdf81825e0de99600"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="605a6b9af0f8cdabdf81825e0de99600" args="(mutex &mutex)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a> (<a class="el" href="a00313.html">mutex</a> &<a class="el" href="a00313.html">mutex</a>)</td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="420932f70ff3b85f7280ff11a133938d"></a><!-- doxytag: member="tbb::queuing_mutex::is_rw_mutex" ref="420932f70ff3b85f7280ff11a133938d" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ebbbecaf4311e9df7362cb76ceaa368"></a><!-- doxytag: member="tbb::mutex::scoped_lock::~scoped_lock" ref="0ebbbecaf4311e9df7362cb76ceaa368" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dc0c749f3a4e6ea75418677cb8f9205f"></a><!-- doxytag: member="tbb::queuing_mutex::is_recursive_mutex" ref="dc0c749f3a4e6ea75418677cb8f9205f" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="862e022841cdc522e4296a5533b22efd"></a><!-- doxytag: member="tbb::mutex::scoped_lock::acquire" ref="862e022841cdc522e4296a5533b22efd" args="(mutex &mutex)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html#862e022841cdc522e4296a5533b22efd">acquire</a> (<a class="el" href="a00313.html">mutex</a> &<a class="el" href="a00313.html">mutex</a>)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55d5339e4ca04b759f90c0c1ef966539"></a><!-- doxytag: member="tbb::queuing_mutex::is_fair_mutex" ref="55d5339e4ca04b759f90c0c1ef966539" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="591e0c49b82bcedffcbe0923f1b915ec"></a><!-- doxytag: member="tbb::mutex::scoped_lock::try_acquire" ref="591e0c49b82bcedffcbe0923f1b915ec" args="(mutex &mutex)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a> (<a class="el" href="a00313.html">mutex</a> &<a class="el" href="a00313.html">mutex</a>)</td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d51d18cd99df3b2e93bf07378d0992c"></a><!-- doxytag: member="tbb::mutex::scoped_lock::release" ref="0d51d18cd99df3b2e93bf07378d0992c" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html#0d51d18cd99df3b2e93bf07378d0992c">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93062a14ad2e50e2b7b485b913170779"></a><!-- doxytag: member="tbb::mutex::scoped_lock::mutex" ref="93062a14ad2e50e2b7b485b913170779" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>mutex</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00315.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Queuing mutex with local-only spinning.
+The scoped locking pattern.
+<p>
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00603.html">queuing_mutex.h</a></ul>
+<li>mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00315.html b/doc/html/a00315.html
index 82298ac..c79a61b 100644
--- a/doc/html/a00315.html
+++ b/doc/html/a00315.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::queuing_mutex::scoped_lock Class Reference</title>
+<title>tbb::null_mutex Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,71 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00314.html">queuing_mutex</a>::<a class="el" href="a00315.html">scoped_lock</a></div>
-<h1>tbb::queuing_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_mutex::scoped_lock" -->The scoped locking pattern.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00315.html">null_mutex</a></div>
+<h1>tbb::null_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::null_mutex" -->A mutex which does nothing.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00603.html">queuing_mutex.h</a>></code>
+<code>#include <null_mutex.h></code>
<p>
-<a href="a00111.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00092.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a960bed8b19a4d111ca047de206f5f77"></a><!-- doxytag: member="tbb::null_mutex::is_rw_mutex" ref="a960bed8b19a4d111ca047de206f5f77" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <a href="#db0fa3967491014572e24d6607bdc971"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9b51ef972f5618ac17caadb58841ab6d"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="9b51ef972f5618ac17caadb58841ab6d" args="(queuing_mutex &m)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a> (<a class="el" href="a00314.html">queuing_mutex</a> &m)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0fefed74b341d43ccf0e2fc30d31b75"></a><!-- doxytag: member="tbb::null_mutex::is_recursive_mutex" ref="a0fefed74b341d43ccf0e2fc30d31b75" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac2c576a93570957d694192a5f491443"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::~scoped_lock" ref="ac2c576a93570957d694192a5f491443" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="707cf399055d68177b1d64c2e112603a"></a><!-- doxytag: member="tbb::null_mutex::is_fair_mutex" ref="707cf399055d68177b1d64c2e112603a" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="533e4fc8355ee321206a0609c42d909d"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::acquire" ref="533e4fc8355ee321206a0609c42d909d" args="(queuing_mutex &m)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#533e4fc8355ee321206a0609c42d909d">acquire</a> (<a class="el" href="a00314.html">queuing_mutex</a> &m)</td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html">scoped_lock</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e5a014fb817599386a87170cf2cf51a9"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::try_acquire" ref="e5a014fb817599386a87170cf2cf51a9" args="(queuing_mutex &m)" -->
-bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a> (<a class="el" href="a00314.html">queuing_mutex</a> &m)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex if free (i.e. non-blocking). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bf2b8c87ff22115be9b2eac179f2d30"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::release" ref="3bf2b8c87ff22115be9b2eac179f2d30" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00316.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern.
-<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="db0fa3967491014572e24d6607bdc971"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="db0fa3967491014572e24d6607bdc971" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::queuing_mutex::scoped_lock::scoped_lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+A mutex which does nothing.
<p>
-Construct lock that has not acquired a mutex.
+A <a class="el" href="a00315.html">null_mutex</a> does no operation and simulates success.
<p>
-Equivalent to zero-initialization of *this.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00603.html">queuing_mutex.h</a></ul>
+<li>null_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00316.html b/doc/html/a00316.html
index 0c5953b..090ab64 100644
--- a/doc/html/a00316.html
+++ b/doc/html/a00316.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::queuing_rw_mutex Class Reference</title>
+<title>tbb::null_mutex::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,54 +21,36 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00316.html">queuing_rw_mutex</a></div>
-<h1>tbb::queuing_rw_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::queuing_rw_mutex" -->Queuing reader-writer mutex with local-only spinning.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00315.html">null_mutex</a>::<a class="el" href="a00316.html">scoped_lock</a></div>
+<h1>tbb::null_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_mutex::scoped_lock" -->Represents acquisition of a mutex.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00604.html">queuing_rw_mutex.h</a>></code>
+<code>#include <null_mutex.h></code>
<p>
-<a href="a00112.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00093.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="85c90877c3447690ac4e2ac4ff8dea5e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::queuing_rw_mutex" ref="85c90877c3447690ac4e2ac4ff8dea5e" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="765e64065919fdd9665e78b5ec4d3c6f"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::scoped_lock" ref="765e64065919fdd9665e78b5ec4d3c6f" args="(null_mutex &)" -->
+ </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b> (<a class="el" href="a00315.html">null_mutex</a> &)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ba73e3d95cfdf8323880bc623af9099"></a><!-- doxytag: member="tbb::queuing_rw_mutex::~queuing_rw_mutex" ref="1ba73e3d95cfdf8323880bc623af9099" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6889f00ca3946906e89e856988bb890"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::acquire" ref="f6889f00ca3946906e89e856988bb890" args="(null_mutex &)" -->
+void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00315.html">null_mutex</a> &)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. q_tail is non-NULL. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb88522d145ad7bcf5bebfa7d2a6122b"></a><!-- doxytag: member="tbb::queuing_rw_mutex::internal_construct" ref="eb88522d145ad7bcf5bebfa7d2a6122b" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90eb562a9de52b33362a6fe237b3df42"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::try_acquire" ref="90eb562a9de52b33362a6fe237b3df42" args="(null_mutex &)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>try_acquire</b> (<a class="el" href="a00315.html">null_mutex</a> &)</td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0dc1e28d3033e8f9556f5b13b7b57d0f"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_rw_mutex" ref="0dc1e28d3033e8f9556f5b13b7b57d0f" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b29fdf07b4c295850a6e433001c2c6a7"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::release" ref="b29fdf07b4c295850a6e433001c2c6a7" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e6ad08ef251f9ea898bd5f67963869c5"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_recursive_mutex" ref="e6ad08ef251f9ea898bd5f67963869c5" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="147b34120505e419f6ea8d631ec4375d"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_fair_mutex" ref="147b34120505e419f6ea8d631ec4375d" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00317.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Queuing reader-writer mutex with local-only spinning.
-<p>
-Adapted from Krieger, Stumm, et al. pseudocode at <a href="http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93">http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93</a>
+Represents acquisition of a mutex.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00604.html">queuing_rw_mutex.h</a></ul>
+<li>null_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00317.html b/doc/html/a00317.html
index 53e1ba5..f7f3705 100644
--- a/doc/html/a00317.html
+++ b/doc/html/a00317.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::queuing_rw_mutex::scoped_lock Class Reference</title>
+<title>tbb::null_rw_mutex Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,100 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00316.html">queuing_rw_mutex</a>::<a class="el" href="a00317.html">scoped_lock</a></div>
-<h1>tbb::queuing_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_rw_mutex::scoped_lock" -->The scoped locking pattern.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00317.html">null_rw_mutex</a></div>
+<h1>tbb::null_rw_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::null_rw_mutex" -->A rw mutex which does nothing.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00604.html">queuing_rw_mutex.h</a>></code>
+<code>#include <null_rw_mutex.h></code>
<p>
-<a href="a00113.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00094.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2f3235cbf63812f72e5755a4c820f523"></a><!-- doxytag: member="tbb::null_rw_mutex::is_rw_mutex" ref="2f3235cbf63812f72e5755a4c820f523" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <a href="#c62e365be7bcbba091c9ea7454a4d22c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fbb8798792d3aebb136c46fc63d2529e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="fbb8798792d3aebb136c46fc63d2529e" args="(queuing_rw_mutex &m, bool write=true)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a> (<a class="el" href="a00316.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e33ac3b047901e69e7997a16e221a330"></a><!-- doxytag: member="tbb::null_rw_mutex::is_recursive_mutex" ref="e33ac3b047901e69e7997a16e221a330" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="32c7d67a660d23ebbaab1a1d2826d31a"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::~scoped_lock" ref="32c7d67a660d23ebbaab1a1d2826d31a" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e5248faf1412f9283185a0b5d72d7456"></a><!-- doxytag: member="tbb::null_rw_mutex::is_fair_mutex" ref="e5248faf1412f9283185a0b5d72d7456" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8dd5ab8686e76de21587544dbb681e0"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::acquire" ref="a8dd5ab8686e76de21587544dbb681e0" args="(queuing_rw_mutex &m, bool write=true)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a> (<a class="el" href="a00316.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html">scoped_lock</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e4ff6c9ec2fee6682f95290d1f42baa"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::try_acquire" ref="2e4ff6c9ec2fee6682f95290d1f42baa" args="(queuing_rw_mutex &m, bool write=true)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a> (<a class="el" href="a00316.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex if free (i.e. non-blocking). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67ae221109ddc69510ab593874e435d4"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::release" ref="67ae221109ddc69510ab593874e435d4" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#67ae221109ddc69510ab593874e435d4">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer. <a href="#11ba1da4a722c9e6f73339a52c487e82"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d2f93edf7b15ec4bcee138823220c52"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::downgrade_to_reader" ref="0d2f93edf7b15ec4bcee138823220c52" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Downgrade writer to become a reader. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00318.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern.
-<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="c62e365be7bcbba091c9ea7454a4d22c"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="c62e365be7bcbba091c9ea7454a4d22c" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::queuing_rw_mutex::scoped_lock::scoped_lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Construct lock that has not acquired a mutex.
-<p>
-Equivalent to zero-initialization of *this.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="11ba1da4a722c9e6f73339a52c487e82"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer" ref="11ba1da4a722c9e6f73339a52c487e82" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+A rw mutex which does nothing.
<p>
-Upgrade reader to become a writer.
+A <a class="el" href="a00317.html">null_rw_mutex</a> is a rw mutex that does nothing and simulates successful operation.
<p>
-Returns whether the upgrade happened without releasing and re-acquiring the lock
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00604.html">queuing_rw_mutex.h</a></ul>
+<li>null_rw_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00318.html b/doc/html/a00318.html
index 4036939..bf12331 100644
--- a/doc/html/a00318.html
+++ b/doc/html/a00318.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::reader_writer_lock Class Reference</title>
+<title>tbb::null_rw_mutex::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,198 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00318.html">reader_writer_lock</a></div>
-<h1>tbb::interface5::reader_writer_lock Class Reference<br>
-<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock" -->Writer-preference reader-writer lock with local-only spinning on readers.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00317.html">null_rw_mutex</a>::<a class="el" href="a00318.html">scoped_lock</a></div>
+<h1>tbb::null_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_rw_mutex::scoped_lock" -->Represents acquisition of a mutex.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00605.html">reader_writer_lock.h</a>></code>
+<code>#include <null_rw_mutex.h></code>
<p>
-<a href="a00114.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00095.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf005142e2b9af377a8d33c6604d858862"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::waiting_nonblocking" ref="6f921f0d7c1812ceb5674418c8b6ccaf005142e2b9af377a8d33c6604d858862" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>waiting_nonblocking</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf18bcc9aae8f056c34fb61bb7fc39b432"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::waiting" ref="6f921f0d7c1812ceb5674418c8b6ccaf18bcc9aae8f056c34fb61bb7fc39b432" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>waiting</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf423c082d5cdc9bb12d0eeadcae56adb5"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::active" ref="6f921f0d7c1812ceb5674418c8b6ccaf423c082d5cdc9bb12d0eeadcae56adb5" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>active</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccafa9a5b17bdfb0a6d59b3cd58fecbd9610"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::invalid" ref="6f921f0d7c1812ceb5674418c8b6ccafa9a5b17bdfb0a6d59b3cd58fecbd9610" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>invalid</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { <b>waiting_nonblocking</b>,
-<b>waiting</b>,
-<b>active</b>,
-<b>invalid</b>
- }</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Status type for nodes associated with lock instances. <a href="a00318.html#6f921f0d7c1812ceb5674418c8b6ccaf">More...</a><br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c1431c4293e777efd9aab9a95c2a46e1"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::reader_writer_lock" ref="c1431c4293e777efd9aab9a95c2a46e1" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00318.html">reader_writer_lock</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5135f64f7b7339017f33d956445edbee"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::~reader_writer_lock" ref="5135f64f7b7339017f33d956445edbee" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructs a <a class="el" href="a00318.html">reader_writer_lock</a> object. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html#2653d1a2d560059a51219a8ceab3ade9">lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e11281a13a7b6243c6c9ab243c5ad5a8"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::scoped_lock" ref="e11281a13a7b6243c6c9ab243c5ad5a8" args="(null_rw_mutex &, bool=true)" -->
+ </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b> (<a class="el" href="a00317.html">null_rw_mutex</a> &, bool=true)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00318.html">reader_writer_lock</a> for write. <a href="#2653d1a2d560059a51219a8ceab3ade9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html#721eb173e154ab38292273e9266a9b07">try_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72c4c302fdfc20187a650348e432b0a7"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::acquire" ref="72c4c302fdfc20187a650348e432b0a7" args="(null_rw_mutex &, bool=true)" -->
+void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00317.html">null_rw_mutex</a> &, bool=true)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00318.html">reader_writer_lock</a> for write. <a href="#721eb173e154ab38292273e9266a9b07"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa1e2a5592ee2672470ea44d98f1c498"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::upgrade_to_writer" ref="fa1e2a5592ee2672470ea44d98f1c498" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>upgrade_to_writer</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00318.html">reader_writer_lock</a> for read. <a href="#d9d16a24d9f6c3dada73c6b9ff214f5b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="efcb7948649e1652d59aaff9c8ea40f1"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::downgrade_to_reader" ref="efcb7948649e1652d59aaff9c8ea40f1" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>downgrade_to_reader</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00318.html">reader_writer_lock</a> for read. <a href="#595fb23952e3b89426b1f7938dea9b11"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5113b32689305599b2c36b5831547704"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::unlock" ref="5113b32689305599b2c36b5831547704" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html#5113b32689305599b2c36b5831547704">unlock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="56686c4dfe4a32a1d9bd8e7e729130e6"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::try_acquire" ref="56686c4dfe4a32a1d9bd8e7e729130e6" args="(null_rw_mutex &, bool=true)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>try_acquire</b> (<a class="el" href="a00317.html">null_rw_mutex</a> &, bool=true)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the <a class="el" href="a00318.html">reader_writer_lock</a>. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6146c803a4ad2f14263fdc019a72b5a9"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::release" ref="6146c803a4ad2f14263fdc019a72b5a9" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="680274059774b9188889d34986314f81"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read" ref="680274059774b9188889d34986314f81" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock_read</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for write locks. <a href="a00319.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html">scoped_lock_read</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for read locks. <a href="a00320.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Writer-preference reader-writer lock with local-only spinning on readers.
-<p>
-Loosely adapted from Mellor-Crummey and Scott pseudocode at <a href="http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp">http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp</a>
-<p>
-<hr><h2>Member Enumeration Documentation</h2>
-<a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::status_t" ref="6f921f0d7c1812ceb5674418c8b6ccaf" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">enum <a class="el" href="a00318.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock::status_t</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Status type for nodes associated with lock instances.
-<p>
-waiting_nonblocking: the wait state for nonblocking lock instances; for writes, these transition straight to active states; for reads, these are unused.<p>
-waiting: the start and spin state for all lock instances; these will transition to active state when appropriate. Non-blocking write locks transition from this state to waiting_nonblocking immediately.<p>
-active: the active state means that the lock instance holds the lock; it will transition to invalid state during node deletion<p>
-invalid: the end state for all nodes; this is set in the destructor so if we encounter this state, we are looking at memory that has already been freed<p>
-The state diagrams below describe the status transitions. Single arrows indicate that the thread that owns the node is responsible for the transition; double arrows indicate that any thread could make the transition.<p>
-State diagram for <a class="el" href="a00319.html">scoped_lock</a> status:<p>
-waiting ----------> waiting_nonblocking | _____________/ | V V V active -----------------> invalid<p>
-State diagram for <a class="el" href="a00320.html">scoped_lock_read</a> status:<p>
-waiting | V active ----------------->invalid
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="2653d1a2d560059a51219a8ceab3ade9"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::lock" ref="2653d1a2d560059a51219a8ceab3ade9" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Acquires the <a class="el" href="a00318.html">reader_writer_lock</a> for write.
-<p>
-If the lock is currently held in write mode by another context, the writer will block by spinning on a local variable. Exceptions thrown: <a class="el" href="a00290.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00318.html">reader_writer_lock</a> that it already has write ownership of.
-</div>
-</div><p>
-<a class="anchor" name="d9d16a24d9f6c3dada73c6b9ff214f5b"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::lock_read" ref="d9d16a24d9f6c3dada73c6b9ff214f5b" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::lock_read </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Acquires the <a class="el" href="a00318.html">reader_writer_lock</a> for read.
-<p>
-If the lock is currently held by a writer, this reader will block and wait until the writers are done. Exceptions thrown: <a class="el" href="a00290.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00318.html">reader_writer_lock</a> that it already has write ownership of.
-</div>
-</div><p>
-<a class="anchor" name="721eb173e154ab38292273e9266a9b07"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::try_lock" ref="721eb173e154ab38292273e9266a9b07" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::try_lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Tries to acquire the <a class="el" href="a00318.html">reader_writer_lock</a> for write.
-<p>
-This function does not block. Return Value: True or false, depending on whether the lock is acquired or not. If the lock is already held by this acquiring context, <a class="el" href="a00318.html#721eb173e154ab38292273e9266a9b07">try_lock()</a> returns false.
-</div>
-</div><p>
-<a class="anchor" name="595fb23952e3b89426b1f7938dea9b11"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::try_lock_read" ref="595fb23952e3b89426b1f7938dea9b11" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::try_lock_read </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Tries to acquire the <a class="el" href="a00318.html">reader_writer_lock</a> for read.
+Represents acquisition of a mutex.
<p>
-This function does not block. Return Value: True or false, depending on whether the lock is acquired or not.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00605.html">reader_writer_lock.h</a></ul>
+<li>null_rw_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00319.html b/doc/html/a00319.html
index c4a8de5..bb58252 100644
--- a/doc/html/a00319.html
+++ b/doc/html/a00319.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::reader_writer_lock::scoped_lock Class Reference</title>
+<title>tbb::parallel_do_feeder< Item > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,44 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00318.html">reader_writer_lock</a>::<a class="el" href="a00319.html">scoped_lock</a></div>
-<h1>tbb::interface5::reader_writer_lock::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock" -->The scoped lock pattern for write locks.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00319.html">parallel_do_feeder</a></div>
+<h1>tbb::parallel_do_feeder< Item > Class Template Reference</h1><!-- doxytag: class="tbb::parallel_do_feeder" -->Class the user supplied algorithm body uses to add new tasks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00605.html">reader_writer_lock.h</a>></code>
+<code>#include <parallel_do.h></code>
<p>
-<a href="a00115.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00096.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf19f20e082887c1bb0ba6b0911c3583"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::scoped_lock" ref="cf19f20e082887c1bb0ba6b0911c3583" args="(reader_writer_lock &lock)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a> (<a class="el" href="a00318.html">reader_writer_lock</a> &lock)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct with blocking attempt to acquire write lock on the passed-in lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="70246e0260493625ff956fa5926fc71f"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::~scoped_lock" ref="70246e0260493625ff956fa5926fc71f" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor, releases the write lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aea1cb0e88be9874f0f72e52063d0b90"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator new" ref="aea1cb0e88be9874f0f72e52063d0b90" args="(size_t s)" -->
-void * </td><td class="memItemRight" valign="bottom"><b>operator new</b> (size_t s)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db804a05fcd37f7e81b94752e45039f7"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator delete" ref="db804a05fcd37f7e81b94752e45039f7" args="(void *p)" -->
-void </td><td class="memItemRight" valign="bottom"><b>operator delete</b> (void *p)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="40baaf0f6856f4491dd0adf896c93516"></a><!-- doxytag: member="tbb::parallel_do_feeder::add" ref="40baaf0f6856f4491dd0adf896c93516" args="(const Item &item)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html#40baaf0f6856f4491dd0adf896c93516">add</a> (const Item &item)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a work item to a running parallel_do. <br></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38eb53abbe72543f5967c63aa95b403e"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::reader_writer_lock" ref="38eb53abbe72543f5967c63aa95b403e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>reader_writer_lock</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b381179b22f5f5e8511470c73d64b37f"></a><!-- doxytag: member="tbb::parallel_do_feeder::internal::parallel_do_feeder_impl" ref="b381179b22f5f5e8511470c73d64b37f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::parallel_do_feeder_impl</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped lock pattern for write locks.
+<h3>template<typename Item><br>
+ class tbb::parallel_do_feeder< Item ></h3>
+
+Class the user supplied algorithm body uses to add new tasks.
<p>
-Scoped locks help avoid the common problem of forgetting to release the lock. This type also serves as the node for queuing locks.
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>Item</em> </td><td>Work item type </td></tr>
+ </table>
+</dl>
+
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00605.html">reader_writer_lock.h</a></ul>
+<li>parallel_do.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00320.html b/doc/html/a00320.html
index 6692689..7e90392 100644
--- a/doc/html/a00320.html
+++ b/doc/html/a00320.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::reader_writer_lock::scoped_lock_read Class Reference</title>
+<title>tbb::parallel_while< Body > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,117 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00318.html">reader_writer_lock</a>::<a class="el" href="a00320.html">scoped_lock_read</a></div>
-<h1>tbb::interface5::reader_writer_lock::scoped_lock_read Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock_read" -->The scoped lock pattern for read locks.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00320.html">parallel_while</a></div>
+<h1>tbb::parallel_while< Body > Class Template Reference<br>
+<small>
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::parallel_while" -->Parallel iteration over a stream, with optional addition of more work.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00605.html">reader_writer_lock.h</a>></code>
+<code>#include <parallel_while.h></code>
<p>
-<a href="a00116.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00100.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="87ab0dc8f7216e6ba0f7acd6aec33064"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::scoped_lock_read" ref="87ab0dc8f7216e6ba0f7acd6aec33064" args="(reader_writer_lock &lock)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a> (<a class="el" href="a00318.html">reader_writer_lock</a> &lock)</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa297e53d3af2a101e712bc200233e9c"></a><!-- doxytag: member="tbb::parallel_while::value_type" ref="fa297e53d3af2a101e712bc200233e9c" args="" -->
+typedef Body::argument_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#fa297e53d3af2a101e712bc200233e9c">value_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct with blocking attempt to acquire read lock on the passed-in lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd21c5f3d555d64d1de8658e15bf4966"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::~scoped_lock_read" ref="bd21c5f3d555d64d1de8658e15bf4966" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of items. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36e26ba3880c7bcf804a97ba0cbe133f"></a><!-- doxytag: member="tbb::parallel_while::parallel_while" ref="36e26ba3880c7bcf804a97ba0cbe133f" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor, releases the read lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09e1817dddf97cc2182a573945eef91"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::operator new" ref="f09e1817dddf97cc2182a573945eef91" args="(size_t s)" -->
-void * </td><td class="memItemRight" valign="bottom"><b>operator new</b> (size_t s)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty non-running parallel while. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6fcfc973cc56b79c6d0fbb8a31be7e84"></a><!-- doxytag: member="tbb::parallel_while::~parallel_while" ref="6fcfc973cc56b79c6d0fbb8a31be7e84" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f9e148ec33895c0d2669ff6820cf164"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::operator delete" ref="4f9e148ec33895c0d2669ff6820cf164" args="(void *p)" -->
-void </td><td class="memItemRight" valign="bottom"><b>operator delete</b> (void *p)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor cleans up data members before returning. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename Stream> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00320.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a> (Stream &stream, const Body &body)</td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38eb53abbe72543f5967c63aa95b403e"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::reader_writer_lock" ref="38eb53abbe72543f5967c63aa95b403e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>reader_writer_lock</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Apply body.apply to each item in the stream. <a href="#b32a0a6e5e09ebb7fad3e6652c19afe5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#e131c560057a58229992b61eb8dba4c6">add</a> (const <a class="el" href="a00320.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> &item)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a work item while running. <a href="#e131c560057a58229992b61eb8dba4c6"></a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped lock pattern for read locks.
+<h3>template<typename Body><br>
+ class tbb::parallel_while< Body ></h3>
+
+Parallel iteration over a stream, with optional addition of more work.
+<p>
+The Body b has the requirement: <br>
+ "b(v)" <br>
+ "b.argument_type" <br>
+ where v is an argument_type
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="e131c560057a58229992b61eb8dba4c6"></a><!-- doxytag: member="tbb::parallel_while::add" ref="e131c560057a58229992b61eb8dba4c6" args="(const value_type &item)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Body> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00320.html">tbb::parallel_while</a>< Body >::add </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="a00320.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> & </td>
+ <td class="paramname"> <em>item</em> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Add a work item while running.
+<p>
+Should be executed only by body.apply or a thread spawned therefrom.
+</div>
+</div><p>
+<a class="anchor" name="b32a0a6e5e09ebb7fad3e6652c19afe5"></a><!-- doxytag: member="tbb::parallel_while::run" ref="b32a0a6e5e09ebb7fad3e6652c19afe5" args="(Stream &stream, const Body &body)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Body> </div>
+<div class="memtemplate">
+template<typename Stream> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00320.html">tbb::parallel_while</a>< Body >::run </td>
+ <td>(</td>
+ <td class="paramtype">Stream & </td>
+ <td class="paramname"> <em>stream</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Body & </td>
+ <td class="paramname"> <em>body</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Apply body.apply to each item in the stream.
<p>
+A Stream s has the requirements <br>
+ "S::value_type" <br>
+ "s.pop_if_present(value) is convertible to bool
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00605.html">reader_writer_lock.h</a></ul>
+<li>parallel_while.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00321.html b/doc/html/a00321.html
index 052c3af..d0730a5 100644
--- a/doc/html/a00321.html
+++ b/doc/html/a00321.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::receiver< T > Class Template Reference</title>
+<title>tbb::internal::partition_type_base Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,63 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00321.html">receiver</a></div>
-<h1>tbb::flow::interface6::receiver< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::receiver" -->Pure virtual template class that defines a receiver of messages of type T.
+<a class="el" href="a00428.html">tbb</a>::<b>internal</b>::<a class="el" href="a00321.html">partition_type_base</a></div>
+<h1>tbb::internal::partition_type_base Class Reference</h1><!-- doxytag: class="tbb::internal::partition_type_base" -->Provides backward-compatible methods for partition objects without affinity.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <partitioner.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::receiver< T >:
-<p><center><img src="a00321.png" usemap="#tbb::flow::interface6::receiver< T >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::receiver< T >_map">
-<area href="a00262.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="0,56,352,80">
-<area href="a00263.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
-<area href="a00279.html" alt="tbb::flow::interface6::continue_receiver" shape="rect" coords="724,56,1076,80">
-<area href="a00292.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="1086,56,1438,80">
-<area href="a00312.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
-<area href="a00313.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
-<area href="a00328.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
-</map>
-<a href="a00054.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00102.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d0524c99313dedea1e04464bbf2f7ef"></a><!-- doxytag: member="tbb::flow::interface6::receiver::input_type" ref="0d0524c99313dedea1e04464bbf2f7ef" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00321.html#0d0524c99313dedea1e04464bbf2f7ef">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fa8cff811e7c1589b805a4bb4c7a74f"></a><!-- doxytag: member="tbb::flow::interface6::receiver::predecessor_type" ref="7fa8cff811e7c1589b805a4bb4c7a74f" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00321.html#7fa8cff811e7c1589b805a4bb4c7a74f">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b00699b235435f7b65b663d5063624a1"></a><!-- doxytag: member="tbb::flow::interface6::receiver::~receiver" ref="b00699b235435f7b65b663d5063624a1" args="()" -->
-virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5b43011addf53239ccf8cdeaeab76e7"></a><!-- doxytag: member="tbb::internal::partition_type_base::set_affinity" ref="d5b43011addf53239ccf8cdeaeab76e7" args="(task &)" -->
+void </td><td class="memItemRight" valign="bottom"><b>set_affinity</b> (<a class="el" href="a00349.html">task</a> &)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6d5d0cb8ebe5771be91933609fe31b8"></a><!-- doxytag: member="tbb::flow::interface6::receiver::try_put" ref="c6d5d0cb8ebe5771be91933609fe31b8" args="(const T &t)=0" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00321.html#c6d5d0cb8ebe5771be91933609fe31b8">try_put</a> (const T &t)=0</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bffce16dee5796448bf12c8ccecd94c"></a><!-- doxytag: member="tbb::internal::partition_type_base::note_affinity" ref="2bffce16dee5796448bf12c8ccecd94c" args="(task::affinity_id)" -->
+void </td><td class="memItemRight" valign="bottom"><b>note_affinity</b> (<a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a>)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Put an item to the receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30e3316466efe3a713c23062b6e806f3"></a><!-- doxytag: member="tbb::flow::interface6::receiver::register_predecessor" ref="30e3316466efe3a713c23062b6e806f3" args="(predecessor_type &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a> (<a class="el" href="a00327.html">predecessor_type</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="87962b93599ff172cd4b64f2995ebc71"></a><!-- doxytag: member="tbb::internal::partition_type_base::continue_after_execute_range" ref="87962b93599ff172cd4b64f2995ebc71" args="()" -->
+<a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>continue_after_execute_range</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a predecessor to the node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bc76547b51d3c9b633e3987d22dce95"></a><!-- doxytag: member="tbb::flow::interface6::receiver::remove_predecessor" ref="3bc76547b51d3c9b633e3987d22dce95" args="(predecessor_type &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a> (<a class="el" href="a00327.html">predecessor_type</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="baca041e2b854196a411f1d0ca7ae905"></a><!-- doxytag: member="tbb::internal::partition_type_base::decide_whether_to_delay" ref="baca041e2b854196a411f1d0ca7ae905" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>decide_whether_to_delay</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17686f1a5119802cad38369d0580d05f"></a><!-- doxytag: member="tbb::internal::partition_type_base::spawn_or_delay" ref="17686f1a5119802cad38369d0580d05f" args="(bool, task &b)" -->
+void </td><td class="memItemRight" valign="bottom"><b>spawn_or_delay</b> (bool, <a class="el" href="a00349.html">task</a> &b)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove a predecessor from the node. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::flow::interface6::receiver< T ></h3>
-
-Pure virtual template class that defines a receiver of messages of type T.
+Provides backward-compatible methods for partition objects without affinity.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>partitioner.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00322.html b/doc/html/a00322.html
index f0829d9..0d5ff4b 100644
--- a/doc/html/a00322.html
+++ b/doc/html/a00322.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::recursive_mutex Class Reference</title>
+<title>tbb::pipeline Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,95 +21,88 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00322.html">recursive_mutex</a></div>
-<h1>tbb::recursive_mutex Class Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00322.html">pipeline</a></div>
+<h1>tbb::pipeline Class Reference<br>
<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::recursive_mutex" -->Mutex that allows recursive mutex acquisition.
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::pipeline" -->A processing pipeline that applies filters to items.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00606.html">recursive_mutex.h</a>></code>
+<code>#include <pipeline.h></code>
<p>
-<a href="a00117.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00109.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="889fa8cc32dd707eef7c0f52dda09c0d"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle_type" ref="889fa8cc32dd707eef7c0f52dda09c0d" args="" -->
-typedef LPCRITICAL_SECTION </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="596dc3beba27099c4c8581cb419e1a59"></a><!-- doxytag: member="tbb::pipeline::pipeline" ref="596dc3beba27099c4c8581cb419e1a59" args="()" -->
+__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return native_handle. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="26a40fae42bf6cd9f3f77ee7482d6164"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle_type" ref="26a40fae42bf6cd9f3f77ee7482d6164" args="" -->
-typedef pthread_mutex_t * </td><td class="memItemRight" valign="bottom"><b>native_handle_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty pipeline. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a> ()</td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2fceb7f95c24a8cd1457d4527e4b8c6"></a><!-- doxytag: member="tbb::recursive_mutex::recursive_mutex" ref="d2fceb7f95c24a8cd1457d4527e4b8c6" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38fb5c9c8395dd6f89a4ae2011a83e0d"></a><!-- doxytag: member="tbb::pipeline::add_filter" ref="38fb5c9c8395dd6f89a4ae2011a83e0d" args="(filter &filter_)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00294.html">filter</a> &filter_)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired <a class="el" href="a00322.html">recursive_mutex</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c342c69d47f4bb0b393535dee4015d6"></a><!-- doxytag: member="tbb::recursive_mutex::lock" ref="4c342c69d47f4bb0b393535dee4015d6" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#4c342c69d47f4bb0b393535dee4015d6">lock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add filter to end of pipeline. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f627616049b3fe36801f37ee40403ef8"></a><!-- doxytag: member="tbb::pipeline::run" ref="f627616049b3fe36801f37ee40403ef8" args="(size_t max_number_of_live_tokens)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#f627616049b3fe36801f37ee40403ef8">run</a> (size_t max_number_of_live_tokens)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#86e719b0afee25704af11ab97694d240">try_lock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Run the pipeline to completion. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93d7fec8cd607b803dd2d79fb46bd260"></a><!-- doxytag: member="tbb::pipeline::run" ref="93d7fec8cd607b803dd2d79fb46bd260" args="(size_t max_number_of_live_tokens, tbb::task_group_context &context)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#93d7fec8cd607b803dd2d79fb46bd260">run</a> (size_t max_number_of_live_tokens, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#86e719b0afee25704af11ab97694d240"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f0a96e26b7f074588dc31e32524856ae"></a><!-- doxytag: member="tbb::recursive_mutex::unlock" ref="f0a96e26b7f074588dc31e32524856ae" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#f0a96e26b7f074588dc31e32524856ae">unlock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Run the pipeline to completion with user-supplied context. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c84aef5b834b555ee220b176e25931e"></a><!-- doxytag: member="tbb::pipeline::clear" ref="2c84aef5b834b555ee220b176e25931e" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#2c84aef5b834b555ee220b176e25931e">clear</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6baa9ce4b394c39622456fd8a68f8bd8"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle" ref="6baa9ce4b394c39622456fd8a68f8bd8" args="()" -->
-<a class="el" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove all filters from the pipeline. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::pipeline::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="718cc53f6b33d8c396ccca0e4ebc5606"></a><!-- doxytag: member="tbb::recursive_mutex::is_rw_mutex" ref="718cc53f6b33d8c396ccca0e4ebc5606" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6149d7541063d8b35afd98df6f0f89d"></a><!-- doxytag: member="tbb::recursive_mutex::is_recursive_mutex" ref="f6149d7541063d8b35afd98df6f0f89d" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c991e50853b0cac7da039550344d3ef"></a><!-- doxytag: member="tbb::pipeline::filter" ref="4c991e50853b0cac7da039550344d3ef" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>filter</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f01aacad6b9b9d51573c0803323182fe"></a><!-- doxytag: member="tbb::recursive_mutex::is_fair_mutex" ref="f01aacad6b9b9d51573c0803323182fe" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::pipeline::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9d033d41ff53a0ae6ef824aceee7ecbc"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_cleaner" ref="9d033d41ff53a0ae6ef824aceee7ecbc" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_cleaner</b></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1ed99300bc4520a481583c448d6fafd"></a><!-- doxytag: member="tbb::pipeline::tbb::interface6::internal::pipeline_proxy" ref="d1ed99300bc4520a481583c448d6fafd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::internal::pipeline_proxy</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00323.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Mutex that allows recursive mutex acquisition.
-<p>
-Mutex that allows recursive mutex acquisition.
+A processing pipeline that applies filters to items.
<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="86e719b0afee25704af11ab97694d240"></a><!-- doxytag: member="tbb::recursive_mutex::try_lock" ref="86e719b0afee25704af11ab97694d240" args="()" -->
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="49513c6c24f9d5bbbb27edca5efe01c9"></a><!-- doxytag: member="tbb::pipeline::~pipeline" ref="49513c6c24f9d5bbbb27edca5efe01c9" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">bool tbb::recursive_mutex::try_lock </td>
+ <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::pipeline::~pipeline </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"><code> [inline]</code></td>
+ <td width="100%"><code> [virtual]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Try acquiring lock (non-blocking).
-<p>
-Return true if lock acquired; false otherwise.
+Though the current implementation declares the destructor virtual, do not rely on this detail. The virtualness is deprecated and may disappear in future versions of TBB.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00606.html">recursive_mutex.h</a></ul>
+<li>pipeline.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00323.html b/doc/html/a00323.html
index 6a62752..546d35b 100644
--- a/doc/html/a00323.html
+++ b/doc/html/a00323.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::recursive_mutex::scoped_lock Class Reference</title>
+<title>tbb::pre_scan_tag Struct Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,54 +21,30 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00322.html">recursive_mutex</a>::<a class="el" href="a00323.html">scoped_lock</a></div>
-<h1>tbb::recursive_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::recursive_mutex::scoped_lock" -->The scoped locking pattern.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00323.html">pre_scan_tag</a></div>
+<h1>tbb::pre_scan_tag Struct Reference<br>
+<small>
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::pre_scan_tag" -->Used to indicate that the initial scan is being performed.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00606.html">recursive_mutex.h</a>></code>
+<code>#include <parallel_scan.h></code>
<p>
-<a href="a00118.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00098.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d82d4d36fbf9727a493d26ae50855fe7"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="d82d4d36fbf9727a493d26ae50855fe7" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a <a class="el" href="a00322.html">recursive_mutex</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dec17713c4c1321ac8fec66816d0c602"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="dec17713c4c1321ac8fec66816d0c602" args="(recursive_mutex &mutex)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a> (<a class="el" href="a00322.html">recursive_mutex</a> &<a class="el" href="a00301.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c1197ffb8f3cd9d4fed71d7e06265b7c"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::~scoped_lock" ref="c1197ffb8f3cd9d4fed71d7e06265b7c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fb04da37cccf8c99b1f9102d9074f9a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::acquire" ref="7fb04da37cccf8c99b1f9102d9074f9a" args="(recursive_mutex &mutex)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a> (<a class="el" href="a00322.html">recursive_mutex</a> &<a class="el" href="a00301.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36bfc3e93e3ef6340abef4901444d340"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::try_acquire" ref="36bfc3e93e3ef6340abef4901444d340" args="(recursive_mutex &mutex)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a> (<a class="el" href="a00322.html">recursive_mutex</a> &<a class="el" href="a00301.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given <a class="el" href="a00322.html">recursive_mutex</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac480ea0e9d5ea0345a67d57008b6263"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::release" ref="ac480ea0e9d5ea0345a67d57008b6263" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#ac480ea0e9d5ea0345a67d57008b6263">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="459818b78a3e9985dc5a9d5638b6593e"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::recursive_mutex" ref="459818b78a3e9985dc5a9d5638b6593e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>recursive_mutex</b></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d45d2cf548e51140ad6faafbea8ca6b5"></a><!-- doxytag: member="tbb::pre_scan_tag::is_final_scan" ref="d45d2cf548e51140ad6faafbea8ca6b5" args="()" -->
+static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern.
-<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+Used to indicate that the initial scan is being performed.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00606.html">recursive_mutex.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li>parallel_scan.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00324.html b/doc/html/a00324.html
index 46f100a..6e5a874 100644
--- a/doc/html/a00324.html
+++ b/doc/html/a00324.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::runtime_loader Class Reference</title>
+<title>tbb::flow::interface6::priority_queue_node< T, Compare, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,302 +21,116 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00324.html">runtime_loader</a></div>
-<h1>tbb::interface6::runtime_loader Class Reference</h1><!-- doxytag: class="tbb::interface6::runtime_loader" -->Load TBB at runtime.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00324.html">priority_queue_node</a></div>
+<h1>tbb::flow::interface6::priority_queue_node< T, Compare, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::priority_queue_node" --><!-- doxytag: inherits="tbb::flow::interface6::buffer_node" -->Forwards messages in priority order.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00607.html">runtime_loader.h</a>></code>
-<p>
-<a href="a00119.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<code>#include <flow_graph.h></code>
+<p>
+<p>Inheritance diagram for tbb::flow::interface6::priority_queue_node< T, Compare, A >:
+<p><center><img src="a00324.png" usemap="#tbb::flow::interface6::priority_queue_node< T, Compare, A >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::priority_queue_node< T, Compare, A >_map">
+<area href="a00275.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,352,24">
+<area href="a00333.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="362,0,714,24">
+<area href="a00339.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="724,0,1076,24">
+</map>
+<a href="a00078.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Save status of operation and continue. <a href="#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throw an exception of tbb::runtime_loader::error_code type. <a href="#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Print message to <code>stderr</code> and call <code>abort()</code>. <a href="#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2829b518979874ad3d2a939e14ae7bd"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::input_type" ref="b2829b518979874ad3d2a939e14ae7bd" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">No errors. <a href="#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2cb099b590246b6bc93cc15e78c6ee5c"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::output_type" ref="2cb099b590246b6bc93cc15e78c6ee5c" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid function call (e. g. <a class="el" href="a00324.html#5f3f6f1683386705a6931acae45f0862">load()</a> called when TBB is already loaded). <a href="#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4968bda48aceffa4d65445bf8d0f8048"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::base_type" ref="4968bda48aceffa4d65445bf8d0f8048" args="" -->
+typedef <a class="el" href="a00275.html">buffer_node</a>< T, A > </td><td class="memItemRight" valign="bottom"><b>base_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid argument passed. <a href="#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdea783bf9d5a4c98e794ac7e0f84ccf"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::predecessor_type" ref="fdea783bf9d5a4c98e794ac7e0f84ccf" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< <a class="el" href="a00324.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#fdea783bf9d5a4c98e794ac7e0f84ccf">predecessor_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid library found (e. g. <code>TBB_runtime_version</code> symbol not found). <a href="#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09ab5064ca8192e68c03da47603e68eb"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::successor_type" ref="09ab5064ca8192e68c03da47603e68eb" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00324.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#09ab5064ca8192e68c03da47603e68eb">successor_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">TBB found but version is not suitable. <a href="#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="497ec2612615249bf5a294eb1b7b93b3"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::priority_queue_node" ref="497ec2612615249bf5a294eb1b7b93b3" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a> (<a class="el" href="a00300.html">graph</a> &g)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">No suitable TBB library found. <a href="#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> { <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a>,
-<a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a>,
-<a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a>
- }</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17a4f66e23d54100b64805405e905d62"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::priority_queue_node" ref="17a4f66e23d54100b64805405e905d62" args="(const priority_queue_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#17a4f66e23d54100b64805405e905d62">priority_queue_node</a> (const <a class="el" href="a00324.html">priority_queue_node</a> &src)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Error mode constants. <a href="a00324.html#bb0130fe0f596399707e61431231ebcb">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a> { <br>
- <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a>,
-<a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a>,
-<a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a>,
-<a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a>,
-<br>
- <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a>,
-<a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a>
-<br>
- }</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1c6c5e02b9cc144b2b3ccc9f18bf047"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::size_type" ref="d1c6c5e02b9cc144b2b3ccc9f18bf047" args="" -->
+typedef <a class="el" href="a00275.html">buffer_node</a>< T, A <br>
+>::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Error codes. <a href="a00324.html#6831be91cdc64e57e565ce0dde018789">More...</a><br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7caa4ff6e44c2348e67f601cc5d97c34"></a><!-- doxytag: member="tbb::interface6::runtime_loader::runtime_loader" ref="7caa4ff6e44c2348e67f601cc5d97c34" args="(error_mode mode=em_abort)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a> (<a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode=em_abort)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb98634e74bee4d82676f1aca0f6864c"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::item_type" ref="eb98634e74bee4d82676f1aca0f6864c" args="" -->
+typedef <a class="el" href="a00275.html">buffer_node</a>< T, A <br>
+>::item_type </td><td class="memItemRight" valign="bottom"><b>item_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Initialize object but do not load TBB. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#7ae5330beb48fce0c702c32a5df0094a">runtime_loader</a> (char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode=em_abort)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f80f04dc8886a8a6b177123f094bdb43"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::prio_operation" ref="f80f04dc8886a8a6b177123f094bdb43" args="" -->
+typedef <a class="el" href="a00275.html">buffer_node</a>< T, A <br>
+>::buffer_operation </td><td class="memItemRight" valign="bottom"><b>prio_operation</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Initialize object and load TBB. <a href="#7ae5330beb48fce0c702c32a5df0094a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c25fec923a751a3e03f5cbe969f1f0c5"></a><!-- doxytag: member="tbb::interface6::runtime_loader::~runtime_loader" ref="c25fec923a751a3e03f5cbe969f1f0c5" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="274cc306c7a22cf9e27c4c2c3a66ce8e579c547cd1c044d3e6190401d87ee101"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::WAIT" ref="274cc306c7a22cf9e27c4c2c3a66ce8e579c547cd1c044d3e6190401d87ee101" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy object. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#5f3f6f1683386705a6931acae45f0862">load</a> (char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="274cc306c7a22cf9e27c4c2c3a66ce8e67ced6b76fb4bcd40404499619fbd0b9"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::SUCCEEDED" ref="274cc306c7a22cf9e27c4c2c3a66ce8e67ced6b76fb4bcd40404499619fbd0b9" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Load TBB. <a href="#5f3f6f1683386705a6931acae45f0862"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#78d938ed2e54d38dd38d6609e6c60389">status</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="274cc306c7a22cf9e27c4c2c3a66ce8eb74545a431cbeaf85ab0bfcec52261ff"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::FAILED" ref="274cc306c7a22cf9e27c4c2c3a66ce8eb74545a431cbeaf85ab0bfcec52261ff" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Report status. <a href="#78d938ed2e54d38dd38d6609e6c60389"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Load TBB at runtime.
-<p>
-<b>Usage:</b> <p>
-In source code:<p>
-<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "tbb/runtime_loader.h"</span>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0,
+<b>SUCCEEDED</b>,
+<b>FAILED</b>
+ }</td></tr>
-<span class="keywordtype">char</span> <span class="keyword">const</span> * path[] = { <span class="stringliteral">"<install dir>/lib/ia32"</span>, NULL };
-tbb::runtime_loader loader( path );
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="534a669bacdb8b335c8eaaadc9462795"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::reset" ref="534a669bacdb8b335c8eaaadc9462795" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
-<span class="comment">// Now use TBB.</span>
-</pre></div><p>
-Link with <code>tbbproxy.lib</code> (or <code>libtbbproxy.a</code>) instead of <code>tbb.lib</code> (<code>libtbb.dylib</code>, <code>libtbb.so</code>).<p>
-TBB library will be loaded at runtime from <code></code> <install dir>="">/lib/ia32 directory.<p>
-<b>Attention:</b> <p>
-All <code><a class="el" href="a00324.html">runtime_loader</a></code> objects (in the same module, i.e. exe or dll) share some global state. The most noticeable piece of global state is loaded TBB library. There are some implications:<p>
-<ul>
-<li>Only one TBB library can be loaded per module.</li></ul>
-<p>
-<ul>
-<li>If one object has already loaded TBB library, another object will not load TBB. If the loaded TBB library is suitable for the second object, both will use TBB cooperatively, otherwise the second object will report an error.</li></ul>
-<p>
-<ul>
-<li><code><a class="el" href="a00324.html">runtime_loader</a></code> objects will not work (correctly) in parallel due to absence of syncronization. </li></ul>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="abff2e0891477135c24f44747e991c6c"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::handle_operations" ref="abff2e0891477135c24f44747e991c6c" args="(prio_operation *op_list)" -->
+void </td><td class="memItemRight" valign="bottom"><b>handle_operations</b> (prio_operation *op_list)</td></tr>
-<p>
-<hr><h2>Member Enumeration Documentation</h2>
-<a class="anchor" name="6831be91cdc64e57e565ce0dde018789"></a><!-- doxytag: member="tbb::interface6::runtime_loader::error_code" ref="6831be91cdc64e57e565ce0dde018789" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">enum <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader::error_code</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9249c25621a6ee7a741a6b7eac710ba4"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_forward_task" ref="9249c25621a6ee7a741a6b7eac710ba4" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#9249c25621a6ee7a741a6b7eac710ba4">internal_forward_task</a> (prio_operation *op)</td></tr>
-<p>
-Error codes.
-<p>
-<dl compact><dt><b>Enumerator: </b></dt><dd>
-<table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27"></a><!-- doxytag: member="ec_ok" ref="6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27" args="" -->ec_ok</em> </td><td>
-No errors. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1"></a><!-- doxytag: member="ec_bad_call" ref="6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1" args="" -->ec_bad_call</em> </td><td>
-Invalid function call (e. g. <a class="el" href="a00324.html#5f3f6f1683386705a6931acae45f0862">load()</a> called when TBB is already loaded). </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703"></a><!-- doxytag: member="ec_bad_arg" ref="6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703" args="" -->ec_bad_arg</em> </td><td>
-Invalid argument passed. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6"></a><!-- doxytag: member="ec_bad_lib" ref="6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6" args="" -->ec_bad_lib</em> </td><td>
-Invalid library found (e. g. <code>TBB_runtime_version</code> symbol not found). </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6"></a><!-- doxytag: member="ec_bad_ver" ref="6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6" args="" -->ec_bad_ver</em> </td><td>
-TBB found but version is not suitable. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb"></a><!-- doxytag: member="ec_no_lib" ref="6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb" args="" -->ec_no_lib</em> </td><td>
-No suitable TBB library found. </td></tr>
-</table>
-</dl>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d8747ea54ca84a7196f8cacdc81ca5"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_push" ref="05d8747ea54ca84a7196f8cacdc81ca5" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_push</b> (prio_operation *op)</td></tr>
-</div>
-</div><p>
-<a class="anchor" name="bb0130fe0f596399707e61431231ebcb"></a><!-- doxytag: member="tbb::interface6::runtime_loader::error_mode" ref="bb0130fe0f596399707e61431231ebcb" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">enum <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader::error_mode</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6c7cd11240fbe0737344f36b587492f9"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_pop" ref="6c7cd11240fbe0737344f36b587492f9" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (prio_operation *op)</td></tr>
-<p>
-Error mode constants.
-<p>
-<dl compact><dt><b>Enumerator: </b></dt><dd>
-<table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" name="bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38"></a><!-- doxytag: member="em_status" ref="bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38" args="" -->em_status</em> </td><td>
-Save status of operation and continue. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b"></a><!-- doxytag: member="em_throw" ref="bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b" args="" -->em_throw</em> </td><td>
-Throw an exception of tbb::runtime_loader::error_code type. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94"></a><!-- doxytag: member="em_abort" ref="bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94" args="" -->em_abort</em> </td><td>
-Print message to <code>stderr</code> and call <code>abort()</code>. </td></tr>
-</table>
-</dl>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9238c5c44ccc46ed1be218651f36feea"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_reserve" ref="9238c5c44ccc46ed1be218651f36feea" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (prio_operation *op)</td></tr>
-</div>
-</div><p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="7ae5330beb48fce0c702c32a5df0094a"></a><!-- doxytag: member="tbb::interface6::runtime_loader::runtime_loader" ref="7ae5330beb48fce0c702c32a5df0094a" args="(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, error_mode mode=em_abort)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::interface6::runtime_loader::runtime_loader </td>
- <td>(</td>
- <td class="paramtype">char const * </td>
- <td class="paramname"> <em>path</em>[], </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">int </td>
- <td class="paramname"> <em>min_ver</em> = <code>TBB_INTERFACE_VERSION</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">int </td>
- <td class="paramname"> <em>max_ver</em> = <code>INT_MAX</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> </td>
- <td class="paramname"> <em>mode</em> = <code>em_abort</code></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="caefc7ba7a16a7120b6b37de42e705b4"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_consume" ref="caefc7ba7a16a7120b6b37de42e705b4" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (prio_operation *op)</td></tr>
-<p>
-Initialize object and load TBB.
-<p>
-See <a class="el" href="a00324.html#5f3f6f1683386705a6931acae45f0862">load()</a> for details.<p>
-If error mode is <code>em_status</code>, call <a class="el" href="a00324.html#78d938ed2e54d38dd38d6609e6c60389">status()</a> to check whether TBB was loaded or not. <dl compact><dt><b>Parameters: </b></dt><dd>
-<table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em>path</em> </td><td>
-List of directories to search TBB in. </td></tr>
-<tr><td valign="top"><em>min_ver</em> </td><td>
-Minimal suitable version of TBB. </td></tr>
-<tr><td valign="top"><em>max_ver</em> </td><td>
-Maximal suitable version of TBB. </td></tr>
-<tr><td valign="top"><em>mode</em> </td><td>
-Error mode for this object. </td></tr>
-</table>
-</dl>
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="5f3f6f1683386705a6931acae45f0862"></a><!-- doxytag: member="tbb::interface6::runtime_loader::load" ref="5f3f6f1683386705a6931acae45f0862" args="(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a> tbb::interface6::runtime_loader::load </td>
- <td>(</td>
- <td class="paramtype">char const * </td>
- <td class="paramname"> <em>path</em>[], </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">int </td>
- <td class="paramname"> <em>min_ver</em> = <code>TBB_INTERFACE_VERSION</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">int </td>
- <td class="paramname"> <em>max_ver</em> = <code>INT_MAX</code></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="400304719e359e66e9560157577fc2fe"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_release" ref="400304719e359e66e9560157577fc2fe" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_release</b> (prio_operation *op)</td></tr>
-<p>
-Load TBB.
-<p>
-The method searches the directories specified in <code>path</code>[] array for the TBB library. When the library is found, it is loaded and its version is checked. If the version is not suitable, the library is unloaded, and the search continues.<p>
-<b>Note:</b> <p>
-For security reasons, avoid using relative directory names. For example, never load TBB from current (<code>"."</code>), parent (<code>".."</code>) or any other relative directory (like <code>"lib"</code> ). Use only absolute directory names (e. g. "/usr/local/lib").<p>
-For the same security reasons, avoid using system default directories (<code>""</code>) on Windows. (See <a href="http://www.microsoft.com/technet/security/advisory/2269637.mspx">http://www.microsoft.com/technet/security/advisory/2269637.mspx</a> for details.)<p>
-Neglecting these rules may cause your program to execute 3-rd party malicious code.<p>
-<b>Errors:</b> <ul>
-<li><code>ec_bad_call</code> - TBB already loaded by this object.</li><li><code>ec_bad_arg</code> - <code>min_ver</code> and/or <code>max_ver</code> negative or zero, or <code>min_ver</code> > <code>max_ver</code>.</li><li><code>ec_bad_ver</code> - TBB of unsuitable version already loaded by another object.</li><li><code>ec_no_lib</code> - No suitable library found. </li></ul>
-<dl compact><dt><b>Parameters: </b></dt><dd>
-<table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em>path</em> </td><td>
-List of directories to search TBB in. </td></tr>
-<tr><td valign="top"><em>min_ver</em> </td><td>
-Minimal suitable version of TBB. </td></tr>
-<tr><td valign="top"><em>max_ver</em> </td><td>
-Maximal suitable version of TBB. </td></tr>
</table>
-</dl>
-</div>
-</div><p>
-<a class="anchor" name="78d938ed2e54d38dd38d6609e6c60389"></a><!-- doxytag: member="tbb::interface6::runtime_loader::status" ref="78d938ed2e54d38dd38d6609e6c60389" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a> tbb::interface6::runtime_loader::status </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>><br>
+ class tbb::flow::interface6::priority_queue_node< T, Compare, A ></h3>
+Forwards messages in priority order.
<p>
-Report status.
-<p>
-If error mode is <code>em_status</code>, the function returns status of the last operation.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00607.html">runtime_loader.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00312.png b/doc/html/a00324.png
similarity index 100%
copy from doc/html/a00312.png
copy to doc/html/a00324.png
diff --git a/doc/html/a00325.html b/doc/html/a00325.html
index 97c2c3f..ad76775 100644
--- a/doc/html/a00325.html
+++ b/doc/html/a00325.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::scalable_allocator< T > Class Template Reference</title>
+<title>tbb::flow::interface6::queue_node< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,87 +21,98 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00325.html">scalable_allocator</a></div>
-<h1>tbb::scalable_allocator< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::scalable_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00325.html">queue_node</a></div>
+<h1>tbb::flow::interface6::queue_node< T, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::queue_node" --><!-- doxytag: inherits="tbb::flow::interface6::buffer_node" -->Forwards messages in FIFO order.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00608.html">scalable_allocator.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<a href="a00121.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::queue_node< T, A >:
+<p><center><img src="a00325.png" usemap="#tbb::flow::interface6::queue_node< T, A >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::queue_node< T, A >_map">
+<area href="a00275.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="280,56,550,80">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,270,24">
+<area href="a00333.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="280,0,550,24">
+<area href="a00339.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="560,0,830,24">
+<area href="a00340.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="280,168,550,192">
+</map>
+<a href="a00076.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a1cf13c339ee177a103a7e19bf2710a"></a><!-- doxytag: member="tbb::scalable_allocator::value_type" ref="5a1cf13c339ee177a103a7e19bf2710a" args="" -->
-typedef internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e71030845210b6c4c7380eb9e11a2ac"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::input_type" ref="1e71030845210b6c4c7380eb9e11a2ac" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5121ec62bc79faba6a4b674d59e7260"></a><!-- doxytag: member="tbb::scalable_allocator::pointer" ref="a5121ec62bc79faba6a4b674d59e7260" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="25b5a53ab1f9a342644fa3759bc0b1ad"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::output_type" ref="25b5a53ab1f9a342644fa3759bc0b1ad" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="846a6fcec3bc7fa3839a12266a729a02"></a><!-- doxytag: member="tbb::scalable_allocator::const_pointer" ref="846a6fcec3bc7fa3839a12266a729a02" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e2fdd33c45d44549dee9c1638e19898"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::predecessor_type" ref="5e2fdd33c45d44549dee9c1638e19898" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< <a class="el" href="a00325.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#5e2fdd33c45d44549dee9c1638e19898">predecessor_type</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="254d7749de9277bb7711470c04d963ea"></a><!-- doxytag: member="tbb::scalable_allocator::reference" ref="254d7749de9277bb7711470c04d963ea" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f35076a19f256f9e7a61bed77ca1ccc5"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::successor_type" ref="f35076a19f256f9e7a61bed77ca1ccc5" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00325.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#f35076a19f256f9e7a61bed77ca1ccc5">successor_type</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acad193a7f6e16253f772ba3e9b2c98f"></a><!-- doxytag: member="tbb::scalable_allocator::const_reference" ref="acad193a7f6e16253f772ba3e9b2c98f" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c716593a92448b0f429d1f3a38e67996"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::queue_node" ref="c716593a92448b0f429d1f3a38e67996" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#c716593a92448b0f429d1f3a38e67996">queue_node</a> (<a class="el" href="a00300.html">graph</a> &g)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4a5cb7482f222a14b513bbdd4ad8507d"></a><!-- doxytag: member="tbb::scalable_allocator::size_type" ref="4a5cb7482f222a14b513bbdd4ad8507d" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0226762d9ebba28311b7b1518d948ab1"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::queue_node" ref="0226762d9ebba28311b7b1518d948ab1" args="(const queue_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a> (const <a class="el" href="a00325.html">queue_node</a> &src)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cb96c23f650cf91a73e2810b54c481bb"></a><!-- doxytag: member="tbb::scalable_allocator::difference_type" ref="cb96c23f650cf91a73e2810b54c481bb" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a84ab6bb43d056468ac5df3626219513"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::size_type" ref="a84ab6bb43d056468ac5df3626219513" args="" -->
+typedef <a class="el" href="a00275.html">buffer_node</a>< T, A <br>
+>::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eee1873729ed05c7f92544c3ff0c08bc"></a><!-- doxytag: member="tbb::scalable_allocator::scalable_allocator" ref="eee1873729ed05c7f92544c3ff0c08bc" args="(const scalable_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>scalable_allocator</b> (const <a class="el" href="a00325.html">scalable_allocator</a> &) throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="63c3b0a76cd7964dec2f3d54afbb05f3"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::queue_operation" ref="63c3b0a76cd7964dec2f3d54afbb05f3" args="" -->
+typedef <a class="el" href="a00275.html">buffer_node</a>< T, A <br>
+>::buffer_operation </td><td class="memItemRight" valign="bottom"><b>queue_operation</b></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d56dc9f231c59f912297ac3c3b3b93b6"></a><!-- doxytag: member="tbb::scalable_allocator::scalable_allocator" ref="d56dc9f231c59f912297ac3c3b3b93b6" args="(const scalable_allocator< U > &)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>scalable_allocator</b> (const <a class="el" href="a00325.html">scalable_allocator</a>< U > &) throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b748e310297e1e3f88952a2a9876bab979763449c8716cdd38fda58e607551f1"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::WAIT" ref="b748e310297e1e3f88952a2a9876bab979763449c8716cdd38fda58e607551f1" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78fa13a188b542ea724d45a9dbf5a071"></a><!-- doxytag: member="tbb::scalable_allocator::address" ref="78fa13a188b542ea724d45a9dbf5a071" args="(reference x) const " -->
-pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b748e310297e1e3f88952a2a9876bab923e845160e46a20fb8550132f04e94aa"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::SUCCEEDED" ref="b748e310297e1e3f88952a2a9876bab923e845160e46a20fb8550132f04e94aa" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14be4ad8eb478c87e240e605221ab455"></a><!-- doxytag: member="tbb::scalable_allocator::address" ref="14be4ad8eb478c87e240e605221ab455" args="(const_reference x) const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b748e310297e1e3f88952a2a9876bab9ad699b139814d0746be2266041081474"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::FAILED" ref="b748e310297e1e3f88952a2a9876bab9ad699b139814d0746be2266041081474" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="726b1586d05d44665a36e1c7b2699bfd"></a><!-- doxytag: member="tbb::scalable_allocator::allocate" ref="726b1586d05d44665a36e1c7b2699bfd" args="(size_type n, const void *=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a> (size_type n, const void *=0)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0,
+<b>SUCCEEDED</b>,
+<b>FAILED</b>
+ }</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f806a238c18cbcfb531e1e0a0d2ec59d"></a><!-- doxytag: member="tbb::scalable_allocator::deallocate" ref="f806a238c18cbcfb531e1e0a0d2ec59d" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a> (pointer p, size_type)</td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8eecd6591d7565cbb5b7f1e37bf97979"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_forward_task" ref="8eecd6591d7565cbb5b7f1e37bf97979" args="(queue_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#8eecd6591d7565cbb5b7f1e37bf97979">internal_forward_task</a> (queue_operation *op)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="880e766f1d913988c21973dbdd874fd5"></a><!-- doxytag: member="tbb::scalable_allocator::max_size" ref="880e766f1d913988c21973dbdd874fd5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html#880e766f1d913988c21973dbdd874fd5">max_size</a> () const throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cfd2350a4c9d14486a8a9285acb9ca49"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_pop" ref="cfd2350a4c9d14486a8a9285acb9ca49" args="(queue_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (queue_operation *op)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ed8bb152d79ff46a1d03b095e62f9291"></a><!-- doxytag: member="tbb::scalable_allocator::construct" ref="ed8bb152d79ff46a1d03b095e62f9291" args="(pointer p, Args &&...args)" -->
-template<typename... Args> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>construct</b> (pointer p, Args &&...args)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf478ff2ae265ec859928191e2f7dbe3"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_reserve" ref="bf478ff2ae265ec859928191e2f7dbe3" args="(queue_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (queue_operation *op)</td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d67eee760d9fd829064927e7fe1b54fb"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_consume" ref="d67eee760d9fd829064927e7fe1b54fb" args="(queue_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (queue_operation *op)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::scalable_allocator< T ></h3>
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::flow::interface6::queue_node< T, A ></h3>
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
-<p>
-The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
+Forwards messages in FIFO order.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00608.html">scalable_allocator.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00313.png b/doc/html/a00325.png
similarity index 100%
rename from doc/html/a00313.png
rename to doc/html/a00325.png
diff --git a/doc/html/a00326.html b/doc/html/a00326.html
index bb877d6..ae5575e 100644
--- a/doc/html/a00326.html
+++ b/doc/html/a00326.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::scalable_allocator< void > Class Template Reference</title>
+<title>tbb::queuing_mutex Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,48 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00326.html">scalable_allocator< void ></a></div>
-<h1>tbb::scalable_allocator< void > Class Template Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00326.html">queuing_mutex</a></div>
+<h1>tbb::queuing_mutex Class Reference<br>
<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::scalable_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::queuing_mutex" -->Queuing mutex with local-only spinning.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00608.html">scalable_allocator.h</a>></code>
+<code>#include <queuing_mutex.h></code>
<p>
-<a href="a00123.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00112.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2046816029c2c7856f7684aed2af9cff"></a><!-- doxytag: member="tbb::scalable_allocator< void >::pointer" ref="2046816029c2c7856f7684aed2af9cff" args="" -->
-typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b389ad9c4db7293e4bdb5b8cda69ec04"></a><!-- doxytag: member="tbb::queuing_mutex::queuing_mutex" ref="b389ad9c4db7293e4bdb5b8cda69ec04" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00326.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="591c568d23f8aadf6ea8d1dc939c4e75"></a><!-- doxytag: member="tbb::scalable_allocator< void >::const_pointer" ref="591c568d23f8aadf6ea8d1dc939c4e75" args="" -->
-typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c1fe92760dcd1c5a7ed52c6599a72f"></a><!-- doxytag: member="tbb::queuing_mutex::internal_construct" ref="96c1fe92760dcd1c5a7ed52c6599a72f" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="64dbab666af0740c30b77edac9f157ce"></a><!-- doxytag: member="tbb::scalable_allocator< void >::value_type" ref="64dbab666af0740c30b77edac9f157ce" args="" -->
-typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="420932f70ff3b85f7280ff11a133938d"></a><!-- doxytag: member="tbb::queuing_mutex::is_rw_mutex" ref="420932f70ff3b85f7280ff11a133938d" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dc0c749f3a4e6ea75418677cb8f9205f"></a><!-- doxytag: member="tbb::queuing_mutex::is_recursive_mutex" ref="dc0c749f3a4e6ea75418677cb8f9205f" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55d5339e4ca04b759f90c0c1ef966539"></a><!-- doxytag: member="tbb::queuing_mutex::is_fair_mutex" ref="55d5339e4ca04b759f90c0c1ef966539" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00327.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- class tbb::scalable_allocator< void ></h3>
-
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+Queuing mutex with local-only spinning.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00608.html">scalable_allocator.h</a></ul>
+<li>queuing_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00327.html b/doc/html/a00327.html
index f5078f7..d6521f6 100644
--- a/doc/html/a00327.html
+++ b/doc/html/a00327.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::sender< T > Class Template Reference</title>
+<title>tbb::queuing_mutex::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,70 +21,71 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00327.html">sender</a></div>
-<h1>tbb::flow::interface6::sender< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::sender" -->Pure virtual template class that defines a sender of messages of type T.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00326.html">queuing_mutex</a>::<a class="el" href="a00327.html">scoped_lock</a></div>
+<h1>tbb::queuing_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_mutex::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <queuing_mutex.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::sender< T >:
-<p><center><img src="a00327.png" usemap="#tbb::flow::interface6::sender< T >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::sender< T >_map">
-<area href="a00262.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="0,56,352,80">
-<area href="a00263.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
-<area href="a00292.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="724,56,1076,80">
-<area href="a00312.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
-<area href="a00313.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
-<area href="a00328.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
-</map>
-<a href="a00053.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00113.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="127af99916cc085cd9dbc09c53299928"></a><!-- doxytag: member="tbb::flow::interface6::sender::output_type" ref="127af99916cc085cd9dbc09c53299928" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#127af99916cc085cd9dbc09c53299928">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d690e8a54e358968f0ee4fdf9ee73068"></a><!-- doxytag: member="tbb::flow::interface6::sender::successor_type" ref="d690e8a54e358968f0ee4fdf9ee73068" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="68b8941ad77b9303cf3bcb8cf1f2d28a"></a><!-- doxytag: member="tbb::flow::interface6::sender::register_successor" ref="68b8941ad77b9303cf3bcb8cf1f2d28a" args="(successor_type &r)=0" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a> (<a class="el" href="a00321.html">successor_type</a> &r)=0</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a new successor to this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="82f363bfb1738bb8789e167590b10ef9"></a><!-- doxytag: member="tbb::flow::interface6::sender::remove_successor" ref="82f363bfb1738bb8789e167590b10ef9" args="(successor_type &r)=0" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a> (<a class="el" href="a00321.html">successor_type</a> &r)=0</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <a href="#db0fa3967491014572e24d6607bdc971"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9b51ef972f5618ac17caadb58841ab6d"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="9b51ef972f5618ac17caadb58841ab6d" args="(queuing_mutex &m)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a> (<a class="el" href="a00326.html">queuing_mutex</a> &m)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="922fb56b0aad090b90a98b7d56b76a59"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_get" ref="922fb56b0aad090b90a98b7d56b76a59" args="(T &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a> (T &)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac2c576a93570957d694192a5f491443"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::~scoped_lock" ref="ac2c576a93570957d694192a5f491443" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02c05b472271db1b68a48ea2618fa72f"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_reserve" ref="02c05b472271db1b68a48ea2618fa72f" args="(T &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a> (T &)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="533e4fc8355ee321206a0609c42d909d"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::acquire" ref="533e4fc8355ee321206a0609c42d909d" args="(queuing_mutex &m)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#533e4fc8355ee321206a0609c42d909d">acquire</a> (<a class="el" href="a00326.html">queuing_mutex</a> &m)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item in the sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27036b06d6a91e97007e14f400529199"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_release" ref="27036b06d6a91e97007e14f400529199" args="()" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#27036b06d6a91e97007e14f400529199">try_release</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e5a014fb817599386a87170cf2cf51a9"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::try_acquire" ref="e5a014fb817599386a87170cf2cf51a9" args="(queuing_mutex &m)" -->
+bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a> (<a class="el" href="a00326.html">queuing_mutex</a> &m)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the reserved item. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b840f50da117a0d6848707c1857ea2e"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_consume" ref="7b840f50da117a0d6848707c1857ea2e" args="()" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex if free (i.e. non-blocking). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bf2b8c87ff22115be9b2eac179f2d30"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::release" ref="3bf2b8c87ff22115be9b2eac179f2d30" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes the reserved item. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::flow::interface6::sender< T ></h3>
+The scoped locking pattern.
+<p>
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="db0fa3967491014572e24d6607bdc971"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="db0fa3967491014572e24d6607bdc971" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tbb::queuing_mutex::scoped_lock::scoped_lock </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-Pure virtual template class that defines a sender of messages of type T.
<p>
+Construct lock that has not acquired a mutex.
+<p>
+Equivalent to zero-initialization of *this.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>queuing_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00328.html b/doc/html/a00328.html
index b48bfa4..638a1cc 100644
--- a/doc/html/a00328.html
+++ b/doc/html/a00328.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::sequencer_node< T, A > Class Template Reference</title>
+<title>tbb::queuing_rw_mutex Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,89 +21,54 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00328.html">sequencer_node</a></div>
-<h1>tbb::flow::interface6::sequencer_node< T, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::sequencer_node" --><!-- doxytag: inherits="tbb::flow::interface6::queue_node" -->Forwards messages in sequence order.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00328.html">queuing_rw_mutex</a></div>
+<h1>tbb::queuing_rw_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::queuing_rw_mutex" -->Queuing reader-writer mutex with local-only spinning.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <queuing_rw_mutex.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::sequencer_node< T, A >:
-<p><center><img src="a00328.png" usemap="#tbb::flow::interface6::sequencer_node< T, A >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::sequencer_node< T, A >_map">
-<area href="a00313.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="280,112,550,136">
-<area href="a00263.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="280,56,550,80">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,270,24">
-<area href="a00321.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="280,0,550,24">
-<area href="a00327.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="560,0,830,24">
-</map>
-<a href="a00075.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00114.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af629f26832ff4e476e240637a78bc0c"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::input_type" ref="af629f26832ff4e476e240637a78bc0c" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#af629f26832ff4e476e240637a78bc0c">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ca026eaef70e35791c407323199031a7"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::output_type" ref="ca026eaef70e35791c407323199031a7" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#ca026eaef70e35791c407323199031a7">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8127e36811832563fe1e9bc3ba391f79"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::predecessor_type" ref="8127e36811832563fe1e9bc3ba391f79" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< <a class="el" href="a00328.html#af629f26832ff4e476e240637a78bc0c">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#8127e36811832563fe1e9bc3ba391f79">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="795f3ee75f133b9d3b159172fc4a197f"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::successor_type" ref="795f3ee75f133b9d3b159172fc4a197f" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00328.html#ca026eaef70e35791c407323199031a7">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#795f3ee75f133b9d3b159172fc4a197f">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7e71cbdf78f989091bc162b89bee7e66"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::sequencer_node" ref="7e71cbdf78f989091bc162b89bee7e66" args="(graph &g, const Sequencer &s)" -->
-template<typename Sequencer> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00328.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a> (<a class="el" href="a00288.html">graph</a> &g, const Sequencer &s)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="85c90877c3447690ac4e2ac4ff8dea5e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::queuing_rw_mutex" ref="85c90877c3447690ac4e2ac4ff8dea5e" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b38e7a070552960384bcc1d91af13a5c"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::sequencer_node" ref="b38e7a070552960384bcc1d91af13a5c" args="(const sequencer_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#b38e7a070552960384bcc1d91af13a5c">sequencer_node</a> (const <a class="el" href="a00328.html">sequencer_node</a> &src)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ba73e3d95cfdf8323880bc623af9099"></a><!-- doxytag: member="tbb::queuing_rw_mutex::~queuing_rw_mutex" ref="1ba73e3d95cfdf8323880bc623af9099" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93d3d8f6a72b3e1387047282116ed6ee"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::~sequencer_node" ref="93d3d8f6a72b3e1387047282116ed6ee" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. q_tail is non-NULL. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb88522d145ad7bcf5bebfa7d2a6122b"></a><!-- doxytag: member="tbb::queuing_rw_mutex::internal_construct" ref="eb88522d145ad7bcf5bebfa7d2a6122b" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6a0608d8fbfa05edde1e1da559f9eb40"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::size_type" ref="6a0608d8fbfa05edde1e1da559f9eb40" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
->::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0dc1e28d3033e8f9556f5b13b7b57d0f"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_rw_mutex" ref="0dc1e28d3033e8f9556f5b13b7b57d0f" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d50b89267bddf58afeb3e784aba0f0d6"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::sequencer_operation" ref="d50b89267bddf58afeb3e784aba0f0d6" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
->::buffer_operation </td><td class="memItemRight" valign="bottom"><b>sequencer_operation</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e6ad08ef251f9ea898bd5f67963869c5"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_recursive_mutex" ref="e6ad08ef251f9ea898bd5f67963869c5" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1372a379c01bc269b36bf3128560879e1cdf6bcff9743d2be54bc70c4300cd28"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::WAIT" ref="1372a379c01bc269b36bf3128560879e1cdf6bcff9743d2be54bc70c4300cd28" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="147b34120505e419f6ea8d631ec4375d"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_fair_mutex" ref="147b34120505e419f6ea8d631ec4375d" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1372a379c01bc269b36bf3128560879e544c3030ddd97ba489e7d2bf1c612bc8"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::SUCCEEDED" ref="1372a379c01bc269b36bf3128560879e544c3030ddd97ba489e7d2bf1c612bc8" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1372a379c01bc269b36bf3128560879ee298eb3257a044e4d0aca8a58f2f62b0"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::FAILED" ref="1372a379c01bc269b36bf3128560879ee298eb3257a044e4d0aca8a58f2f62b0" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0,
-<b>SUCCEEDED</b>,
-<b>FAILED</b>
- }</td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00329.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
- class tbb::flow::interface6::sequencer_node< T, A ></h3>
-
-Forwards messages in sequence order.
+Queuing reader-writer mutex with local-only spinning.
+<p>
+Adapted from Krieger, Stumm, et al. pseudocode at <a href="http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93">http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93</a>
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>queuing_rw_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00329.html b/doc/html/a00329.html
index 701d7fd..a280b47 100644
--- a/doc/html/a00329.html
+++ b/doc/html/a00329.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::simple_partitioner Class Reference</title>
+<title>tbb::queuing_rw_mutex::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,44 +21,100 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00329.html">simple_partitioner</a></div>
-<h1>tbb::simple_partitioner Class Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::simple_partitioner" -->A simple partitioner.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00328.html">queuing_rw_mutex</a>::<a class="el" href="a00329.html">scoped_lock</a></div>
+<h1>tbb::queuing_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_rw_mutex::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00575.html">partitioner.h</a>></code>
+<code>#include <queuing_rw_mutex.h></code>
<p>
-<a href="a00101.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00115.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f730f70d21df405adaebfc2018f59cd"></a><!-- doxytag: member="tbb::simple_partitioner::serial::interface6::start_for" ref="5f730f70d21df405adaebfc2018f59cd" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>serial::interface6::start_for</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a4cd0ffed4fad0d9af2c5efdaf586a8"></a><!-- doxytag: member="tbb::simple_partitioner::interface6::internal::start_for" ref="8a4cd0ffed4fad0d9af2c5efdaf586a8" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_for</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <a href="#c62e365be7bcbba091c9ea7454a4d22c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fbb8798792d3aebb136c46fc63d2529e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="fbb8798792d3aebb136c46fc63d2529e" args="(queuing_rw_mutex &m, bool write=true)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a> (<a class="el" href="a00328.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86f0750233dd6c83b65fb684338fd09f"></a><!-- doxytag: member="tbb::simple_partitioner::interface6::internal::start_reduce" ref="86f0750233dd6c83b65fb684338fd09f" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_reduce</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="32c7d67a660d23ebbaab1a1d2826d31a"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::~scoped_lock" ref="32c7d67a660d23ebbaab1a1d2826d31a" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::simple_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8dd5ab8686e76de21587544dbb681e0"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::acquire" ref="a8dd5ab8686e76de21587544dbb681e0" args="(queuing_rw_mutex &m, bool write=true)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a> (<a class="el" href="a00328.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>partition_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e4ff6c9ec2fee6682f95290d1f42baa"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::try_acquire" ref="2e4ff6c9ec2fee6682f95290d1f42baa" args="(queuing_rw_mutex &m, bool write=true)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a> (<a class="el" href="a00328.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex if free (i.e. non-blocking). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67ae221109ddc69510ab593874e435d4"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::release" ref="67ae221109ddc69510ab593874e435d4" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html#67ae221109ddc69510ab593874e435d4">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer. <a href="#11ba1da4a722c9e6f73339a52c487e82"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d2f93edf7b15ec4bcee138823220c52"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::downgrade_to_reader" ref="0d2f93edf7b15ec4bcee138823220c52" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Downgrade writer to become a reader. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A simple partitioner.
+The scoped locking pattern.
+<p>
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="c62e365be7bcbba091c9ea7454a4d22c"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="c62e365be7bcbba091c9ea7454a4d22c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tbb::queuing_rw_mutex::scoped_lock::scoped_lock </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Construct lock that has not acquired a mutex.
+<p>
+Equivalent to zero-initialization of *this.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="11ba1da4a722c9e6f73339a52c487e82"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer" ref="11ba1da4a722c9e6f73339a52c487e82" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
<p>
-Divides the range until the range is not divisible.
+Upgrade reader to become a writer.
<p>
+Returns whether the upgrade happened without releasing and re-acquiring the lock
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00575.html">partitioner.h</a></ul>
+<li>queuing_rw_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00330.html b/doc/html/a00330.html
index cea9942..167e46d 100644
--- a/doc/html/a00330.html
+++ b/doc/html/a00330.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::source_node< Output > Class Template Reference</title>
+<title>tbb::interface5::reader_writer_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,112 +21,198 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00330.html">source_node</a></div>
-<h1>tbb::flow::interface6::source_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::source_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::sender< Output >" -->An executable node that acts as a source, i.e. it has no predecessors.
+<a class="el" href="a00428.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00330.html">reader_writer_lock</a></div>
+<h1>tbb::interface5::reader_writer_lock Class Reference<br>
+<small>
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock" -->Writer-preference reader-writer lock with local-only spinning on readers.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <reader_writer_lock.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::source_node< Output >:
-<p><center><img src="a00330.png" usemap="#tbb::flow::interface6::source_node< Output >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::source_node< Output >_map">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,262,24">
-<area href="a00327.html" alt="tbb::flow::interface6::sender< Output >" shape="rect" coords="272,0,534,24">
-</map>
-<a href="a00061.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00116.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="407533487cc3f6032c1072cba19c609c"></a><!-- doxytag: member="tbb::flow::interface6::source_node::output_type" ref="407533487cc3f6032c1072cba19c609c" args="" -->
-typedef Output </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf005142e2b9af377a8d33c6604d858862"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::waiting_nonblocking" ref="6f921f0d7c1812ceb5674418c8b6ccaf005142e2b9af377a8d33c6604d858862" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>waiting_nonblocking</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The type of the output message, which is complete. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd7b8fe78f0bec9d6b70cbf1018a69fe"></a><!-- doxytag: member="tbb::flow::interface6::source_node::successor_type" ref="dd7b8fe78f0bec9d6b70cbf1018a69fe" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< Output > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">successor_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf18bcc9aae8f056c34fb61bb7fc39b432"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::waiting" ref="6f921f0d7c1812ceb5674418c8b6ccaf18bcc9aae8f056c34fb61bb7fc39b432" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>waiting</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The type of successors of this node. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="503c3b395c629296bf5cccd96d6388c1"></a><!-- doxytag: member="tbb::flow::interface6::source_node::source_node" ref="503c3b395c629296bf5cccd96d6388c1" args="(graph &g, Body body, bool is_active=true)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00330.html#503c3b395c629296bf5cccd96d6388c1">source_node</a> (<a class="el" href="a00288.html">graph</a> &g, Body body, bool is_active=true)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf423c082d5cdc9bb12d0eeadcae56adb5"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::active" ref="6f921f0d7c1812ceb5674418c8b6ccaf423c082d5cdc9bb12d0eeadcae56adb5" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>active</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for a node with a successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="adaac111fbcace95804219a5f2929304"></a><!-- doxytag: member="tbb::flow::interface6::source_node::source_node" ref="adaac111fbcace95804219a5f2929304" args="(const source_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#adaac111fbcace95804219a5f2929304">source_node</a> (const <a class="el" href="a00330.html">source_node</a> &src)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccafa9a5b17bdfb0a6d59b3cd58fecbd9610"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::invalid" ref="6f921f0d7c1812ceb5674418c8b6ccafa9a5b17bdfb0a6d59b3cd58fecbd9610" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>invalid</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61700b0865fc17188b0abe26bbde65b6"></a><!-- doxytag: member="tbb::flow::interface6::source_node::~source_node" ref="61700b0865fc17188b0abe26bbde65b6" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { <b>waiting_nonblocking</b>,
+<b>waiting</b>,
+<b>active</b>,
+<b>invalid</b>
+ }</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="22960d499df9f1569a9d8a544e35afe3"></a><!-- doxytag: member="tbb::flow::interface6::source_node::register_successor" ref="22960d499df9f1569a9d8a544e35afe3" args="(receiver< output_type > &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a> (<a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a> > &r)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Status type for nodes associated with lock instances. <a href="a00330.html#6f921f0d7c1812ceb5674418c8b6ccaf">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c1431c4293e777efd9aab9a95c2a46e1"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::reader_writer_lock" ref="c1431c4293e777efd9aab9a95c2a46e1" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a new successor to this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="222484bf295f39df36415a29e508e5c9"></a><!-- doxytag: member="tbb::flow::interface6::source_node::remove_successor" ref="222484bf295f39df36415a29e508e5c9" args="(receiver< output_type > &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#222484bf295f39df36415a29e508e5c9">remove_successor</a> (<a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a> > &r)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00330.html">reader_writer_lock</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5135f64f7b7339017f33d956445edbee"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::~reader_writer_lock" ref="5135f64f7b7339017f33d956445edbee" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41073ad4d3510ed5a8b6bda9c0f58636"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_get" ref="41073ad4d3510ed5a8b6bda9c0f58636" args="(output_type &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a> (<a class="el" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructs a <a class="el" href="a00330.html">reader_writer_lock</a> object. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#2653d1a2d560059a51219a8ceab3ade9">lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad459713ff3c1c9ad0f4826daa141f65"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_reserve" ref="ad459713ff3c1c9ad0f4826daa141f65" args="(output_type &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a> (<a class="el" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00330.html">reader_writer_lock</a> for write. <a href="#2653d1a2d560059a51219a8ceab3ade9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#721eb173e154ab38292273e9266a9b07">try_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#494678baf9096835268736b800824460">try_release</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00330.html">reader_writer_lock</a> for write. <a href="#721eb173e154ab38292273e9266a9b07"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item. <a href="#494678baf9096835268736b800824460"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7fcc29e2894b29138be3c1edce9bc9"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_consume" ref="2c7fcc29e2894b29138be3c1edce9bc9" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00330.html">reader_writer_lock</a> for read. <a href="#d9d16a24d9f6c3dada73c6b9ff214f5b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes a reserved item. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b647e4a93d08ccdd8d323279e4eaaa6"></a><!-- doxytag: member="tbb::flow::interface6::source_node::activate" ref="4b647e4a93d08ccdd8d323279e4eaaa6" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00330.html">reader_writer_lock</a> for read. <a href="#595fb23952e3b89426b1f7938dea9b11"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5113b32689305599b2c36b5831547704"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::unlock" ref="5113b32689305599b2c36b5831547704" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html#5113b32689305599b2c36b5831547704">unlock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Activates a node that was created in the inactive state. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the <a class="el" href="a00330.html">reader_writer_lock</a>. <br></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15fb463802e1e30f5f836535d490874c"></a><!-- doxytag: member="tbb::flow::interface6::source_node::internal::source_task< source_node< output_type > >" ref="15fb463802e1e30f5f836535d490874c" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::source_task< source_node< output_type > ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="680274059774b9188889d34986314f81"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read" ref="680274059774b9188889d34986314f81" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock_read</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00331.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for write locks. <a href="a00331.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html">scoped_lock_read</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for read locks. <a href="a00332.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Output><br>
- class tbb::flow::interface6::source_node< Output ></h3>
+Writer-preference reader-writer lock with local-only spinning on readers.
+<p>
+Loosely adapted from Mellor-Crummey and Scott pseudocode at <a href="http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp">http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp</a>
+<p>
+<hr><h2>Member Enumeration Documentation</h2>
+<a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::status_t" ref="6f921f0d7c1812ceb5674418c8b6ccaf" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="a00330.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock::status_t</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-An executable node that acts as a source, i.e. it has no predecessors.
<p>
+Status type for nodes associated with lock instances.
+<p>
+waiting_nonblocking: the wait state for nonblocking lock instances; for writes, these transition straight to active states; for reads, these are unused.<p>
+waiting: the start and spin state for all lock instances; these will transition to active state when appropriate. Non-blocking write locks transition from this state to waiting_nonblocking immediately.<p>
+active: the active state means that the lock instance holds the lock; it will transition to invalid state during node deletion<p>
+invalid: the end state for all nodes; this is set in the destructor so if we encounter this state, we are looking at memory that has already been freed<p>
+The state diagrams below describe the status transitions. Single arrows indicate that the thread that owns the node is responsible for the transition; double arrows indicate that any thread could make the transition.<p>
+State diagram for <a class="el" href="a00331.html">scoped_lock</a> status:<p>
+waiting ----------> waiting_nonblocking | _____________/ | V V V active -----------------> invalid<p>
+State diagram for <a class="el" href="a00332.html">scoped_lock_read</a> status:<p>
+waiting | V active ----------------->invalid
+</div>
+</div><p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="494678baf9096835268736b800824460"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_release" ref="494678baf9096835268736b800824460" args="()" -->
+<a class="anchor" name="2653d1a2d560059a51219a8ceab3ade9"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::lock" ref="2653d1a2d560059a51219a8ceab3ade9" args="()" -->
<div class="memitem">
<div class="memproto">
-<div class="memtemplate">
-template<typename Output> </div>
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00330.html">tbb::flow::interface6::source_node</a>< Output >::try_release </td>
+ <td class="memname">void __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::lock </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
+ <td width="100%"></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Release a reserved item.
+Acquires the <a class="el" href="a00330.html">reader_writer_lock</a> for write.
+<p>
+If the lock is currently held in write mode by another context, the writer will block by spinning on a local variable. Exceptions thrown: <a class="el" href="a00302.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00330.html">reader_writer_lock</a> that it already has write ownership of.
+</div>
+</div><p>
+<a class="anchor" name="d9d16a24d9f6c3dada73c6b9ff214f5b"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::lock_read" ref="d9d16a24d9f6c3dada73c6b9ff214f5b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::lock_read </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Acquires the <a class="el" href="a00330.html">reader_writer_lock</a> for read.
+<p>
+If the lock is currently held by a writer, this reader will block and wait until the writers are done. Exceptions thrown: <a class="el" href="a00302.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00330.html">reader_writer_lock</a> that it already has write ownership of.
+</div>
+</div><p>
+<a class="anchor" name="721eb173e154ab38292273e9266a9b07"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::try_lock" ref="721eb173e154ab38292273e9266a9b07" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::try_lock </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Tries to acquire the <a class="el" href="a00330.html">reader_writer_lock</a> for write.
+<p>
+This function does not block. Return Value: True or false, depending on whether the lock is acquired or not. If the lock is already held by this acquiring context, <a class="el" href="a00330.html#721eb173e154ab38292273e9266a9b07">try_lock()</a> returns false.
+</div>
+</div><p>
+<a class="anchor" name="595fb23952e3b89426b1f7938dea9b11"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::try_lock_read" ref="595fb23952e3b89426b1f7938dea9b11" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::try_lock_read </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
<p>
-true = item has been released and so remains in sender, dest must request or reserve future items
+Tries to acquire the <a class="el" href="a00330.html">reader_writer_lock</a> for read.
<p>
-Reimplemented from <a class="el" href="a00327.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< Output ></a>.
+This function does not block. Return Value: True or false, depending on whether the lock is acquired or not.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>reader_writer_lock.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00331.html b/doc/html/a00331.html
index 63d8419..6d1402c 100644
--- a/doc/html/a00331.html
+++ b/doc/html/a00331.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::spin_mutex Class Reference</title>
+<title>tbb::interface5::reader_writer_lock::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,108 +21,44 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00331.html">spin_mutex</a></div>
-<h1>tbb::spin_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::spin_mutex" -->A lock that occupies a single byte.
+<a class="el" href="a00428.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00330.html">reader_writer_lock</a>::<a class="el" href="a00331.html">scoped_lock</a></div>
+<h1>tbb::interface5::reader_writer_lock::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock" -->The scoped lock pattern for write locks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00611.html">spin_mutex.h</a>></code>
+<code>#include <reader_writer_lock.h></code>
<p>
-<a href="a00125.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00117.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00331.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf19f20e082887c1bb0ba6b0911c3583"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::scoped_lock" ref="cf19f20e082887c1bb0ba6b0911c3583" args="(reader_writer_lock &lock)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00331.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a> (<a class="el" href="a00330.html">reader_writer_lock</a> &lock)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired lock. <a href="#3d8fb44644fd8d41ada1fbeba7409be3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b3fa21632815f8fab2fd6c67ec0d48c"></a><!-- doxytag: member="tbb::spin_mutex::internal_construct" ref="4b3fa21632815f8fab2fd6c67ec0d48c" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct with blocking attempt to acquire write lock on the passed-in lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="70246e0260493625ff956fa5926fc71f"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::~scoped_lock" ref="70246e0260493625ff956fa5926fc71f" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00331.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f748989e19b6045e3a2d2ee73626a28"></a><!-- doxytag: member="tbb::spin_mutex::lock" ref="4f748989e19b6045e3a2d2ee73626a28" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00331.html#4f748989e19b6045e3a2d2ee73626a28">lock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor, releases the write lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aea1cb0e88be9874f0f72e52063d0b90"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator new" ref="aea1cb0e88be9874f0f72e52063d0b90" args="(size_t s)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>operator new</b> (size_t s)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00331.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#8f9a58fb56a2b4c5efe1a7f7c1ae2074"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e843ee6265f57f27d228ba91e7308ef"></a><!-- doxytag: member="tbb::spin_mutex::unlock" ref="0e843ee6265f57f27d228ba91e7308ef" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00331.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7c93ca9e7ab656037a43984f24c051"></a><!-- doxytag: member="tbb::spin_mutex::is_rw_mutex" ref="5a7c93ca9e7ab656037a43984f24c051" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a967c455d0d80c9bbe030905201391b6"></a><!-- doxytag: member="tbb::spin_mutex::is_recursive_mutex" ref="a967c455d0d80c9bbe030905201391b6" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec12e4036073fb684b6d2d33493ed0aa"></a><!-- doxytag: member="tbb::spin_mutex::is_fair_mutex" ref="ec12e4036073fb684b6d2d33493ed0aa" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db804a05fcd37f7e81b94752e45039f7"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator delete" ref="db804a05fcd37f7e81b94752e45039f7" args="(void *p)" -->
+void </td><td class="memItemRight" valign="bottom"><b>operator delete</b> (void *p)</td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38eb53abbe72543f5967c63aa95b403e"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::reader_writer_lock" ref="38eb53abbe72543f5967c63aa95b403e" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>reader_writer_lock</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00332.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A lock that occupies a single byte.
-<p>
-A <a class="el" href="a00331.html">spin_mutex</a> is a spin mutex that fits in a single byte. It should be used only for locking short critical sections (typically less than 20 instructions) when fairness is not an issue. If zero-initialized, the mutex is considered unheld.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="3d8fb44644fd8d41ada1fbeba7409be3"></a><!-- doxytag: member="tbb::spin_mutex::spin_mutex" ref="3d8fb44644fd8d41ada1fbeba7409be3" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::spin_mutex::spin_mutex </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Construct unacquired lock.
-<p>
-Equivalent to zero-initialization of *this.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="8f9a58fb56a2b4c5efe1a7f7c1ae2074"></a><!-- doxytag: member="tbb::spin_mutex::try_lock" ref="8f9a58fb56a2b4c5efe1a7f7c1ae2074" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::spin_mutex::try_lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+The scoped lock pattern for write locks.
<p>
-Try acquiring lock (non-blocking).
+Scoped locks help avoid the common problem of forgetting to release the lock. This type also serves as the node for queuing locks.
<p>
-Return true if lock acquired; false otherwise.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00611.html">spin_mutex.h</a></ul>
+<li>reader_writer_lock.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00332.html b/doc/html/a00332.html
index a9b527d..58f95c3 100644
--- a/doc/html/a00332.html
+++ b/doc/html/a00332.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::spin_mutex::scoped_lock Class Reference</title>
+<title>tbb::interface5::reader_writer_lock::scoped_lock_read Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,74 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00331.html">spin_mutex</a>::<a class="el" href="a00332.html">scoped_lock</a></div>
-<h1>tbb::spin_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_mutex::scoped_lock" -->Represents acquisition of a mutex.
+<a class="el" href="a00428.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00330.html">reader_writer_lock</a>::<a class="el" href="a00332.html">scoped_lock_read</a></div>
+<h1>tbb::interface5::reader_writer_lock::scoped_lock_read Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock_read" -->The scoped lock pattern for read locks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00611.html">spin_mutex.h</a>></code>
+<code>#include <reader_writer_lock.h></code>
<p>
-<a href="a00126.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00118.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="29ae680ae7f5e685c2e15535b9c855b3"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="29ae680ae7f5e685c2e15535b9c855b3" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="87ab0dc8f7216e6ba0f7acd6aec33064"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::scoped_lock_read" ref="87ab0dc8f7216e6ba0f7acd6aec33064" args="(reader_writer_lock &lock)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a> (<a class="el" href="a00330.html">reader_writer_lock</a> &lock)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct without acquiring a mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5ce6807050a9e8f87bcb4a65dccb12ef"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="5ce6807050a9e8f87bcb4a65dccb12ef" args="(spin_mutex &m)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a> (<a class="el" href="a00331.html">spin_mutex</a> &m)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct with blocking attempt to acquire read lock on the passed-in lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd21c5f3d555d64d1de8658e15bf4966"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::~scoped_lock_read" ref="bd21c5f3d555d64d1de8658e15bf4966" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct and acquire lock on a mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ee3c338732b1f64b0b32a757807a30d"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::acquire" ref="3ee3c338732b1f64b0b32a757807a30d" args="(spin_mutex &m)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a> (<a class="el" href="a00331.html">spin_mutex</a> &m)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor, releases the read lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09e1817dddf97cc2182a573945eef91"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::operator new" ref="f09e1817dddf97cc2182a573945eef91" args="(size_t s)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>operator new</b> (size_t s)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a> (<a class="el" href="a00331.html">spin_mutex</a> &m)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f9e148ec33895c0d2669ff6820cf164"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::operator delete" ref="4f9e148ec33895c0d2669ff6820cf164" args="(void *p)" -->
+void </td><td class="memItemRight" valign="bottom"><b>operator delete</b> (void *p)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#9297ec188534b45dc0ca48f2f39a0501"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eeb615e68e963e6bf8d9c11402d0ce8e"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::release" ref="eeb615e68e963e6bf8d9c11402d0ce8e" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac6fa425d1f06c56d8b70abc51aac844"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::~scoped_lock" ref="ac6fa425d1f06c56d8b70abc51aac844" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00332.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy lock. If holding a lock, releases the lock first. <br></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6ee2a2cdaf6a2128849e7d7723d9174f"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::spin_mutex" ref="6ee2a2cdaf6a2128849e7d7723d9174f" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>spin_mutex</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38eb53abbe72543f5967c63aa95b403e"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::reader_writer_lock" ref="38eb53abbe72543f5967c63aa95b403e" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>reader_writer_lock</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Represents acquisition of a mutex.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="9297ec188534b45dc0ca48f2f39a0501"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::try_acquire" ref="9297ec188534b45dc0ca48f2f39a0501" args="(spin_mutex &m)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::spin_mutex::scoped_lock::try_acquire </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00331.html">spin_mutex</a> & </td>
- <td class="paramname"> <em>m</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Try acquiring lock (non-blocking).
+The scoped lock pattern for read locks.
<p>
-Return true if lock acquired; false otherwise.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00611.html">spin_mutex.h</a></ul>
+<li>reader_writer_lock.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00333.html b/doc/html/a00333.html
index 1b1dbd6..5addd94 100644
--- a/doc/html/a00333.html
+++ b/doc/html/a00333.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::spin_rw_mutex_v3 Class Reference</title>
+<title>tbb::flow::interface6::receiver< T > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,110 +21,91 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00333.html">spin_rw_mutex_v3</a></div>
-<h1>tbb::spin_rw_mutex_v3 Class Reference<br>
-<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3" -->Fast, unfair, spinning reader-writer lock with backoff and writer-preference.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00333.html">receiver</a></div>
+<h1>tbb::flow::interface6::receiver< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::receiver" -->Pure virtual template class that defines a receiver of messages of type T.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00612.html">spin_rw_mutex.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<a href="a00127.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::receiver< T >:
+<p><center><img src="a00333.png" usemap="#tbb::flow::interface6::receiver< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::receiver< T >_map">
+<area href="a00274.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="0,56,352,80">
+<area href="a00275.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
+<area href="a00291.html" alt="tbb::flow::interface6::continue_receiver" shape="rect" coords="724,56,1076,80">
+<area href="a00304.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="1086,56,1438,80">
+<area href="a00324.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
+<area href="a00325.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
+<area href="a00340.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
+</map>
+<a href="a00056.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d0524c99313dedea1e04464bbf2f7ef"></a><!-- doxytag: member="tbb::flow::interface6::receiver::input_type" ref="0d0524c99313dedea1e04464bbf2f7ef" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#0d0524c99313dedea1e04464bbf2f7ef">input_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fa8cff811e7c1589b805a4bb4c7a74f"></a><!-- doxytag: member="tbb::flow::interface6::receiver::predecessor_type" ref="7fa8cff811e7c1589b805a4bb4c7a74f" args="" -->
+typedef <a class="el" href="a00339.html">sender</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#7fa8cff811e7c1589b805a4bb4c7a74f">predecessor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61332b2756de89f3f5f69310cbb6e70c"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::spin_rw_mutex_v3" ref="61332b2756de89f3f5f69310cbb6e70c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b00699b235435f7b65b663d5063624a1"></a><!-- doxytag: member="tbb::flow::interface6::receiver::~receiver" ref="b00699b235435f7b65b663d5063624a1" args="()" -->
+virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">~receiver</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9a815fb2759e55072ed413f1b6970cf3"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::~spin_rw_mutex_v3" ref="9a815fb2759e55072ed413f1b6970cf3" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e1adb4060a7cbac837cd24da57c5a846"></a><!-- doxytag: member="tbb::flow::interface6::receiver::try_put" ref="e1adb4060a7cbac837cd24da57c5a846" args="(const T &t)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a> (const T &t)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. state is zero. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4007d6e1523dbc3c2bb7f889ab789a8a"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::lock" ref="4007d6e1523dbc3c2bb7f889ab789a8a" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Put an item to the receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30e3316466efe3a713c23062b6e806f3"></a><!-- doxytag: member="tbb::flow::interface6::receiver::register_predecessor" ref="30e3316466efe3a713c23062b6e806f3" args="(predecessor_type &)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a> (<a class="el" href="a00339.html">predecessor_type</a> &)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire writer lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#088bb256be794cc47d3b83791632fdfc">try_lock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a predecessor to the node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bc76547b51d3c9b633e3987d22dce95"></a><!-- doxytag: member="tbb::flow::interface6::receiver::remove_predecessor" ref="3bc76547b51d3c9b633e3987d22dce95" args="(predecessor_type &)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a> (<a class="el" href="a00339.html">predecessor_type</a> &)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring writer lock (non-blocking). <a href="#088bb256be794cc47d3b83791632fdfc"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9f52ead2098eb5fb12da59d5ae53b55"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::unlock" ref="f9f52ead2098eb5fb12da59d5ae53b55" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove a predecessor from the node. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28e9ec451c4b915033fded40126797eb"></a><!-- doxytag: member="tbb::flow::interface6::receiver::try_put_task" ref="28e9ec451c4b915033fded40126797eb" args="(const T &t)=0" -->
+virtual <a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>try_put_task</b> (const T &t)=0</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13f799708ac4ca437a16be202e263e18"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::lock_read" ref="13f799708ac4ca437a16be202e263e18" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#13f799708ac4ca437a16be202e263e18">lock_read</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3cbe1d85d9ea0506925cbc1297596d20"></a><!-- doxytag: member="tbb::flow::interface6::receiver::reset_receiver" ref="3cbe1d85d9ea0506925cbc1297596d20" args="()=0" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>reset_receiver</b> ()=0</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire reader lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#b8667415869013f840d976aa406d385a">try_lock_read</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5ac37d666be3d45d60a8509569d1607a"></a><!-- doxytag: member="tbb::flow::interface6::receiver::is_continue_receiver" ref="5ac37d666be3d45d60a8509569d1607a" args="()" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><b>is_continue_receiver</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring reader lock (non-blocking). <a href="#b8667415869013f840d976aa406d385a"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c1e60f22c01604ca93c41b8334cc15e"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_rw_mutex" ref="4c1e60f22c01604ca93c41b8334cc15e" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621bab40a858d214db69ef08d88b67c1"></a><!-- doxytag: member="tbb::flow::interface6::receiver::run_and_put_task" ref="621bab40a858d214db69ef08d88b67c1" args="" -->
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="681a816fe76d6ca7752303f9dcc3c4b2"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_recursive_mutex" ref="681a816fe76d6ca7752303f9dcc3c4b2" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">put item to successor; return task to run the successor if possible. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4fa30d87bc0bfa80942f97a8d58f1bd"></a><!-- doxytag: member="tbb::flow::interface6::receiver::internal::broadcast_cache" ref="e4fa30d87bc0bfa80942f97a8d58f1bd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::broadcast_cache</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4dd66d90df6247da6050e88b2aa3b820"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_fair_mutex" ref="4dd66d90df6247da6050e88b2aa3b820" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31ba00ea3e3e5a421b38840bd0dc2589"></a><!-- doxytag: member="tbb::flow::interface6::receiver::internal::round_robin_cache" ref="31ba00ea3e3e5a421b38840bd0dc2589" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::round_robin_cache</b></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3b6d13039c2a8c1e369e5790895b0088"></a><!-- doxytag: member="tbb::flow::interface6::receiver::limiter_node" ref="3b6d13039c2a8c1e369e5790895b0088" args="" -->
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">limiter_node</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">put receiver back in initial state <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7e5acd3345f7903a0265a1ef9f3b66bc"></a><!-- doxytag: member="tbb::flow::interface6::receiver::internal::successor_cache" ref="7e5acd3345f7903a0265a1ef9f3b66bc" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::successor_cache</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00334.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Fast, unfair, spinning reader-writer lock with backoff and writer-preference.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="088bb256be794cc47d3b83791632fdfc"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::try_lock" ref="088bb256be794cc47d3b83791632fdfc" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::spin_rw_mutex_v3::try_lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::flow::interface6::receiver< T ></h3>
+Pure virtual template class that defines a receiver of messages of type T.
<p>
-Try acquiring writer lock (non-blocking).
-<p>
-Return true if lock acquired; false otherwise.
-</div>
-</div><p>
-<a class="anchor" name="b8667415869013f840d976aa406d385a"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::try_lock_read" ref="b8667415869013f840d976aa406d385a" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::spin_rw_mutex_v3::try_lock_read </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Try acquiring reader lock (non-blocking).
-<p>
-Return true if reader lock acquired; false otherwise.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00612.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00321.png b/doc/html/a00333.png
similarity index 100%
rename from doc/html/a00321.png
rename to doc/html/a00333.png
diff --git a/doc/html/a00334.html b/doc/html/a00334.html
index 09c4189..c0ca259 100644
--- a/doc/html/a00334.html
+++ b/doc/html/a00334.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::spin_rw_mutex_v3::scoped_lock Class Reference</title>
+<title>tbb::recursive_mutex Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,88 +21,75 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00333.html">spin_rw_mutex_v3</a>::<a class="el" href="a00334.html">scoped_lock</a></div>
-<h1>tbb::spin_rw_mutex_v3::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3::scoped_lock" -->The scoped locking pattern.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00334.html">recursive_mutex</a></div>
+<h1>tbb::recursive_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::recursive_mutex" -->Mutex that allows recursive mutex acquisition.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00612.html">spin_rw_mutex.h</a>></code>
+<code>#include <recursive_mutex.h></code>
<p>
-<a href="a00128.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00119.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="889fa8cc32dd707eef7c0f52dda09c0d"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle_type" ref="889fa8cc32dd707eef7c0f52dda09c0d" args="" -->
+typedef LPCRITICAL_SECTION </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <a href="#d6ea60dee5563f702379bf5e51aa8806"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="42a92d4f8fdde425b111cfa8a9228071"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock" ref="42a92d4f8fdde425b111cfa8a9228071" args="(spin_rw_mutex &m, bool write=true)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00333.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return native_handle. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="26a40fae42bf6cd9f3f77ee7482d6164"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle_type" ref="26a40fae42bf6cd9f3f77ee7482d6164" args="" -->
+typedef pthread_mutex_t * </td><td class="memItemRight" valign="bottom"><b>native_handle_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d7eaaa3f2e2c5dc11e7005811b1bdd04"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::~scoped_lock" ref="d7eaaa3f2e2c5dc11e7005811b1bdd04" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2fceb7f95c24a8cd1457d4527e4b8c6"></a><!-- doxytag: member="tbb::recursive_mutex::recursive_mutex" ref="d2fceb7f95c24a8cd1457d4527e4b8c6" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b646ec5be02a127d159bbb7ca65353"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::acquire" ref="b0b646ec5be02a127d159bbb7ca65353" args="(spin_rw_mutex &m, bool write=true)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00333.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired <a class="el" href="a00334.html">recursive_mutex</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c342c69d47f4bb0b393535dee4015d6"></a><!-- doxytag: member="tbb::recursive_mutex::lock" ref="4c342c69d47f4bb0b393535dee4015d6" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#4c342c69d47f4bb0b393535dee4015d6">lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#86e719b0afee25704af11ab97694d240">try_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer. <a href="#3f0b1e3f2efab63336400348bd070226"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61b14d00a78185c9b2d206ebfc379124"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::release" ref="61b14d00a78185c9b2d206ebfc379124" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#61b14d00a78185c9b2d206ebfc379124">release</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#86e719b0afee25704af11ab97694d240"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f0a96e26b7f074588dc31e32524856ae"></a><!-- doxytag: member="tbb::recursive_mutex::unlock" ref="f0a96e26b7f074588dc31e32524856ae" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#f0a96e26b7f074588dc31e32524856ae">unlock</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c2c2c38a08cb9080e87099fac3e5bc94"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::downgrade_to_reader" ref="c2c2c38a08cb9080e87099fac3e5bc94" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6baa9ce4b394c39622456fd8a68f8bd8"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle" ref="6baa9ce4b394c39622456fd8a68f8bd8" args="()" -->
+<a class="el" href="a00334.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="718cc53f6b33d8c396ccca0e4ebc5606"></a><!-- doxytag: member="tbb::recursive_mutex::is_rw_mutex" ref="718cc53f6b33d8c396ccca0e4ebc5606" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Downgrade writer to become a reader. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9879626968d9b9a04cd2ec0fb2e84ae1"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::try_acquire" ref="9879626968d9b9a04cd2ec0fb2e84ae1" args="(spin_rw_mutex &m, bool write=true)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00333.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6149d7541063d8b35afd98df6f0f89d"></a><!-- doxytag: member="tbb::recursive_mutex::is_recursive_mutex" ref="f6149d7541063d8b35afd98df6f0f89d" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d96d1a1fcc3d79ef3e5c06a53b8ffeaa"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::mutex" ref="d96d1a1fcc3d79ef3e5c06a53b8ffeaa" args="" -->
-<a class="el" href="a00333.html">spin_rw_mutex</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f01aacad6b9b9d51573c0803323182fe"></a><!-- doxytag: member="tbb::recursive_mutex::is_fair_mutex" ref="f01aacad6b9b9d51573c0803323182fe" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The pointer to the current mutex that is held, or NULL if no mutex is held. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">If mutex!=NULL, then is_writer is true if holding a writer lock, false if holding a reader lock. <a href="#6b5a7c3c67a36b05c4df8410d32627d8"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00335.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00335.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern.
-<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="d6ea60dee5563f702379bf5e51aa8806"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock" ref="d6ea60dee5563f702379bf5e51aa8806" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+Mutex that allows recursive mutex acquisition.
<p>
-Construct lock that has not acquired a mutex.
+Mutex that allows recursive mutex acquisition.
<p>
-Equivalent to zero-initialization of *this.
-</div>
-</div><p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="3f0b1e3f2efab63336400348bd070226"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer" ref="3f0b1e3f2efab63336400348bd070226" args="()" -->
+<a class="anchor" name="86e719b0afee25704af11ab97694d240"></a><!-- doxytag: member="tbb::recursive_mutex::try_lock" ref="86e719b0afee25704af11ab97694d240" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">bool tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer </td>
+ <td class="memname">bool tbb::recursive_mutex::try_lock </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
@@ -113,34 +100,16 @@ Equivalent to zero-initialization of *this.
<div class="memdoc">
<p>
-Upgrade reader to become a writer.
-<p>
-Returns whether the upgrade happened without releasing and re-acquiring the lock
-</div>
-</div><p>
-<hr><h2>Member Data Documentation</h2>
-<a class="anchor" name="6b5a7c3c67a36b05c4df8410d32627d8"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::is_writer" ref="6b5a7c3c67a36b05c4df8410d32627d8" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00334.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock::is_writer</a><code> [protected]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-If mutex!=NULL, then is_writer is true if holding a writer lock, false if holding a reader lock.
+Try acquiring lock (non-blocking).
<p>
-Not defined if not holding a lock.
+Return true if lock acquired; false otherwise.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00612.html">spin_rw_mutex.h</a></ul>
+<li>recursive_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00335.html b/doc/html/a00335.html
index c157ee6..309ba39 100644
--- a/doc/html/a00335.html
+++ b/doc/html/a00335.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::split Class Reference</title>
+<title>tbb::recursive_mutex::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,28 +21,54 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00335.html">split</a></div>
-<h1>tbb::split Class Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::split" -->Dummy type that distinguishes splitting constructor from copy constructor.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00334.html">recursive_mutex</a>::<a class="el" href="a00335.html">scoped_lock</a></div>
+<h1>tbb::recursive_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::recursive_mutex::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00648.html">tbb_stddef.h</a>></code>
+<code>#include <recursive_mutex.h></code>
<p>
-<table border="0" cellpadding="0" cellspacing="0">
+<a href="a00120.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d82d4d36fbf9727a493d26ae50855fe7"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="d82d4d36fbf9727a493d26ae50855fe7" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00335.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a <a class="el" href="a00334.html">recursive_mutex</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dec17713c4c1321ac8fec66816d0c602"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="dec17713c4c1321ac8fec66816d0c602" args="(recursive_mutex &mutex)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00335.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a> (<a class="el" href="a00334.html">recursive_mutex</a> &<a class="el" href="a00313.html">mutex</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c1197ffb8f3cd9d4fed71d7e06265b7c"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::~scoped_lock" ref="c1197ffb8f3cd9d4fed71d7e06265b7c" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00335.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fb04da37cccf8c99b1f9102d9074f9a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::acquire" ref="7fb04da37cccf8c99b1f9102d9074f9a" args="(recursive_mutex &mutex)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00335.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a> (<a class="el" href="a00334.html">recursive_mutex</a> &<a class="el" href="a00313.html">mutex</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36bfc3e93e3ef6340abef4901444d340"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::try_acquire" ref="36bfc3e93e3ef6340abef4901444d340" args="(recursive_mutex &mutex)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00335.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a> (<a class="el" href="a00334.html">recursive_mutex</a> &<a class="el" href="a00313.html">mutex</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given <a class="el" href="a00334.html">recursive_mutex</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac480ea0e9d5ea0345a67d57008b6263"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::release" ref="ac480ea0e9d5ea0345a67d57008b6263" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00335.html#ac480ea0e9d5ea0345a67d57008b6263">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="459818b78a3e9985dc5a9d5638b6593e"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::recursive_mutex" ref="459818b78a3e9985dc5a9d5638b6593e" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>recursive_mutex</b></td></tr>
+
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Dummy type that distinguishes splitting constructor from copy constructor.
+The scoped locking pattern.
<p>
-See description of parallel_for and parallel_reduce for example usages.
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00648.html">tbb_stddef.h</a></ul>
+<li>recursive_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00336.html b/doc/html/a00336.html
index 8958aba..628e54b 100644
--- a/doc/html/a00336.html
+++ b/doc/html/a00336.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::flow::interface6::split_node< TupleType, Allocator > Class Template Reference</title>
+<title>tbb::interface6::runtime_loader Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,52 +21,302 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00336.html">split_node</a></div>
-<h1>tbb::flow::interface6::split_node< TupleType, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::split_node" --><!-- doxytag: inherits="tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator >" --><a class="el" href="a00336.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00336.html">runtime_loader</a></div>
+<h1>tbb::interface6::runtime_loader Class Reference</h1><!-- doxytag: class="tbb::interface6::runtime_loader" -->Load TBB at runtime.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <runtime_loader.h></code>
<p>
-<p>Inheritance diagram for tbb::flow::interface6::split_node< TupleType, Allocator >:
-<p><center><img src="a00336.png" usemap="#tbb::flow::interface6::split_node< TupleType, Allocator >_map" border="0" alt=""></center>
-<map name="tbb::flow::interface6::split_node< TupleType, Allocator >_map">
-<area href="a00300.html" alt="tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator >" shape="rect" coords="453,56,1350,80">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,897,24">
-</map>
-<a href="a00066.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00121.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0a153f789b0faa7b343c29d9b97c0f71"></a><!-- doxytag: member="tbb::flow::interface6::split_node::output_ports_type" ref="0a153f789b0faa7b343c29d9b97c0f71" args="" -->
-typedef base_type::output_ports_type </td><td class="memItemRight" valign="bottom"><b>output_ports_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="414872500f7ab2cecd98edc6945dea47"></a><!-- doxytag: member="tbb::flow::interface6::split_node::input_type" ref="414872500f7ab2cecd98edc6945dea47" args="" -->
-typedef TupleType </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Save status of operation and continue. <a href="#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06f32ac2a6bc1043ef6dd9ec40044522"></a><!-- doxytag: member="tbb::flow::interface6::split_node::allocator_type" ref="06f32ac2a6bc1043ef6dd9ec40044522" args="" -->
-typedef Allocator </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Throw an exception of tbb::runtime_loader::error_code type. <a href="#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Print message to <code>stderr</code> and call <code>abort()</code>. <a href="#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">No errors. <a href="#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid function call (e. g. <a class="el" href="a00336.html#5f3f6f1683386705a6931acae45f0862">load()</a> called when TBB is already loaded). <a href="#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid argument passed. <a href="#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid library found (e. g. <code>TBB_runtime_version</code> symbol not found). <a href="#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">TBB found but version is not suitable. <a href="#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">No suitable TBB library found. <a href="#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> { <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a>,
+<a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a>,
+<a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Error mode constants. <a href="a00336.html#bb0130fe0f596399707e61431231ebcb">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789">error_code</a> { <br>
+ <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a>,
+<a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a>,
+<a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a>,
+<a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a>,
+<br>
+ <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a>,
+<a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a>
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Error codes. <a href="a00336.html#6831be91cdc64e57e565ce0dde018789">More...</a><br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce8ee443d310145fc36e152c608c2e49"></a><!-- doxytag: member="tbb::flow::interface6::split_node::split_node" ref="ce8ee443d310145fc36e152c608c2e49" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><b>split_node</b> (<a class="el" href="a00288.html">graph</a> &g)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7caa4ff6e44c2348e67f601cc5d97c34"></a><!-- doxytag: member="tbb::interface6::runtime_loader::runtime_loader" ref="7caa4ff6e44c2348e67f601cc5d97c34" args="(error_mode mode=em_abort)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a> (<a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode=em_abort)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Initialize object but do not load TBB. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#7ae5330beb48fce0c702c32a5df0094a">runtime_loader</a> (char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode=em_abort)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c16a1c429bb2e3a33f6c56de84e63405"></a><!-- doxytag: member="tbb::flow::interface6::split_node::split_node" ref="c16a1c429bb2e3a33f6c56de84e63405" args="(const split_node &other)" -->
- </td><td class="memItemRight" valign="bottom"><b>split_node</b> (const <a class="el" href="a00336.html">split_node</a> &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Initialize object and load TBB. <a href="#7ae5330beb48fce0c702c32a5df0094a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c25fec923a751a3e03f5cbe969f1f0c5"></a><!-- doxytag: member="tbb::interface6::runtime_loader::~runtime_loader" ref="c25fec923a751a3e03f5cbe969f1f0c5" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a> ()</td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>splitting_body</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy object. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789">error_code</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#5f3f6f1683386705a6931acae45f0862">load</a> (char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Load TBB. <a href="#5f3f6f1683386705a6931acae45f0862"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789">error_code</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html#78d938ed2e54d38dd38d6609e6c60389">status</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Report status. <a href="#78d938ed2e54d38dd38d6609e6c60389"></a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename TupleType, typename Allocator = cache_aligned_allocator<TupleType>><br>
- class tbb::flow::interface6::split_node< TupleType, Allocator ></h3>
+Load TBB at runtime.
+<p>
+<b>Usage:</b> <p>
+In source code:<p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "tbb/runtime_loader.h"</span>
+
+<span class="keywordtype">char</span> <span class="keyword">const</span> * path[] = { <span class="stringliteral">"<install dir>/lib/ia32"</span>, NULL };
+tbb::runtime_loader loader( path );
+
+<span class="comment">// Now use TBB.</span>
+</pre></div><p>
+Link with <code>tbbproxy.lib</code> (or <code>libtbbproxy.a</code>) instead of <code>tbb.lib</code> (<code>libtbb.dylib</code>, <code>libtbb.so</code>).<p>
+TBB library will be loaded at runtime from <code></code> <install dir>="">/lib/ia32 directory.<p>
+<b>Attention:</b> <p>
+All <code><a class="el" href="a00336.html">runtime_loader</a></code> objects (in the same module, i.e. exe or dll) share some global state. The most noticeable piece of global state is loaded TBB library. There are some implications:<p>
+<ul>
+<li>Only one TBB library can be loaded per module.</li></ul>
+<p>
+<ul>
+<li>If one object has already loaded TBB library, another object will not load TBB. If the loaded TBB library is suitable for the second object, both will use TBB cooperatively, otherwise the second object will report an error.</li></ul>
+<p>
+<ul>
+<li><code><a class="el" href="a00336.html">runtime_loader</a></code> objects will not work (correctly) in parallel due to absence of syncronization. </li></ul>
+
+<p>
+<hr><h2>Member Enumeration Documentation</h2>
+<a class="anchor" name="6831be91cdc64e57e565ce0dde018789"></a><!-- doxytag: member="tbb::interface6::runtime_loader::error_code" ref="6831be91cdc64e57e565ce0dde018789" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader::error_code</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Error codes.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27"></a><!-- doxytag: member="ec_ok" ref="6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27" args="" -->ec_ok</em> </td><td>
+No errors. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1"></a><!-- doxytag: member="ec_bad_call" ref="6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1" args="" -->ec_bad_call</em> </td><td>
+Invalid function call (e. g. <a class="el" href="a00336.html#5f3f6f1683386705a6931acae45f0862">load()</a> called when TBB is already loaded). </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703"></a><!-- doxytag: member="ec_bad_arg" ref="6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703" args="" -->ec_bad_arg</em> </td><td>
+Invalid argument passed. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6"></a><!-- doxytag: member="ec_bad_lib" ref="6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6" args="" -->ec_bad_lib</em> </td><td>
+Invalid library found (e. g. <code>TBB_runtime_version</code> symbol not found). </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6"></a><!-- doxytag: member="ec_bad_ver" ref="6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6" args="" -->ec_bad_ver</em> </td><td>
+TBB found but version is not suitable. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb"></a><!-- doxytag: member="ec_no_lib" ref="6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb" args="" -->ec_no_lib</em> </td><td>
+No suitable TBB library found. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="bb0130fe0f596399707e61431231ebcb"></a><!-- doxytag: member="tbb::interface6::runtime_loader::error_mode" ref="bb0130fe0f596399707e61431231ebcb" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader::error_mode</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Error mode constants.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38"></a><!-- doxytag: member="em_status" ref="bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38" args="" -->em_status</em> </td><td>
+Save status of operation and continue. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b"></a><!-- doxytag: member="em_throw" ref="bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b" args="" -->em_throw</em> </td><td>
+Throw an exception of tbb::runtime_loader::error_code type. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94"></a><!-- doxytag: member="em_abort" ref="bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94" args="" -->em_abort</em> </td><td>
+Print message to <code>stderr</code> and call <code>abort()</code>. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="7ae5330beb48fce0c702c32a5df0094a"></a><!-- doxytag: member="tbb::interface6::runtime_loader::runtime_loader" ref="7ae5330beb48fce0c702c32a5df0094a" args="(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, error_mode mode=em_abort)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tbb::interface6::runtime_loader::runtime_loader </td>
+ <td>(</td>
+ <td class="paramtype">char const * </td>
+ <td class="paramname"> <em>path</em>[], </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"> <em>min_ver</em> = <code>TBB_INTERFACE_VERSION</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"> <em>max_ver</em> = <code>INT_MAX</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> </td>
+ <td class="paramname"> <em>mode</em> = <code>em_abort</code></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-<a class="el" href="a00336.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its
<p>
+Initialize object and load TBB.
+<p>
+See <a class="el" href="a00336.html#5f3f6f1683386705a6931acae45f0862">load()</a> for details.<p>
+If error mode is <code>em_status</code>, call <a class="el" href="a00336.html#78d938ed2e54d38dd38d6609e6c60389">status()</a> to check whether TBB was loaded or not. <dl compact><dt><b>Parameters: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em>path</em> </td><td>
+List of directories to search TBB in. </td></tr>
+<tr><td valign="top"><em>min_ver</em> </td><td>
+Minimal suitable version of TBB. </td></tr>
+<tr><td valign="top"><em>max_ver</em> </td><td>
+Maximal suitable version of TBB. </td></tr>
+<tr><td valign="top"><em>mode</em> </td><td>
+Error mode for this object. </td></tr>
+</table>
+</dl>
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="5f3f6f1683386705a6931acae45f0862"></a><!-- doxytag: member="tbb::interface6::runtime_loader::load" ref="5f3f6f1683386705a6931acae45f0862" args="(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789">error_code</a> tbb::interface6::runtime_loader::load </td>
+ <td>(</td>
+ <td class="paramtype">char const * </td>
+ <td class="paramname"> <em>path</em>[], </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"> <em>min_ver</em> = <code>TBB_INTERFACE_VERSION</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"> <em>max_ver</em> = <code>INT_MAX</code></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Load TBB.
+<p>
+The method searches the directories specified in <code>path</code>[] array for the TBB library. When the library is found, it is loaded and its version is checked. If the version is not suitable, the library is unloaded, and the search continues.<p>
+<b>Note:</b> <p>
+For security reasons, avoid using relative directory names. For example, never load TBB from current (<code>"."</code>), parent (<code>".."</code>) or any other relative directory (like <code>"lib"</code> ). Use only absolute directory names (e. g. "/usr/local/lib").<p>
+For the same security reasons, avoid using system default directories (<code>""</code>) on Windows. (See <a href="http://www.microsoft.com/technet/security/advisory/2269637.mspx">http://www.microsoft.com/technet/security/advisory/2269637.mspx</a> for details.)<p>
+Neglecting these rules may cause your program to execute 3-rd party malicious code.<p>
+<b>Errors:</b> <ul>
+<li><code>ec_bad_call</code> - TBB already loaded by this object.</li><li><code>ec_bad_arg</code> - <code>min_ver</code> and/or <code>max_ver</code> negative or zero, or <code>min_ver</code> > <code>max_ver</code>.</li><li><code>ec_bad_ver</code> - TBB of unsuitable version already loaded by another object.</li><li><code>ec_no_lib</code> - No suitable library found. </li></ul>
+<dl compact><dt><b>Parameters: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em>path</em> </td><td>
+List of directories to search TBB in. </td></tr>
+<tr><td valign="top"><em>min_ver</em> </td><td>
+Minimal suitable version of TBB. </td></tr>
+<tr><td valign="top"><em>max_ver</em> </td><td>
+Maximal suitable version of TBB. </td></tr>
+</table>
+</dl>
+</div>
+</div><p>
+<a class="anchor" name="78d938ed2e54d38dd38d6609e6c60389"></a><!-- doxytag: member="tbb::interface6::runtime_loader::status" ref="78d938ed2e54d38dd38d6609e6c60389" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789">error_code</a> tbb::interface6::runtime_loader::status </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Report status.
+<p>
+If error mode is <code>em_status</code>, the function returns status of the last operation.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li>runtime_loader.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00336.png b/doc/html/a00336.png
deleted file mode 100644
index b0f2ab0..0000000
Binary files a/doc/html/a00336.png and /dev/null differ
diff --git a/doc/html/a00337.html b/doc/html/a00337.html
index 9c2e5d6..954416d 100644
--- a/doc/html/a00337.html
+++ b/doc/html/a00337.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::task Class Reference</title>
+<title>tbb::scalable_allocator< T > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,602 +21,87 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00337.html">task</a></div>
-<h1>tbb::task Class Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00337.html">scalable_allocator</a></div>
+<h1>tbb::scalable_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00431.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task" -->Base class for user-defined tasks.
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::scalable_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00613.html">task.h</a>></code>
+<code>#include <scalable_allocator.h></code>
<p>
-<p>Inheritance diagram for tbb::task:
-<p><center><img src="a00337.png" usemap="#tbb::task_map" border="0" alt=""></center>
-<map name="tbb::task_map">
-<area href="a00280.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
-</map>
-<a href="a00133.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00123.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef internal::affinity_id </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a1cf13c339ee177a103a7e19bf2710a"></a><!-- doxytag: member="tbb::scalable_allocator::value_type" ref="5a1cf13c339ee177a103a7e19bf2710a" args="" -->
+typedef internal::allocator_type<<br>
+ T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An id as used for specifying affinity. <a href="#d61bb32389d3857bf7511d69beaafb76"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5121ec62bc79faba6a4b674d59e7260"></a><!-- doxytag: member="tbb::scalable_allocator::pointer" ref="a5121ec62bc79faba6a4b674d59e7260" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task is running, and will be destroyed after method <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute()</a> completes. <a href="#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="846a6fcec3bc7fa3839a12266a729a02"></a><!-- doxytag: member="tbb::scalable_allocator::const_pointer" ref="846a6fcec3bc7fa3839a12266a729a02" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task to be rescheduled. <a href="#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="254d7749de9277bb7711470c04d963ea"></a><!-- doxytag: member="tbb::scalable_allocator::reference" ref="254d7749de9277bb7711470c04d963ea" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task is in ready pool, or is going to be put there, or was just taken off. <a href="#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acad193a7f6e16253f772ba3e9b2c98f"></a><!-- doxytag: member="tbb::scalable_allocator::const_reference" ref="acad193a7f6e16253f772ba3e9b2c98f" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task object is freshly allocated or recycled. <a href="#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4a5cb7482f222a14b513bbdd4ad8507d"></a><!-- doxytag: member="tbb::scalable_allocator::size_type" ref="4a5cb7482f222a14b513bbdd4ad8507d" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task object is on free list, or is going to be put there, or was just taken off. <a href="#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cb96c23f650cf91a73e2810b54c481bb"></a><!-- doxytag: member="tbb::scalable_allocator::difference_type" ref="cb96c23f650cf91a73e2810b54c481bb" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task to be recycled as continuation <a href="#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
- <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
-<a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
-<a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
-<a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
-<br>
- <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
-<a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a>
-<br>
- }</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enumeration of task states that the scheduler considers. <a href="a00337.html#4a3c415562d17905390ea5b49d12293e">More...</a><br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245ee0473f84cb19dbbf8c81134908"></a><!-- doxytag: member="tbb::task::~task" ref="98245ee0473f84cb19dbbf8c81134908" args="()" -->
-virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#98245ee0473f84cb19dbbf8c81134908">~task</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="22c298cd40937a431a06777423f002f6"></a><!-- doxytag: member="tbb::task::execute" ref="22c298cd40937a431a06777423f002f6" args="()=0" -->
-virtual <a class="el" href="a00337.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute</a> ()=0</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Should be overridden by derived classes. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">internal::allocate_continuation_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#1434c79a5138993269d034008bff7329">allocate_continuation</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a continuation task of *this. <a href="#1434c79a5138993269d034008bff7329"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ff794f7053cd9148d5f280fbf07377f"></a><!-- doxytag: member="tbb::task::allocate_child" ref="1ff794f7053cd9148d5f280fbf07377f" args="()" -->
-internal::allocate_child_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a child task of *this. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a> (<a class="el" href="a00337.html">task</a> &t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy a task. <a href="#dfaacf92685e5f86393bf657b2853bf8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Change this to be a continuation of its former self. <a href="#a67a79e18f62b43a623a00cfbd76db4c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Recommended to use, safe variant of recycle_as_continuation. <a href="#3b290d14109704e2b69dc1ac980a7a76"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db399855177438bbc9cc61d508dae8d2"></a><!-- doxytag: member="tbb::task::recycle_as_child_of" ref="db399855177438bbc9cc61d508dae8d2" args="(task &new_parent)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00337.html">task</a> &new_parent)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Change this to be a child of new_parent. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Schedule this for reexecution after current <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. <a href="#4f1be9bbcdb487830dbe298b68d85144"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7653ceef53a188d05b5c779e1104b698"></a><!-- doxytag: member="tbb::task::depth" ref="7653ceef53a188d05b5c779e1104b698" args="() const " -->
-intptr_t </td><td class="memItemRight" valign="bottom"><b>depth</b> () const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e864e9c80e3d79f00d77fb99f4757621"></a><!-- doxytag: member="tbb::task::set_depth" ref="e864e9c80e3d79f00d77fb99f4757621" args="(intptr_t)" -->
-void </td><td class="memItemRight" valign="bottom"><b>set_depth</b> (intptr_t)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c83fcc26f6513f0e06de70cbab9dee46"></a><!-- doxytag: member="tbb::task::add_to_depth" ref="c83fcc26f6513f0e06de70cbab9dee46" args="(int)" -->
-void </td><td class="memItemRight" valign="bottom"><b>add_to_depth</b> (int)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06a4206a57e8e12a439b14d6d41cfd92"></a><!-- doxytag: member="tbb::task::set_ref_count" ref="06a4206a57e8e12a439b14d6d41cfd92" args="(int count)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a> (int count)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set reference count. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically increment reference count and returns its old value. <a href="#f5fb43c7ad0de5a4b95703cebc39e345"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically decrement reference count and returns its new value. <a href="#ef4680f5c148020c5e7e43ddef44cd5d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ce28ca9baa771cfc37ecd72e69c4f3c"></a><!-- doxytag: member="tbb::task::spawn_and_wait_for_all" ref="3ce28ca9baa771cfc37ecd72e69c4f3c" args="(task &child)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00337.html">task</a> &child)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Similar to spawn followed by wait_for_all, but more efficient. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="894ab68378e502776d8220eea7ce9fa1"></a><!-- doxytag: member="tbb::task::spawn_and_wait_for_all" ref="894ab68378e502776d8220eea7ce9fa1" args="(task_list &list)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00341.html">task_list</a> &list)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Similar to spawn followed by wait_for_all, but more efficient. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wait for reference count to become one, and set reference count to zero. <a href="#53d2615ad9c38859b4c8080936600283"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="314e98ee4347ccec83efcb9ee22e8596"></a><!-- doxytag: member="tbb::task::parent" ref="314e98ee4347ccec83efcb9ee22e8596" args="() const " -->
-<a class="el" href="a00337.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#314e98ee4347ccec83efcb9ee22e8596">parent</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task on whose behalf this task is working, or NULL if this is a root. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2eaf79fcaa3ae473e3bd3f44bd8a464"></a><!-- doxytag: member="tbb::task::set_parent" ref="d2eaf79fcaa3ae473e3bd3f44bd8a464" args="(task *p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a> (<a class="el" href="a00337.html">task</a> *p)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">sets parent task pointer to specified value <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00339.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">This method is deprecated and will be removed in the future. <a href="#d8c36a93f3972590fbb65ff1cef3173b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5987123486afca36ddebb9e2a8b7779a"></a><!-- doxytag: member="tbb::task::group" ref="5987123486afca36ddebb9e2a8b7779a" args="()" -->
-<a class="el" href="a00339.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#5987123486afca36ddebb9e2a8b7779a">group</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to the task group descriptor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9169402702f56bf519448aaf34450aa"></a><!-- doxytag: member="tbb::task::is_stolen_task" ref="f9169402702f56bf519448aaf34450aa" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eee1873729ed05c7f92544c3ff0c08bc"></a><!-- doxytag: member="tbb::scalable_allocator::scalable_allocator" ref="eee1873729ed05c7f92544c3ff0c08bc" args="(const scalable_allocator &)" -->
+ </td><td class="memItemRight" valign="bottom"><b>scalable_allocator</b> (const <a class="el" href="a00337.html">scalable_allocator</a> &) throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if task was stolen from the task pool of another thread. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0af7b2d7e6e8b4333b2accfce3dfb374"></a><!-- doxytag: member="tbb::task::state" ref="0af7b2d7e6e8b4333b2accfce3dfb374" args="() const " -->
-<a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a> () const </td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d56dc9f231c59f912297ac3c3b3b93b6"></a><!-- doxytag: member="tbb::scalable_allocator::scalable_allocator" ref="d56dc9f231c59f912297ac3c3b3b93b6" args="(const scalable_allocator< U > &)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>scalable_allocator</b> (const <a class="el" href="a00337.html">scalable_allocator</a>< U > &) throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Current execution state. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad774f55eaec008ae02b236423209ced"></a><!-- doxytag: member="tbb::task::ref_count" ref="ad774f55eaec008ae02b236423209ced" args="() const " -->
-int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#ad774f55eaec008ae02b236423209ced">ref_count</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78fa13a188b542ea724d45a9dbf5a071"></a><!-- doxytag: member="tbb::scalable_allocator::address" ref="78fa13a188b542ea724d45a9dbf5a071" args="(reference x) const " -->
+pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The internal reference count. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c26718b3b247cd13deb1a741902e7105"></a><!-- doxytag: member="tbb::task::is_owned_by_current_thread" ref="c26718b3b247cd13deb1a741902e7105" args="() const " -->
-bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14be4ad8eb478c87e240e605221ab455"></a><!-- doxytag: member="tbb::scalable_allocator::address" ref="14be4ad8eb478c87e240e605221ab455" args="(const_reference x) const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Obsolete, and only retained for the sake of backward compatibility. Always returns true. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dca19d7a45487a7d67a0db517e2b57c9"></a><!-- doxytag: member="tbb::task::set_affinity" ref="dca19d7a45487a7d67a0db517e2b57c9" args="(affinity_id id)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="726b1586d05d44665a36e1c7b2699bfd"></a><!-- doxytag: member="tbb::scalable_allocator::allocate" ref="726b1586d05d44665a36e1c7b2699bfd" args="(size_type n, const void *=0)" -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a> (size_type n, const void *=0)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set affinity for this task. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3a920a56b0bcf2801518fb45b2c9d2be"></a><!-- doxytag: member="tbb::task::affinity" ref="3a920a56b0bcf2801518fb45b2c9d2be" args="() const " -->
-<a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f806a238c18cbcfb531e1e0a0d2ec59d"></a><!-- doxytag: member="tbb::scalable_allocator::deallocate" ref="f806a238c18cbcfb531e1e0a0d2ec59d" args="(pointer p, size_type)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a> (pointer p, size_type)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Current affinity of this task. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="880e766f1d913988c21973dbdd874fd5"></a><!-- doxytag: member="tbb::scalable_allocator::max_size" ref="880e766f1d913988c21973dbdd874fd5" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#880e766f1d913988c21973dbdd874fd5">max_size</a> () const throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Invoked by scheduler to notify task that it ran on unexpected thread. <a href="#713c338c8eeaebdc5a6b10a69c039b06"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a> (<a class="el" href="a00339.html">task_group_context</a> &ctx)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d441b2d4910ae754b62278d0273f7665"></a><!-- doxytag: member="tbb::scalable_allocator::construct" ref="d441b2d4910ae754b62278d0273f7665" args="(U *p, Args &&...args)" -->
+template<typename U, typename... Args> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>construct</b> (U *p, Args &&...args)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Moves this task from its current group into another one. <a href="#62247be9a637a814c8e8f4bcfb3a1908"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Initiates cancellation of all tasks in this cancellation group and its subordinate groups. <a href="#0f3fb4aac549ab642022450a4bd13326"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="025f18118c057c4c8db87ff2ce8df975"></a><!-- doxytag: member="tbb::task::is_cancelled" ref="025f18118c057c4c8db87ff2ce8df975" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if the context has received cancellation request. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9ac8d1542d67d9d80121ff986801ac26"></a><!-- doxytag: member="tbb::task::set_group_priority" ref="9ac8d1542d67d9d80121ff986801ac26" args="(priority_t p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a> (priority_t p)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Changes priority of the task group this task belongs to. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e1d969a1ccab6796e3b8b2c1a5be33d2"></a><!-- doxytag: member="tbb::task::group_priority" ref="e1d969a1ccab6796e3b8b2c1a5be33d2" args="() const " -->
-priority_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Retrieves current priority of the task group this task belongs to. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23acb0da0afd690da797f9f882027d34"></a><!-- doxytag: member="tbb::task::allocate_root" ref="23acb0da0afd690da797f9f882027d34" args="()" -->
-static internal::allocate_root_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#23acb0da0afd690da797f9f882027d34">allocate_root</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a root task. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ccc518caf31075a3e073996d2d240a4"></a><!-- doxytag: member="tbb::task::allocate_root" ref="8ccc518caf31075a3e073996d2d240a4" args="(task_group_context &ctx)" -->
-static internal::allocate_root_with_context_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00339.html">task_group_context</a> &ctx)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a root task associated with user supplied context. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce8ce689c26a4ddf343829bc3c73290a"></a><!-- doxytag: member="tbb::task::spawn_root_and_wait" ref="ce8ce689c26a4ddf343829bc3c73290a" args="(task &root)" -->
-static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00337.html">task</a> &root)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn task allocated by allocate_root, wait for it to complete, and deallocate it. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00341.html">task_list</a> &root_list)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn root tasks on list and wait for all of them to finish. <a href="#c33c7edbaec67aa8a56f48986a9dc69f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a> (<a class="el" href="a00337.html">task</a> &t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue task for starvation-resistant execution. <a href="#8365d063c0cc9d7bd616bca47256b93c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe6bf6aaf84e664134fabb6c4f409ea9"></a><!-- doxytag: member="tbb::task::enqueue" ref="fe6bf6aaf84e664134fabb6c4f409ea9" args="(task &t, priority_t p)" -->
-static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a> (<a class="el" href="a00337.html">task</a> &t, priority_t p)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue task for starvation-resistant execution on the specified priority level. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd43e8d6249738efafd12d6a4c72c5e3"></a><!-- doxytag: member="tbb::task::self" ref="bd43e8d6249738efafd12d6a4c72c5e3" args="()" -->
-static <a class="el" href="a00337.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The innermost task being executed or destroyed by the current thread at the moment. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bce8ec6e44706e70128f5cf91b76e67"></a><!-- doxytag: member="tbb::task::task" ref="2bce8ec6e44706e70128f5cf91b76e67" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html#2bce8ec6e44706e70128f5cf91b76e67">task</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81d0122aee4ddae419a743ee50d7038e"></a><!-- doxytag: member="tbb::task::interface5::internal::task_base" ref="81d0122aee4ddae419a743ee50d7038e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface5::internal::task_base</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5eabadbca46f93ce6fb08290e85a0a65"></a><!-- doxytag: member="tbb::task::task_list" ref="5eabadbca46f93ce6fb08290e85a0a65" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>task_list</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e296810002652d771f692e20ca87e898"></a><!-- doxytag: member="tbb::task::internal::scheduler" ref="e296810002652d771f692e20ca87e898" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::scheduler</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="387b945c106854e1ed525f0668092930"></a><!-- doxytag: member="tbb::task::internal::allocate_root_proxy" ref="387b945c106854e1ed525f0668092930" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_root_proxy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ecedb9436fb30df30cb3a52c64bb97e5"></a><!-- doxytag: member="tbb::task::internal::allocate_root_with_context_proxy" ref="ecedb9436fb30df30cb3a52c64bb97e5" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_root_with_context_proxy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9987b3b1174772e5e853bd94b9f15350"></a><!-- doxytag: member="tbb::task::internal::allocate_continuation_proxy" ref="9987b3b1174772e5e853bd94b9f15350" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_continuation_proxy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f9e255654086b52fe107e4d8bbc8b7d"></a><!-- doxytag: member="tbb::task::internal::allocate_child_proxy" ref="1f9e255654086b52fe107e4d8bbc8b7d" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_child_proxy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e99ce0045ea3c55d239f38ea026b8a7"></a><!-- doxytag: member="tbb::task::internal::allocate_additional_child_of_proxy" ref="0e99ce0045ea3c55d239f38ea026b8a7" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_additional_child_of_proxy</b></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Base class for user-defined tasks.
-<p>
-<hr><h2>Member Typedef Documentation</h2>
-<a class="anchor" name="d61bb32389d3857bf7511d69beaafb76"></a><!-- doxytag: member="tbb::task::affinity_id" ref="d61bb32389d3857bf7511d69beaafb76" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">typedef internal::affinity_id <a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">tbb::task::affinity_id</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-An id as used for specifying affinity.
-<p>
-Guaranteed to be integral type. Value of 0 means no affinity.
-</div>
-</div><p>
-<hr><h2>Member Enumeration Documentation</h2>
-<a class="anchor" name="4a3c415562d17905390ea5b49d12293e"></a><!-- doxytag: member="tbb::task::state_type" ref="4a3c415562d17905390ea5b49d12293e" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">enum <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Enumeration of task states that the scheduler considers.
-<p>
-<dl compact><dt><b>Enumerator: </b></dt><dd>
-<table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><!-- doxytag: member="executing" ref="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9" args="" -->executing</em> </td><td>
-task is running, and will be destroyed after method <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute()</a> completes. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513"></a><!-- doxytag: member="reexecute" ref="4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513" args="" -->reexecute</em> </td><td>
-task to be rescheduled. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a"></a><!-- doxytag: member="ready" ref="4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a" args="" -->ready</em> </td><td>
-task is in ready pool, or is going to be put there, or was just taken off. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c"></a><!-- doxytag: member="allocated" ref="4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c" args="" -->allocated</em> </td><td>
-task object is freshly allocated or recycled. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735"></a><!-- doxytag: member="freed" ref="4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735" args="" -->freed</em> </td><td>
-task object is on free list, or is going to be put there, or was just taken off. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d"></a><!-- doxytag: member="recycle" ref="4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d" args="" -->recycle</em> </td><td>
-task to be recycled as continuation </td></tr>
-</table>
-</dl>
-
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="1434c79a5138993269d034008bff7329"></a><!-- doxytag: member="tbb::task::allocate_continuation" ref="1434c79a5138993269d034008bff7329" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">internal::allocate_continuation_proxy& tbb::task::allocate_continuation </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns proxy for overloaded new that allocates a continuation task of *this.
-<p>
-The continuation's parent becomes the parent of *this.
-</div>
-</div><p>
-<a class="anchor" name="0f3fb4aac549ab642022450a4bd13326"></a><!-- doxytag: member="tbb::task::cancel_group_execution" ref="0f3fb4aac549ab642022450a4bd13326" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::task::cancel_group_execution </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
-<p>
-<dl compact><dt><b>Returns:</b></dt><dd>false if cancellation has already been requested, true otherwise. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="62247be9a637a814c8e8f4bcfb3a1908"></a><!-- doxytag: member="tbb::task::change_group" ref="62247be9a637a814c8e8f4bcfb3a1908" args="(task_group_context &ctx)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::task::change_group </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00339.html">task_group_context</a> & </td>
- <td class="paramname"> <em>ctx</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Moves this task from its current group into another one.
-<p>
-Argument ctx specifies the new group.<p>
-The primary purpose of this method is to associate unique task group context with a task allocated for subsequent enqueuing. In contrast to spawned tasks enqueued ones normally outlive the scope where they were created. This makes traditional usage model where task group context are allocated locally on the stack inapplicable. Dynamic allocation of context objects is performance inefficient. Method <a class="el" href="a00337.html#62247be9a637a814c8e8f4bcfb3a1908">change_group()</a> allow [...]
-</div>
-</div><p>
-<a class="anchor" name="d8c36a93f3972590fbb65ff1cef3173b"></a><!-- doxytag: member="tbb::task::context" ref="d8c36a93f3972590fbb65ff1cef3173b" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00339.html">task_group_context</a>* tbb::task::context </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-This method is deprecated and will be removed in the future.
-<p>
-Use method <a class="el" href="a00337.html#5987123486afca36ddebb9e2a8b7779a">group()</a> instead.
-</div>
-</div><p>
-<a class="anchor" name="ef4680f5c148020c5e7e43ddef44cd5d"></a><!-- doxytag: member="tbb::task::decrement_ref_count" ref="ef4680f5c148020c5e7e43ddef44cd5d" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int tbb::task::decrement_ref_count </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Atomically decrement reference count and returns its new value.
-<p>
-Has release semantics.
-</div>
-</div><p>
-<a class="anchor" name="dfaacf92685e5f86393bf657b2853bf8"></a><!-- doxytag: member="tbb::task::destroy" ref="dfaacf92685e5f86393bf657b2853bf8" args="(task &t)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::task::destroy </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00337.html">task</a> & </td>
- <td class="paramname"> <em>t</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroy a task.
-<p>
-Usually, calling this method is unnecessary, because a task is implicitly deleted after its <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute()</a> method runs. However, sometimes a task needs to be explicitly deallocated, such as when a root task is used as the parent in spawn_and_wait_for_all.
-</div>
-</div><p>
-<a class="anchor" name="8365d063c0cc9d7bd616bca47256b93c"></a><!-- doxytag: member="tbb::task::enqueue" ref="8365d063c0cc9d7bd616bca47256b93c" args="(task &t)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static void tbb::task::enqueue </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00337.html">task</a> & </td>
- <td class="paramname"> <em>t</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Enqueue task for starvation-resistant execution.
-<p>
-The task will be enqueued on the normal priority level disregarding the priority of its task group.<p>
-The rationale of such semantics is that priority of an enqueued task is statically fixed at the moment of its enqueuing, while task group priority is dynamic. Thus automatic priority inheritance would be generally a subject to the race, which may result in unexpected behavior.<p>
-Use <a class="el" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">enqueue()</a> overload with explicit priority value and <a class="el" href="a00337.html#e1d969a1ccab6796e3b8b2c1a5be33d2">task::group_priority()</a> method to implement such priority inheritance when it is really necessary.
-</div>
-</div><p>
-<a class="anchor" name="f5fb43c7ad0de5a4b95703cebc39e345"></a><!-- doxytag: member="tbb::task::increment_ref_count" ref="f5fb43c7ad0de5a4b95703cebc39e345" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::task::increment_ref_count </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Atomically increment reference count and returns its old value.
-<p>
-Has acquire semantics
-</div>
-</div><p>
-<a class="anchor" name="713c338c8eeaebdc5a6b10a69c039b06"></a><!-- doxytag: member="tbb::task::note_affinity" ref="713c338c8eeaebdc5a6b10a69c039b06" args="(affinity_id id)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual void __TBB_EXPORTED_METHOD tbb::task::note_affinity </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td>
- <td class="paramname"> <em>id</em> </td>
- <td> ) </td>
- <td width="100%"><code> [virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Invoked by scheduler to notify task that it ran on unexpected thread.
-<p>
-Invoked before method <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute()</a> runs, if task is stolen, or task has affinity but will be executed on another thread.<p>
-The default action does nothing.
-</div>
-</div><p>
-<a class="anchor" name="a67a79e18f62b43a623a00cfbd76db4c"></a><!-- doxytag: member="tbb::task::recycle_as_continuation" ref="a67a79e18f62b43a623a00cfbd76db4c" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::task::recycle_as_continuation </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Change this to be a continuation of its former self.
-<p>
-The caller must guarantee that the task's refcount does not become zero until after the method <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute()</a> return a pointer to a child of the task. If the guarantee cannot be made, use method recycle_as_safe_continuation instead.<p>
-Because of the hazard, this method may be deprecated in the future.
-</div>
-</div><p>
-<a class="anchor" name="3b290d14109704e2b69dc1ac980a7a76"></a><!-- doxytag: member="tbb::task::recycle_as_safe_continuation" ref="3b290d14109704e2b69dc1ac980a7a76" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::task::recycle_as_safe_continuation </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Recommended to use, safe variant of recycle_as_continuation.
-<p>
-For safety, it requires additional increment of ref_count. With no descendants and ref_count of 1, it has the semantics of recycle_to_reexecute.
-</div>
-</div><p>
-<a class="anchor" name="4f1be9bbcdb487830dbe298b68d85144"></a><!-- doxytag: member="tbb::task::recycle_to_reexecute" ref="4f1be9bbcdb487830dbe298b68d85144" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::task::recycle_to_reexecute </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Schedule this for reexecution after current <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.
-<p>
-Made obsolete by recycle_as_safe_continuation; may become deprecated.
-</div>
-</div><p>
-<a class="anchor" name="c33c7edbaec67aa8a56f48986a9dc69f"></a><!-- doxytag: member="tbb::task::spawn_root_and_wait" ref="c33c7edbaec67aa8a56f48986a9dc69f" args="(task_list &root_list)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::task::spawn_root_and_wait </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00341.html">task_list</a> & </td>
- <td class="paramname"> <em>root_list</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Spawn root tasks on list and wait for all of them to finish.
-<p>
-If there are more tasks than worker threads, the tasks are spawned in order of front to back.
-</div>
-</div><p>
-<a class="anchor" name="53d2615ad9c38859b4c8080936600283"></a><!-- doxytag: member="tbb::task::wait_for_all" ref="53d2615ad9c38859b4c8080936600283" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::task::wait_for_all </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::scalable_allocator< T ></h3>
+Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<p>
-Wait for reference count to become one, and set reference count to zero.
+The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
-Works on tasks while waiting.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00613.html">task.h</a></ul>
+<li><a class="el" href="a00405.html">scalable_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00338.html b/doc/html/a00338.html
index 5c918ce..e2bc22e 100644
--- a/doc/html/a00338.html
+++ b/doc/html/a00338.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::internal::task_base Class Reference</title>
+<title>tbb::scalable_allocator< void > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,25 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>interface5</b>::<b>internal</b>::<a class="el" href="a00338.html">task_base</a></div>
-<h1>tbb::interface5::internal::task_base Class Reference</h1><!-- doxytag: class="tbb::interface5::internal::task_base" -->Base class for methods that became static in TBB 3.0.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00338.html">scalable_allocator< void ></a></div>
+<h1>tbb::scalable_allocator< void > Class Template Reference<br>
+<small>
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::scalable_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00613.html">task.h</a>></code>
+<code>#include <scalable_allocator.h></code>
<p>
-<a href="a00130.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00125.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2046816029c2c7856f7684aed2af9cff"></a><!-- doxytag: member="tbb::scalable_allocator< void >::pointer" ref="2046816029c2c7856f7684aed2af9cff" args="" -->
+typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="591c568d23f8aadf6ea8d1dc939c4e75"></a><!-- doxytag: member="tbb::scalable_allocator< void >::const_pointer" ref="591c568d23f8aadf6ea8d1dc939c4e75" args="" -->
+typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="64dbab666af0740c30b77edac9f157ce"></a><!-- doxytag: member="tbb::scalable_allocator< void >::value_type" ref="64dbab666af0740c30b77edac9f157ce" args="" -->
+typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Base class for methods that became static in TBB 3.0.
-<p>
-TBB's evolution caused the "this" argument for several methods to become obsolete. However, for backwards binary compatibility, the new methods need distinct names, otherwise the One Definition Rule would be broken. Hence the new methods are defined in this private base class, and then exposed in class task via using declarations.
+<h3>template<><br>
+ class tbb::scalable_allocator< void ></h3>
+
+Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00613.html">task.h</a></ul>
+<li><a class="el" href="a00405.html">scalable_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00339.html b/doc/html/a00339.html
index d7a08fe..8462356 100644
--- a/doc/html/a00339.html
+++ b/doc/html/a00339.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::task_group_context Struct Reference</title>
+<title>tbb::flow::interface6::sender< T > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,20 +21,70 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00339.html">task_group_context</a></div>
-<h1>tbb::task_group_context Struct Reference</h1><!-- doxytag: class="tbb::task_group_context" --><code>#include <<a class="el" href="a00550.html">parallel_invoke.h</a>></code>
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00339.html">sender</a></div>
+<h1>tbb::flow::interface6::sender< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::sender" -->Pure virtual template class that defines a sender of messages of type T.
+<a href="#_details">More...</a>
<p>
-<table border="0" cellpadding="0" cellspacing="0">
+<code>#include <flow_graph.h></code>
+<p>
+<p>Inheritance diagram for tbb::flow::interface6::sender< T >:
+<p><center><img src="a00339.png" usemap="#tbb::flow::interface6::sender< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::sender< T >_map">
+<area href="a00274.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="0,56,352,80">
+<area href="a00275.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
+<area href="a00304.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="724,56,1076,80">
+<area href="a00324.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
+<area href="a00325.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
+<area href="a00340.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
+</map>
+<a href="a00055.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="127af99916cc085cd9dbc09c53299928"></a><!-- doxytag: member="tbb::flow::interface6::sender::output_type" ref="127af99916cc085cd9dbc09c53299928" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html#127af99916cc085cd9dbc09c53299928">output_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d690e8a54e358968f0ee4fdf9ee73068"></a><!-- doxytag: member="tbb::flow::interface6::sender::successor_type" ref="d690e8a54e358968f0ee4fdf9ee73068" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="68b8941ad77b9303cf3bcb8cf1f2d28a"></a><!-- doxytag: member="tbb::flow::interface6::sender::register_successor" ref="68b8941ad77b9303cf3bcb8cf1f2d28a" args="(successor_type &r)=0" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a> (<a class="el" href="a00333.html">successor_type</a> &r)=0</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a new successor to this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="82f363bfb1738bb8789e167590b10ef9"></a><!-- doxytag: member="tbb::flow::interface6::sender::remove_successor" ref="82f363bfb1738bb8789e167590b10ef9" args="(successor_type &r)=0" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a> (<a class="el" href="a00333.html">successor_type</a> &r)=0</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="922fb56b0aad090b90a98b7d56b76a59"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_get" ref="922fb56b0aad090b90a98b7d56b76a59" args="(T &)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a> (T &)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02c05b472271db1b68a48ea2618fa72f"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_reserve" ref="02c05b472271db1b68a48ea2618fa72f" args="(T &)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a> (T &)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item in the sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27036b06d6a91e97007e14f400529199"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_release" ref="27036b06d6a91e97007e14f400529199" args="()" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html#27036b06d6a91e97007e14f400529199">try_release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the reserved item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b840f50da117a0d6848707c1857ea2e"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_consume" ref="7b840f50da117a0d6848707c1857ea2e" args="()" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes the reserved item. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Dummy to avoid cluttering the bulk of the header with enormous amount of ifdefs.
+<h3>template<typename T><br>
+ class tbb::flow::interface6::sender< T ></h3>
+
+Pure virtual template class that defines a sender of messages of type T.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00550.html">parallel_invoke.h</a></ul>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00327.png b/doc/html/a00339.png
similarity index 100%
rename from doc/html/a00327.png
rename to doc/html/a00339.png
diff --git a/doc/html/a00328.html b/doc/html/a00340.html
similarity index 82%
copy from doc/html/a00328.html
copy to doc/html/a00340.html
index b48bfa4..8885cfb 100644
--- a/doc/html/a00328.html
+++ b/doc/html/a00340.html
@@ -21,61 +21,61 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00328.html">sequencer_node</a></div>
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00340.html">sequencer_node</a></div>
<h1>tbb::flow::interface6::sequencer_node< T, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::sequencer_node" --><!-- doxytag: inherits="tbb::flow::interface6::queue_node" -->Forwards messages in sequence order.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00511.html">flow_graph.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
<p>Inheritance diagram for tbb::flow::interface6::sequencer_node< T, A >:
-<p><center><img src="a00328.png" usemap="#tbb::flow::interface6::sequencer_node< T, A >_map" border="0" alt=""></center>
+<p><center><img src="a00340.png" usemap="#tbb::flow::interface6::sequencer_node< T, A >_map" border="0" alt=""></center>
<map name="tbb::flow::interface6::sequencer_node< T, A >_map">
-<area href="a00313.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="280,112,550,136">
-<area href="a00263.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="280,56,550,80">
-<area href="a00289.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,270,24">
-<area href="a00321.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="280,0,550,24">
-<area href="a00327.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="560,0,830,24">
+<area href="a00325.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="280,112,550,136">
+<area href="a00275.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="280,56,550,80">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,270,24">
+<area href="a00333.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="280,0,550,24">
+<area href="a00339.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="560,0,830,24">
</map>
-<a href="a00075.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00077.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af629f26832ff4e476e240637a78bc0c"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::input_type" ref="af629f26832ff4e476e240637a78bc0c" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#af629f26832ff4e476e240637a78bc0c">input_type</a></td></tr>
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00340.html#af629f26832ff4e476e240637a78bc0c">input_type</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ca026eaef70e35791c407323199031a7"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::output_type" ref="ca026eaef70e35791c407323199031a7" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#ca026eaef70e35791c407323199031a7">output_type</a></td></tr>
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00340.html#ca026eaef70e35791c407323199031a7">output_type</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8127e36811832563fe1e9bc3ba391f79"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::predecessor_type" ref="8127e36811832563fe1e9bc3ba391f79" args="" -->
-typedef <a class="el" href="a00327.html">sender</a>< <a class="el" href="a00328.html#af629f26832ff4e476e240637a78bc0c">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#8127e36811832563fe1e9bc3ba391f79">predecessor_type</a></td></tr>
+typedef <a class="el" href="a00339.html">sender</a>< <a class="el" href="a00340.html#af629f26832ff4e476e240637a78bc0c">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00340.html#8127e36811832563fe1e9bc3ba391f79">predecessor_type</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="795f3ee75f133b9d3b159172fc4a197f"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::successor_type" ref="795f3ee75f133b9d3b159172fc4a197f" args="" -->
-typedef <a class="el" href="a00321.html">receiver</a>< <a class="el" href="a00328.html#ca026eaef70e35791c407323199031a7">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#795f3ee75f133b9d3b159172fc4a197f">successor_type</a></td></tr>
+typedef <a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00340.html#ca026eaef70e35791c407323199031a7">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00340.html#795f3ee75f133b9d3b159172fc4a197f">successor_type</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7e71cbdf78f989091bc162b89bee7e66"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::sequencer_node" ref="7e71cbdf78f989091bc162b89bee7e66" args="(graph &g, const Sequencer &s)" -->
template<typename Sequencer> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00328.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a> (<a class="el" href="a00288.html">graph</a> &g, const Sequencer &s)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00340.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a> (<a class="el" href="a00300.html">graph</a> &g, const Sequencer &s)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b38e7a070552960384bcc1d91af13a5c"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::sequencer_node" ref="b38e7a070552960384bcc1d91af13a5c" args="(const sequencer_node &src)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#b38e7a070552960384bcc1d91af13a5c">sequencer_node</a> (const <a class="el" href="a00328.html">sequencer_node</a> &src)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00340.html#b38e7a070552960384bcc1d91af13a5c">sequencer_node</a> (const <a class="el" href="a00340.html">sequencer_node</a> &src)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93d3d8f6a72b3e1387047282116ed6ee"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::~sequencer_node" ref="93d3d8f6a72b3e1387047282116ed6ee" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00340.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6a0608d8fbfa05edde1e1da559f9eb40"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::size_type" ref="6a0608d8fbfa05edde1e1da559f9eb40" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
+typedef <a class="el" href="a00275.html">buffer_node</a>< T, A <br>
>::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d50b89267bddf58afeb3e784aba0f0d6"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::sequencer_operation" ref="d50b89267bddf58afeb3e784aba0f0d6" args="" -->
-typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
+typedef <a class="el" href="a00275.html">buffer_node</a>< T, A <br>
>::buffer_operation </td><td class="memItemRight" valign="bottom"><b>sequencer_operation</b></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1372a379c01bc269b36bf3128560879e1cdf6bcff9743d2be54bc70c4300cd28"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::WAIT" ref="1372a379c01bc269b36bf3128560879e1cdf6bcff9743d2be54bc70c4300cd28" args="" -->
@@ -100,10 +100,10 @@ typedef <a class="el" href="a00263.html">buffer_node</a>< T, A <br>
Forwards messages in sequence order.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00511.html">flow_graph.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00328.png b/doc/html/a00340.png
similarity index 100%
rename from doc/html/a00328.png
rename to doc/html/a00340.png
diff --git a/doc/html/a00341.html b/doc/html/a00341.html
index eb061d6..9bd004c 100644
--- a/doc/html/a00341.html
+++ b/doc/html/a00341.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::task_list Class Reference</title>
+<title>tbb::simple_partitioner Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,60 +21,44 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00341.html">task_list</a></div>
-<h1>tbb::task_list Class Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00341.html">simple_partitioner</a></div>
+<h1>tbb::simple_partitioner Class Reference<br>
<small>
-[<a class="el" href="a00431.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_list" -->A list of children.
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::simple_partitioner" -->A simple partitioner.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00613.html">task.h</a>></code>
+<code>#include <partitioner.h></code>
<p>
-<a href="a00135.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00103.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="416341c2047eaef50417b41eaf7e9de6"></a><!-- doxytag: member="tbb::task_list::task_list" ref="416341c2047eaef50417b41eaf7e9de6" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html#416341c2047eaef50417b41eaf7e9de6">task_list</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty list. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6d438f1499a02db1e59c24ab6043e5ba"></a><!-- doxytag: member="tbb::task_list::~task_list" ref="6d438f1499a02db1e59c24ab6043e5ba" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys the list, but does not destroy the task objects. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3ac31e092814b90929f81bb30441959"></a><!-- doxytag: member="tbb::task_list::empty" ref="f3ac31e092814b90929f81bb30441959" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html#f3ac31e092814b90929f81bb30441959">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if list if empty; false otherwise. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cd34756bc4763dafb8c84838a0124ff"></a><!-- doxytag: member="tbb::task_list::push_back" ref="4cd34756bc4763dafb8c84838a0124ff" args="(task &task)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00337.html">task</a> &<a class="el" href="a00337.html">task</a>)</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f730f70d21df405adaebfc2018f59cd"></a><!-- doxytag: member="tbb::simple_partitioner::serial::interface6::start_for" ref="5f730f70d21df405adaebfc2018f59cd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>serial::interface6::start_for</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Push task onto back of list. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fe85df5ed524418389d34051750347d"></a><!-- doxytag: member="tbb::task_list::pop_front" ref="5fe85df5ed524418389d34051750347d" args="()" -->
-<a class="el" href="a00337.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html#5fe85df5ed524418389d34051750347d">pop_front</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a4cd0ffed4fad0d9af2c5efdaf586a8"></a><!-- doxytag: member="tbb::simple_partitioner::interface6::internal::start_for" ref="8a4cd0ffed4fad0d9af2c5efdaf586a8" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_for</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pop the front task from the list. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fce446ee13e025969945328f3ff59b95"></a><!-- doxytag: member="tbb::task_list::clear" ref="fce446ee13e025969945328f3ff59b95" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html#fce446ee13e025969945328f3ff59b95">clear</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86f0750233dd6c83b65fb684338fd09f"></a><!-- doxytag: member="tbb::simple_partitioner::interface6::internal::start_reduce" ref="86f0750233dd6c83b65fb684338fd09f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_reduce</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the list. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e656073628561c8fd68f6134d527e2de"></a><!-- doxytag: member="tbb::task_list::task" ref="e656073628561c8fd68f6134d527e2de" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>task</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::simple_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81d0122aee4ddae419a743ee50d7038e"></a><!-- doxytag: member="tbb::task_list::interface5::internal::task_base" ref="81d0122aee4ddae419a743ee50d7038e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface5::internal::task_base</b></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>partition_type</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A list of children.
+A simple partitioner.
<p>
-Used for method task::spawn_children
+Divides the range until the range is not divisible.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00613.html">task.h</a></ul>
+<li>partitioner.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00342.html b/doc/html/a00342.html
index d4ca23f..a1b7a93 100644
--- a/doc/html/a00342.html
+++ b/doc/html/a00342.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::task_scheduler_init Class Reference</title>
+<title>tbb::flow::interface6::source_node< Output > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,145 +21,121 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00342.html">task_scheduler_init</a></div>
-<h1>tbb::task_scheduler_init Class Reference<br>
-<small>
-[<a class="el" href="a00431.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_scheduler_init" -->Class delimiting the scope of task scheduler activity.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00342.html">source_node</a></div>
+<h1>tbb::flow::interface6::source_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::source_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::sender< Output >" -->An executable node that acts as a source, i.e. it has no predecessors.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00630.html">task_scheduler_init.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<a href="a00142.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::source_node< Output >:
+<p><center><img src="a00342.png" usemap="#tbb::flow::interface6::source_node< Output >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::source_node< Output >_map">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,262,24">
+<area href="a00339.html" alt="tbb::flow::interface6::sender< Output >" shape="rect" coords="272,0,534,24">
+</map>
+<a href="a00063.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="407533487cc3f6032c1072cba19c609c"></a><!-- doxytag: member="tbb::flow::interface6::source_node::output_type" ref="407533487cc3f6032c1072cba19c609c" args="" -->
+typedef Output </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#407533487cc3f6032c1072cba19c609c">output_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The type of the output message, which is complete. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd7b8fe78f0bec9d6b70cbf1018a69fe"></a><!-- doxytag: member="tbb::flow::interface6::source_node::successor_type" ref="dd7b8fe78f0bec9d6b70cbf1018a69fe" args="" -->
+typedef <a class="el" href="a00333.html">receiver</a>< Output > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">successor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The type of successors of this node. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="503c3b395c629296bf5cccd96d6388c1"></a><!-- doxytag: member="tbb::flow::interface6::source_node::source_node" ref="503c3b395c629296bf5cccd96d6388c1" args="(graph &g, Body body, bool is_active=true)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00342.html#503c3b395c629296bf5cccd96d6388c1">source_node</a> (<a class="el" href="a00300.html">graph</a> &g, Body body, bool is_active=true)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for a node with a successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="adaac111fbcace95804219a5f2929304"></a><!-- doxytag: member="tbb::flow::interface6::source_node::source_node" ref="adaac111fbcace95804219a5f2929304" args="(const source_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#adaac111fbcace95804219a5f2929304">source_node</a> (const <a class="el" href="a00342.html">source_node</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61700b0865fc17188b0abe26bbde65b6"></a><!-- doxytag: member="tbb::flow::interface6::source_node::~source_node" ref="61700b0865fc17188b0abe26bbde65b6" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="22960d499df9f1569a9d8a544e35afe3"></a><!-- doxytag: member="tbb::flow::interface6::source_node::register_successor" ref="22960d499df9f1569a9d8a544e35afe3" args="(receiver< output_type > &r)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a> (<a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00342.html#407533487cc3f6032c1072cba19c609c">output_type</a> > &r)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Ensure that scheduler exists for this thread. <a href="#d476053cc712e572554823492a5229ce"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a> (int number_of_threads, stack_size_type thread_stack_size)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a new successor to this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="222484bf295f39df36415a29e508e5c9"></a><!-- doxytag: member="tbb::flow::interface6::source_node::remove_successor" ref="222484bf295f39df36415a29e508e5c9" args="(receiver< output_type > &r)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#222484bf295f39df36415a29e508e5c9">remove_successor</a> (<a class="el" href="a00333.html">receiver</a>< <a class="el" href="a00342.html#407533487cc3f6032c1072cba19c609c">output_type</a> > &r)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The overloaded method with stack size parameter. <a href="#d5ed214a8bb53b0466ed91ff4734b9a3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f73257e04cb7fb9bd5be2b635d9016f1"></a><!-- doxytag: member="tbb::task_scheduler_init::terminate" ref="f73257e04cb7fb9bd5be2b635d9016f1" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41073ad4d3510ed5a8b6bda9c0f58636"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_get" ref="41073ad4d3510ed5a8b6bda9c0f58636" args="(output_type &v)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a> (<a class="el" href="a00342.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Inverse of method initialize. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="421600bf9bf9338bcf937063f2ff0e90"></a><!-- doxytag: member="tbb::task_scheduler_init::task_scheduler_init" ref="421600bf9bf9338bcf937063f2ff0e90" args="(int number_of_threads=automatic, stack_size_type thread_stack_size=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad459713ff3c1c9ad0f4826daa141f65"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_reserve" ref="ad459713ff3c1c9ad0f4826daa141f65" args="(output_type &v)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a> (<a class="el" href="a00342.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Shorthand for default constructor followed by call to initialize(number_of_threads). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4da6c86292d80c703a66c1f6f5299488"></a><!-- doxytag: member="tbb::task_scheduler_init::~task_scheduler_init" ref="4da6c86292d80c703a66c1f6f5299488" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#494678baf9096835268736b800824460">try_release</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy scheduler for this thread if thread has no other live task_scheduler_inits. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="12752282977029f23416642bc03e8b74"></a><!-- doxytag: member="tbb::task_scheduler_init::is_active" ref="12752282977029f23416642bc03e8b74" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#12752282977029f23416642bc03e8b74">is_active</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item. <a href="#494678baf9096835268736b800824460"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7fcc29e2894b29138be3c1edce9bc9"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_consume" ref="2c7fcc29e2894b29138be3c1edce9bc9" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if scheduler is active (initialized); false otherwise. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes a reserved item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b647e4a93d08ccdd8d323279e4eaaa6"></a><!-- doxytag: member="tbb::flow::interface6::source_node::activate" ref="4b647e4a93d08ccdd8d323279e4eaaa6" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the number of threads TBB scheduler would create if initialized by default. <a href="#ba00714c33a41a3c2216f48613971cab"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f5988e2b0fbb2d533fcbb7f2583743f"></a><!-- doxytag: member="tbb::task_scheduler_init::automatic" ref="8f5988e2b0fbb2d533fcbb7f2583743f" args="" -->
-static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Activates a node that was created in the inactive state. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a662424d33788bc5059ba4caee5c9d2f"></a><!-- doxytag: member="tbb::flow::interface6::source_node::copy_function_object" ref="a662424d33788bc5059ba4caee5c9d2f" args="()" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Body </td><td class="memTemplItemRight" valign="bottom"><b>copy_function_object</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Typedef for number of threads that is automatic. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e6c860f1e559026ff3ef4599c0d6c514"></a><!-- doxytag: member="tbb::task_scheduler_init::deferred" ref="e6c860f1e559026ff3ef4599c0d6c514" args="" -->
-static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d751cdda02bdaa1dc90c4d9609c05df2"></a><!-- doxytag: member="tbb::flow::interface6::source_node::reset" ref="d751cdda02bdaa1dc90c4d9609c05df2" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#d751cdda02bdaa1dc90c4d9609c05df2">reset</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">resets the node to its initial state <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd00136edc600bf5b4efe816dd9412d4"></a><!-- doxytag: member="tbb::flow::interface6::source_node::internal::source_task_bypass< source_node< output_type > >" ref="bd00136edc600bf5b4efe816dd9412d4" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::source_task_bypass< source_node< output_type > ></b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00342.html#d476053cc712e572554823492a5229ce">initialize()</a> or constructor that causes initialization to be deferred. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Class delimiting the scope of task scheduler activity.
-<p>
-A thread can construct a <a class="el" href="a00342.html">task_scheduler_init</a> object and keep it alive while it uses TBB's tasking subsystem (including parallel algorithms).<p>
-This class allows to customize properties of the TBB task pool to some extent. For example it can limit concurrency level of parallel work initiated by the given thread. It also can be used to specify stack size of the TBB worker threads, though this setting is not effective if the thread pool has already been created.<p>
-If a parallel construct is used without <a class="el" href="a00342.html">task_scheduler_init</a> object previously created, the scheduler will be initialized automatically with default settings, and will persist until this thread exits. Default concurrency level is defined as described in <a class="el" href="a00342.html#d476053cc712e572554823492a5229ce">task_scheduler_init::initialize()</a>.
+<h3>template<typename Output><br>
+ class tbb::flow::interface6::source_node< Output ></h3>
+
+An executable node that acts as a source, i.e. it has no predecessors.
<p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="ba00714c33a41a3c2216f48613971cab"></a><!-- doxytag: member="tbb::task_scheduler_init::default_num_threads" ref="ba00714c33a41a3c2216f48613971cab" args="()" -->
+<a class="anchor" name="494678baf9096835268736b800824460"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_release" ref="494678baf9096835268736b800824460" args="()" -->
<div class="memitem">
<div class="memproto">
+<div class="memtemplate">
+template<typename Output> </div>
<table class="memname">
<tr>
- <td class="memname">static int __TBB_EXPORTED_FUNC tbb::task_scheduler_init::default_num_threads </td>
+ <td class="memname">bool <a class="el" href="a00342.html">tbb::flow::interface6::source_node</a>< Output >::try_release </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the number of threads TBB scheduler would create if initialized by default.
-<p>
-Result returned by this method does not depend on whether the scheduler has already been initialized.<p>
-Because tbb 2.0 does not support blocking tasks yet, you may use this method to boost the number of threads in the tbb's internal pool, if your tasks are doing I/O operations. The optimal number of additional threads depends on how much time your tasks spend in the blocked state.<p>
-Before TBB 3.0 U4 this method returned the number of logical CPU in the system. Currently on Windows, Linux and FreeBSD it returns the number of logical CPUs available to the current process in accordance with its affinity mask.<p>
-NOTE: The return value of this method never changes after its first invocation. This means that changes in the process affinity mask that took place after this method was first invoked will not affect the number of worker threads in the TBB worker threads pool.
-</div>
-</div><p>
-<a class="anchor" name="d5ed214a8bb53b0466ed91ff4734b9a3"></a><!-- doxytag: member="tbb::task_scheduler_init::initialize" ref="d5ed214a8bb53b0466ed91ff4734b9a3" args="(int number_of_threads, stack_size_type thread_stack_size)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_scheduler_init::initialize </td>
- <td>(</td>
- <td class="paramtype">int </td>
- <td class="paramname"> <em>number_of_threads</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">stack_size_type </td>
- <td class="paramname"> <em>thread_stack_size</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
+ <td width="100%"><code> [inline, virtual]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-The overloaded method with stack size parameter.
-<p>
-Overloading is necessary to preserve ABI compatibility
-</div>
-</div><p>
-<a class="anchor" name="d476053cc712e572554823492a5229ce"></a><!-- doxytag: member="tbb::task_scheduler_init::initialize" ref="d476053cc712e572554823492a5229ce" args="(int number_of_threads=automatic)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_scheduler_init::initialize </td>
- <td>(</td>
- <td class="paramtype">int </td>
- <td class="paramname"> <em>number_of_threads</em> = <code><a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+Release a reserved item.
<p>
-Ensure that scheduler exists for this thread.
+true = item has been released and so remains in sender, dest must request or reserve future items
<p>
-A value of -1 lets TBB decide on the number of threads, which is usually maximal hardware concurrency for this process, that is the number of logical CPUs on the machine (possibly limited by the processor affinity mask of this process (Windows) or of this thread (Linux, FreeBSD). It is preferable option for production code because it helps to avoid nasty surprises when several TBB based components run side-by-side or in a nested fashion inside the same process.<p>
-The number_of_threads is ignored if any other task_scheduler_inits currently exist. A thread may construct multiple task_scheduler_inits. Doing so does no harm because the underlying scheduler is reference counted.
+Reimplemented from <a class="el" href="a00339.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< Output ></a>.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00630.html">task_scheduler_init.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00330.png b/doc/html/a00342.png
similarity index 100%
rename from doc/html/a00330.png
rename to doc/html/a00342.png
diff --git a/doc/html/a00343.html b/doc/html/a00343.html
index 880528b..e779206 100644
--- a/doc/html/a00343.html
+++ b/doc/html/a00343.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tbb_allocator< T > Class Template Reference</title>
+<title>tbb::spin_mutex Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,99 +21,108 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00343.html">tbb_allocator</a></div>
-<h1>tbb::tbb_allocator< T > Class Template Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00343.html">spin_mutex</a></div>
+<h1>tbb::spin_mutex Class Reference<br>
<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::tbb_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::spin_mutex" -->A lock that occupies a single byte.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00634.html">tbb_allocator.h</a>></code>
+<code>#include <spin_mutex.h></code>
<p>
-<a href="a00144.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00127.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3cdd9619bc0a802763e7823068f83a4c"></a><!-- doxytag: member="tbb::tbb_allocator::value_type" ref="3cdd9619bc0a802763e7823068f83a4c" args="" -->
-typedef internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f979d0e74d7c6e5aeb0d26408776a9e1"></a><!-- doxytag: member="tbb::tbb_allocator::pointer" ref="f979d0e74d7c6e5aeb0d26408776a9e1" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1622504886ef265016a5821d61bf7adc"></a><!-- doxytag: member="tbb::tbb_allocator::const_pointer" ref="1622504886ef265016a5821d61bf7adc" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8e58d23c5c98fd65d4432c1e324f4c0"></a><!-- doxytag: member="tbb::tbb_allocator::reference" ref="b8e58d23c5c98fd65d4432c1e324f4c0" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="532f36f99650b1c26a2b8899383c5411"></a><!-- doxytag: member="tbb::tbb_allocator::const_reference" ref="532f36f99650b1c26a2b8899383c5411" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="639df0fb169cfcb94ba1b12429b736f4"></a><!-- doxytag: member="tbb::tbb_allocator::size_type" ref="639df0fb169cfcb94ba1b12429b736f4" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="54828b5d0b937d608f76650a5df0e39f"></a><!-- doxytag: member="tbb::tbb_allocator::difference_type" ref="54828b5d0b937d608f76650a5df0e39f" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a7f81fb2c3055aaecf058b11538544d524c717485b74aa552fb45b45562cb5"></a><!-- doxytag: member="tbb::tbb_allocator::scalable" ref="09a7f81fb2c3055aaecf058b11538544d524c717485b74aa552fb45b45562cb5" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>scalable</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf"></a><!-- doxytag: member="tbb::tbb_allocator::standard" ref="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>standard</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> { <b>scalable</b>,
-<b>standard</b>
- }</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies current allocator. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d85cd071047b52eeb207d458d54098cc"></a><!-- doxytag: member="tbb::tbb_allocator::tbb_allocator" ref="d85cd071047b52eeb207d458d54098cc" args="(const tbb_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00343.html">tbb_allocator</a> &) throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a> ()</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5c3cb04a50d15d38f4c66ca3e5d2f6af"></a><!-- doxytag: member="tbb::tbb_allocator::tbb_allocator" ref="5c3cb04a50d15d38f4c66ca3e5d2f6af" args="(const tbb_allocator< U > &)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00343.html">tbb_allocator</a>< U > &) throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired lock. <a href="#3d8fb44644fd8d41ada1fbeba7409be3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b3fa21632815f8fab2fd6c67ec0d48c"></a><!-- doxytag: member="tbb::spin_mutex::internal_construct" ref="4b3fa21632815f8fab2fd6c67ec0d48c" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="08d3822344271d0a1c2e64e8c9c16b58"></a><!-- doxytag: member="tbb::tbb_allocator::address" ref="08d3822344271d0a1c2e64e8c9c16b58" args="(reference x) const " -->
-pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f748989e19b6045e3a2d2ee73626a28"></a><!-- doxytag: member="tbb::spin_mutex::lock" ref="4f748989e19b6045e3a2d2ee73626a28" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#4f748989e19b6045e3a2d2ee73626a28">lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2b388f25858f783d995d61506de24656"></a><!-- doxytag: member="tbb::tbb_allocator::address" ref="2b388f25858f783d995d61506de24656" args="(const_reference x) const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6cb487b1bdce0b581f265a77dca6d53"></a><!-- doxytag: member="tbb::tbb_allocator::allocate" ref="f6cb487b1bdce0b581f265a77dca6d53" args="(size_type n, const void *=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a> (size_type n, const void *=0)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#8f9a58fb56a2b4c5efe1a7f7c1ae2074"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e843ee6265f57f27d228ba91e7308ef"></a><!-- doxytag: member="tbb::spin_mutex::unlock" ref="0e843ee6265f57f27d228ba91e7308ef" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdd011fdf2f9ad07006dc7c0a7ec1da2"></a><!-- doxytag: member="tbb::tbb_allocator::deallocate" ref="fdd011fdf2f9ad07006dc7c0a7ec1da2" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a> (pointer p, size_type)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7c93ca9e7ab656037a43984f24c051"></a><!-- doxytag: member="tbb::spin_mutex::is_rw_mutex" ref="5a7c93ca9e7ab656037a43984f24c051" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f059ca2c96243024f0d562ee3a87a3a5"></a><!-- doxytag: member="tbb::tbb_allocator::max_size" ref="f059ca2c96243024f0d562ee3a87a3a5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a> () const throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a967c455d0d80c9bbe030905201391b6"></a><!-- doxytag: member="tbb::spin_mutex::is_recursive_mutex" ref="a967c455d0d80c9bbe030905201391b6" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="15c431ccb5ccc5a30e5d496edad4c143"></a><!-- doxytag: member="tbb::tbb_allocator::construct" ref="15c431ccb5ccc5a30e5d496edad4c143" args="(pointer p, Args &&...args)" -->
-template<typename... Args> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00343.html#15c431ccb5ccc5a30e5d496edad4c143">construct</a> (pointer p, Args &&...args)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec12e4036073fb684b6d2d33493ed0aa"></a><!-- doxytag: member="tbb::spin_mutex::is_fair_mutex" ref="ec12e4036073fb684b6d2d33493ed0aa" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00344.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::tbb_allocator< T ></h3>
+A lock that occupies a single byte.
+<p>
+A <a class="el" href="a00343.html">spin_mutex</a> is a spin mutex that fits in a single byte. It should be used only for locking short critical sections (typically less than 20 instructions) when fairness is not an issue. If zero-initialized, the mutex is considered unheld.
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="3d8fb44644fd8d41ada1fbeba7409be3"></a><!-- doxytag: member="tbb::spin_mutex::spin_mutex" ref="3d8fb44644fd8d41ada1fbeba7409be3" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tbb::spin_mutex::spin_mutex </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Construct unacquired lock.
+<p>
+Equivalent to zero-initialization of *this.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="8f9a58fb56a2b4c5efe1a7f7c1ae2074"></a><!-- doxytag: member="tbb::spin_mutex::try_lock" ref="8f9a58fb56a2b4c5efe1a7f7c1ae2074" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool tbb::spin_mutex::try_lock </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<p>
-The class selects the best memory allocation mechanism available from scalable_malloc and standard malloc. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
+Try acquiring lock (non-blocking).
<p>
+Return true if lock acquired; false otherwise.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00634.html">tbb_allocator.h</a></ul>
+<li>spin_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00344.html b/doc/html/a00344.html
index e070fb6..7a5accf 100644
--- a/doc/html/a00344.html
+++ b/doc/html/a00344.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tbb_allocator< void > Class Template Reference</title>
+<title>tbb::spin_mutex::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,74 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00344.html">tbb_allocator< void ></a></div>
-<h1>tbb::tbb_allocator< void > Class Template Reference<br>
-<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::tbb_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00343.html">spin_mutex</a>::<a class="el" href="a00344.html">scoped_lock</a></div>
+<h1>tbb::spin_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_mutex::scoped_lock" -->Represents acquisition of a mutex.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00634.html">tbb_allocator.h</a>></code>
+<code>#include <spin_mutex.h></code>
<p>
-<a href="a00146.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00128.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05f5ff584890407c8d672e4b4378744d"></a><!-- doxytag: member="tbb::tbb_allocator< void >::pointer" ref="05f5ff584890407c8d672e4b4378744d" args="" -->
-typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="29ae680ae7f5e685c2e15535b9c855b3"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="29ae680ae7f5e685c2e15535b9c855b3" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="33e64ba71f06ef24a5093415185e66cb"></a><!-- doxytag: member="tbb::tbb_allocator< void >::const_pointer" ref="33e64ba71f06ef24a5093415185e66cb" args="" -->
-typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct without acquiring a mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5ce6807050a9e8f87bcb4a65dccb12ef"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="5ce6807050a9e8f87bcb4a65dccb12ef" args="(spin_mutex &m)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a> (<a class="el" href="a00343.html">spin_mutex</a> &m)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81595a776b9d206a92caa526cad9c637"></a><!-- doxytag: member="tbb::tbb_allocator< void >::value_type" ref="81595a776b9d206a92caa526cad9c637" args="" -->
-typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct and acquire lock on a mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ee3c338732b1f64b0b32a757807a30d"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::acquire" ref="3ee3c338732b1f64b0b32a757807a30d" args="(spin_mutex &m)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a> (<a class="el" href="a00343.html">spin_mutex</a> &m)</td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a> (<a class="el" href="a00343.html">spin_mutex</a> &m)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#9297ec188534b45dc0ca48f2f39a0501"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eeb615e68e963e6bf8d9c11402d0ce8e"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::release" ref="eeb615e68e963e6bf8d9c11402d0ce8e" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac6fa425d1f06c56d8b70abc51aac844"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::~scoped_lock" ref="ac6fa425d1f06c56d8b70abc51aac844" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy lock. If holding a lock, releases the lock first. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6ee2a2cdaf6a2128849e7d7723d9174f"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::spin_mutex" ref="6ee2a2cdaf6a2128849e7d7723d9174f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>spin_mutex</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- class tbb::tbb_allocator< void ></h3>
+Represents acquisition of a mutex.
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="9297ec188534b45dc0ca48f2f39a0501"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::try_acquire" ref="9297ec188534b45dc0ca48f2f39a0501" args="(spin_mutex &m)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool tbb::spin_mutex::scoped_lock::try_acquire </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00343.html">spin_mutex</a> & </td>
+ <td class="paramname"> <em>m</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
+Try acquiring lock (non-blocking).
+<p>
+Return true if lock acquired; false otherwise.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00634.html">tbb_allocator.h</a></ul>
+<li>spin_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00345.html b/doc/html/a00345.html
index 00bdd33..07ac43c 100644
--- a/doc/html/a00345.html
+++ b/doc/html/a00345.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tbb_exception Class Reference</title>
+<title>tbb::spin_rw_mutex_v3 Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,106 +21,93 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00345.html">tbb_exception</a></div>
-<h1>tbb::tbb_exception Class Reference</h1><!-- doxytag: class="tbb::tbb_exception" -->Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00345.html">spin_rw_mutex_v3</a></div>
+<h1>tbb::spin_rw_mutex_v3 Class Reference<br>
+<small>
+[<a class="el" href="a00444.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3" -->Fast, unfair, spinning reader-writer lock with backoff and writer-preference.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <spin_rw_mutex.h></code>
<p>
-<p>Inheritance diagram for tbb::tbb_exception:
-<p><center><img src="a00345.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
-<map name="tbb::tbb_exception_map">
-<area href="a00266.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
-<area href="a00299.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
-</map>
-<a href="a00157.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00129.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00345.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0 throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61332b2756de89f3f5f69310cbb6e70c"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::spin_rw_mutex_v3" ref="61332b2756de89f3f5f69310cbb6e70c" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object. <a href="#3e3482bf264d4ca4dde046cd9c02c766"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> ()=0 throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9a815fb2759e55072ed413f1b6970cf3"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::~spin_rw_mutex_v3" ref="9a815fb2759e55072ed413f1b6970cf3" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method. <a href="#66c94938eca8bf88b76f3eccaaf215d8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> ()=0</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. state is zero. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4007d6e1523dbc3c2bb7f889ab789a8a"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::lock" ref="4007d6e1523dbc3c2bb7f889ab789a8a" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object. <a href="#8588e07fa49692f4d734e4f2e4f048f4"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d00f6497e552fee978a02bfcbebf46e2"></a><!-- doxytag: member="tbb::tbb_exception::name" ref="d00f6497e552fee978a02bfcbebf46e2" args="() const =0" -->
-virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0 throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire writer lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#088bb256be794cc47d3b83791632fdfc">try_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8157689ecb66bc6c72d3618bf3cc371"></a><!-- doxytag: member="tbb::tbb_exception::what" ref="e8157689ecb66bc6c72d3618bf3cc371" args="() const =0" -->
-virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0 throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring writer lock (non-blocking). <a href="#088bb256be794cc47d3b83791632fdfc"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9f52ead2098eb5fb12da59d5ae53b55"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::unlock" ref="f9f52ead2098eb5fb12da59d5ae53b55" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00345.html#e8157689ecb66bc6c72d3618bf3cc371">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a> (void *p)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13f799708ac4ca437a16be202e263e18"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::lock_read" ref="13f799708ac4ca437a16be202e263e18" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#13f799708ac4ca437a16be202e263e18">lock_read</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire reader lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#b8667415869013f840d976aa406d385a">try_lock_read</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring reader lock (non-blocking). <a href="#b8667415869013f840d976aa406d385a"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c1e60f22c01604ca93c41b8334cc15e"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_rw_mutex" ref="4c1e60f22c01604ca93c41b8334cc15e" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="681a816fe76d6ca7752303f9dcc3c4b2"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_recursive_mutex" ref="681a816fe76d6ca7752303f9dcc3c4b2" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4dd66d90df6247da6050e88b2aa3b820"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_fair_mutex" ref="4dd66d90df6247da6050e88b2aa3b820" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00346.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.
-<p>
-If an unhandled exception of the type derived from <a class="el" href="a00345.html">tbb::tbb_exception</a> is intercepted by the TBB scheduler in one of the worker threads, it is delivered to and re-thrown in the root thread. The root thread is the thread that has started the outermost algorithm or root task sharing the same <a class="el" href="a00340.html">task_group_context</a> with the guilty algorithm/task (the one that threw the exception first).<p>
-Note: when documentation mentions workers with respect to exception handling, masters are implied as well, because they are completely equivalent in this context. Consequently a root thread can be master or worker thread.<p>
-NOTE: In case of nested algorithms or complex task hierarchies when the nested levels share (explicitly or by means of implicit inheritance) the task group context of the outermost level, the exception may be (re-)thrown multiple times (ultimately - in each worker on each nesting level) before reaching the root thread at the outermost level. IMPORTANT: if you intercept an exception derived from this class on a nested level, you must re-throw it in the catch block by means of the "throw;" [...]
-TBB provides two implementations of this interface: <a class="el" href="a00266.html">tbb::captured_exception</a> and template class <a class="el" href="a00299.html">tbb::movable_exception</a>. See their declarations for more info.
+Fast, unfair, spinning reader-writer lock with backoff and writer-preference.
<p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="66c94938eca8bf88b76f3eccaaf215d8"></a><!-- doxytag: member="tbb::tbb_exception::destroy" ref="66c94938eca8bf88b76f3eccaaf215d8" args="()=0" -->
+<a class="anchor" name="088bb256be794cc47d3b83791632fdfc"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::try_lock" ref="088bb256be794cc47d3b83791632fdfc" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">virtual void tbb::tbb_exception::destroy </td>
+ <td class="memname">bool tbb::spin_rw_mutex_v3::try_lock </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"> throw ()<code> [pure virtual]</code></td>
+ <td width="100%"><code> [inline]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Destroys objects created by the <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method.
-<p>
-Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
+Try acquiring writer lock (non-blocking).
<p>
-Implemented in <a class="el" href="a00266.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00299.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
+Return true if lock acquired; false otherwise.
</div>
</div><p>
-<a class="anchor" name="3e3482bf264d4ca4dde046cd9c02c766"></a><!-- doxytag: member="tbb::tbb_exception::move" ref="3e3482bf264d4ca4dde046cd9c02c766" args="()=0" -->
+<a class="anchor" name="b8667415869013f840d976aa406d385a"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::try_lock_read" ref="b8667415869013f840d976aa406d385a" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">virtual <a class="el" href="a00345.html">tbb_exception</a>* tbb::tbb_exception::move </td>
+ <td class="memname">bool tbb::spin_rw_mutex_v3::try_lock_read </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"> throw ()<code> [pure virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Creates and returns pointer to the deep copy of this exception object.
-<p>
-Move semantics is allowed.
-<p>
-Implemented in <a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
-</div>
-</div><p>
-<a class="anchor" name="3f2da7f3d8a6e4c1df522af1213afb5a"></a><!-- doxytag: member="tbb::tbb_exception::operator delete" ref="3f2da7f3d8a6e4c1df522af1213afb5a" args="(void *p)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::tbb_exception::operator delete </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>p</em> </td>
- <td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
</table>
@@ -128,38 +115,16 @@ Implemented in <a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f"
<div class="memdoc">
<p>
-Operator delete is provided only to allow using existing smart pointers with TBB exception objects obtained as the result of applying <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
-When overriding method <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> make sure to override operator delete as well if memory is allocated not by TBB's scalable allocator.
-</div>
-</div><p>
-<a class="anchor" name="8588e07fa49692f4d734e4f2e4f048f4"></a><!-- doxytag: member="tbb::tbb_exception::throw_self" ref="8588e07fa49692f4d734e4f2e4f048f4" args="()=0" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual void tbb::tbb_exception::throw_self </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [pure virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Throws this exception object.
-<p>
-Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
+Try acquiring reader lock (non-blocking).
<p>
-Implemented in <a class="el" href="a00266.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00299.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
+Return true if reader lock acquired; false otherwise.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li>spin_rw_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00346.html b/doc/html/a00346.html
index 0834f10..be51b66 100644
--- a/doc/html/a00346.html
+++ b/doc/html/a00346.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::tbb_exception_ptr Class Reference</title>
+<title>tbb::spin_rw_mutex_v3::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,66 +21,126 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>internal</b>::<a class="el" href="a00346.html">tbb_exception_ptr</a></div>
-<h1>tbb::internal::tbb_exception_ptr Class Reference</h1><!-- doxytag: class="tbb::internal::tbb_exception_ptr" -->Exception container that preserves the exact copy of the original exception.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00345.html">spin_rw_mutex_v3</a>::<a class="el" href="a00346.html">scoped_lock</a></div>
+<h1>tbb::spin_rw_mutex_v3::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <spin_rw_mutex.h></code>
<p>
-<a href="a00160.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00130.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys this objects. <a href="#921875bbacd2c8a5f324c7da7a415262"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="292832fd5c523e3d8081a22247840a1d"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::throw_self" ref="292832fd5c523e3d8081a22247840a1d" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <a href="#d6ea60dee5563f702379bf5e51aa8806"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="42a92d4f8fdde425b111cfa8a9228071"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock" ref="42a92d4f8fdde425b111cfa8a9228071" args="(spin_rw_mutex &m, bool write=true)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00345.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws the contained exception . <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="65083750bebe799d3fe8143c794523bb"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="65083750bebe799d3fe8143c794523bb" args="()" -->
-static <a class="el" href="a00346.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d7eaaa3f2e2c5dc11e7005811b1bdd04"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::~scoped_lock" ref="d7eaaa3f2e2c5dc11e7005811b1bdd04" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1111b00ba54b7fe35e6d3a0f21de287"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="d1111b00ba54b7fe35e6d3a0f21de287" args="(const tbb_exception &tag)" -->
-static <a class="el" href="a00346.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00345.html">tbb_exception</a> &tag)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b646ec5be02a127d159bbb7ca65353"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::acquire" ref="b0b646ec5be02a127d159bbb7ca65353" args="(spin_rw_mutex &m, bool write=true)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00345.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c35e5db8e9cdff5d1387db5b0bad2e4a"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="c35e5db8e9cdff5d1387db5b0bad2e4a" args="(captured_exception &src)" -->
-static <a class="el" href="a00346.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00266.html">captured_exception</a> &src)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">This overload uses move semantics (i.e. it empties src). <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer. <a href="#3f0b1e3f2efab63336400348bd070226"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61b14d00a78185c9b2d206ebfc379124"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::release" ref="61b14d00a78185c9b2d206ebfc379124" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#61b14d00a78185c9b2d206ebfc379124">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c2c2c38a08cb9080e87099fac3e5bc94"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::downgrade_to_reader" ref="c2c2c38a08cb9080e87099fac3e5bc94" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Downgrade writer to become a reader. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9879626968d9b9a04cd2ec0fb2e84ae1"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::try_acquire" ref="9879626968d9b9a04cd2ec0fb2e84ae1" args="(spin_rw_mutex &m, bool write=true)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00345.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d96d1a1fcc3d79ef3e5c06a53b8ffeaa"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::mutex" ref="d96d1a1fcc3d79ef3e5c06a53b8ffeaa" args="" -->
+<a class="el" href="a00345.html">spin_rw_mutex</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The pointer to the current mutex that is held, or NULL if no mutex is held. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">If mutex!=NULL, then is_writer is true if holding a writer lock, false if holding a reader lock. <a href="#6b5a7c3c67a36b05c4df8410d32627d8"></a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception container that preserves the exact copy of the original exception.
+The scoped locking pattern.
+<p>
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="d6ea60dee5563f702379bf5e51aa8806"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock" ref="d6ea60dee5563f702379bf5e51aa8806" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
<p>
-This class can be used only when the appropriate runtime support (mandated by C++0x) is present
+Construct lock that has not acquired a mutex.
<p>
+Equivalent to zero-initialization of *this.
+</div>
+</div><p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="921875bbacd2c8a5f324c7da7a415262"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::destroy" ref="921875bbacd2c8a5f324c7da7a415262" args="()" -->
+<a class="anchor" name="3f0b1e3f2efab63336400348bd070226"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer" ref="3f0b1e3f2efab63336400348bd070226" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">void tbb::internal::tbb_exception_ptr::destroy </td>
+ <td class="memname">bool tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"> throw ()</td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Upgrade reader to become a writer.
+<p>
+Returns whether the upgrade happened without releasing and re-acquiring the lock
+</div>
+</div><p>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="6b5a7c3c67a36b05c4df8410d32627d8"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::is_writer" ref="6b5a7c3c67a36b05c4df8410d32627d8" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00346.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock::is_writer</a><code> [protected]</code> </td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Destroys this objects.
+If mutex!=NULL, then is_writer is true if holding a writer lock, false if holding a reader lock.
<p>
-Note that objects of this type can be created only by the allocate() method.
+Not defined if not holding a lock.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li>spin_rw_mutex.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00347.html b/doc/html/a00347.html
index ff67c30..db7118c 100644
--- a/doc/html/a00347.html
+++ b/doc/html/a00347.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tbb_hash_compare< Key > Struct Template Reference</title>
+<title>tbb::split Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,33 +21,28 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00347.html">tbb_hash_compare</a></div>
-<h1>tbb::tbb_hash_compare< Key > Struct Template Reference</h1><!-- doxytag: class="tbb::tbb_hash_compare" -->hash_compare that is default argument for concurrent_hash_map
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00347.html">split</a></div>
+<h1>tbb::split Class Reference<br>
+<small>
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::split" -->Dummy type that distinguishes splitting constructor from copy constructor.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00455.html">concurrent_hash_map.h</a>></code>
+<code>#include <tbb_stddef.h></code>
<p>
-<a href="a00018.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c35d106ad65aa6ca5ba9008c1c86f80d"></a><!-- doxytag: member="tbb::tbb_hash_compare::hash" ref="c35d106ad65aa6ca5ba9008c1c86f80d" args="(const Key &a)" -->
-static size_t </td><td class="memItemRight" valign="bottom"><b>hash</b> (const Key &a)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b4d302049aabea046e392ddfad8b3f06"></a><!-- doxytag: member="tbb::tbb_hash_compare::equal" ref="b4d302049aabea046e392ddfad8b3f06" args="(const Key &a, const Key &b)" -->
-static bool </td><td class="memItemRight" valign="bottom"><b>equal</b> (const Key &a, const Key &b)</td></tr>
-
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key><br>
- struct tbb::tbb_hash_compare< Key ></h3>
-
-hash_compare that is default argument for concurrent_hash_map
+Dummy type that distinguishes splitting constructor from copy constructor.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00455.html">concurrent_hash_map.h</a></ul>
+See description of parallel_for and parallel_reduce for example usages.
+<p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li>tbb_stddef.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00348.html b/doc/html/a00348.html
index 16f0a1b..5bd832d 100644
--- a/doc/html/a00348.html
+++ b/doc/html/a00348.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::thread_bound_filter Class Reference</title>
+<title>tbb::flow::interface6::split_node< TupleType, Allocator > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,100 +21,52 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00348.html">thread_bound_filter</a></div>
-<h1>tbb::thread_bound_filter Class Reference<br>
-<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::thread_bound_filter" --><!-- doxytag: inherits="tbb::filter" -->A stage in a pipeline served by a user thread.
+<a class="el" href="a00428.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00348.html">split_node</a></div>
+<h1>tbb::flow::interface6::split_node< TupleType, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::split_node" --><!-- doxytag: inherits="tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator >" --><a class="el" href="a00348.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00587.html">pipeline.h</a>></code>
+<code>#include <flow_graph.h></code>
<p>
-<p>Inheritance diagram for tbb::thread_bound_filter:
-<p><center><img src="a00348.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
-<map name="tbb::thread_bound_filter_map">
-<area href="a00282.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
+<p>Inheritance diagram for tbb::flow::interface6::split_node< TupleType, Allocator >:
+<p><center><img src="a00348.png" usemap="#tbb::flow::interface6::split_node< TupleType, Allocator >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::split_node< TupleType, Allocator >_map">
+<area href="a00312.html" alt="tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator >" shape="rect" coords="481,56,1433,80">
+<area href="a00301.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,952,24">
</map>
-<a href="a00106.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00068.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23"></a><!-- doxytag: member="tbb::thread_bound_filter::success" ref="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>success</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0a153f789b0faa7b343c29d9b97c0f71"></a><!-- doxytag: member="tbb::flow::interface6::split_node::output_ports_type" ref="0a153f789b0faa7b343c29d9b97c0f71" args="" -->
+typedef base_type::output_ports_type </td><td class="memItemRight" valign="bottom"><b>output_ports_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="902c4645e624e8f589b89841df5331de5243cf0030982cfa4ac1a8e97acb39f4"></a><!-- doxytag: member="tbb::thread_bound_filter::item_not_available" ref="902c4645e624e8f589b89841df5331de5243cf0030982cfa4ac1a8e97acb39f4" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>item_not_available</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="414872500f7ab2cecd98edc6945dea47"></a><!-- doxytag: member="tbb::flow::interface6::split_node::input_type" ref="414872500f7ab2cecd98edc6945dea47" args="" -->
+typedef TupleType </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="902c4645e624e8f589b89841df5331ded4085a8b251604b51c0f19602eeef09f"></a><!-- doxytag: member="tbb::thread_bound_filter::end_of_stream" ref="902c4645e624e8f589b89841df5331ded4085a8b251604b51c0f19602eeef09f" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>end_of_stream</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>result_type</b> { <b>success</b>,
-<b>item_not_available</b>,
-<b>end_of_stream</b>
- }</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06f32ac2a6bc1043ef6dd9ec40044522"></a><!-- doxytag: member="tbb::flow::interface6::split_node::allocator_type" ref="06f32ac2a6bc1043ef6dd9ec40044522" args="" -->
+typedef Allocator </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00348.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce8ee443d310145fc36e152c608c2e49"></a><!-- doxytag: member="tbb::flow::interface6::split_node::split_node" ref="ce8ee443d310145fc36e152c608c2e49" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><b>split_node</b> (<a class="el" href="a00300.html">graph</a> &g)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">If a data item is available, invoke operator() on that item. <a href="#c4f90f2c771bce748beb9be734fa286c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00348.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c16a1c429bb2e3a33f6c56de84e63405"></a><!-- doxytag: member="tbb::flow::interface6::split_node::split_node" ref="c16a1c429bb2e3a33f6c56de84e63405" args="(const split_node &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>split_node</b> (const <a class="el" href="a00348.html">split_node</a> &other)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wait until a data item becomes available, and invoke operator() on that item. <a href="#5e726bdc7fbd924c0b07bd558b1d4d5d"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="413fad2ade743d9af5dcabc56aedf4fe"></a><!-- doxytag: member="tbb::thread_bound_filter::thread_bound_filter" ref="413fad2ade743d9af5dcabc56aedf4fe" args="(mode filter_mode)" -->
- </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b> (mode filter_mode)</td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>splitting_body</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A stage in a pipeline served by a user thread.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="5e726bdc7fbd924c0b07bd558b1d4d5d"></a><!-- doxytag: member="tbb::thread_bound_filter::process_item" ref="5e726bdc7fbd924c0b07bd558b1d4d5d" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">result_type __TBB_EXPORTED_METHOD tbb::thread_bound_filter::process_item </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Wait until a data item becomes available, and invoke operator() on that item.
-<p>
-This interface is blocking. Returns 'success' if an item was processed. Returns 'end_of_stream' if there are no more items to process. Never returns 'item_not_available', as it blocks until another return condition applies.
-</div>
-</div><p>
-<a class="anchor" name="c4f90f2c771bce748beb9be734fa286c"></a><!-- doxytag: member="tbb::thread_bound_filter::try_process_item" ref="c4f90f2c771bce748beb9be734fa286c" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">result_type __TBB_EXPORTED_METHOD tbb::thread_bound_filter::try_process_item </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename TupleType, typename Allocator = cache_aligned_allocator<TupleType>><br>
+ class tbb::flow::interface6::split_node< TupleType, Allocator ></h3>
+<a class="el" href="a00348.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its
<p>
-If a data item is available, invoke operator() on that item.
-<p>
-This interface is non-blocking. Returns 'success' if an item was processed. Returns 'item_not_available' if no item can be processed now but more may arrive in the future, or if token limit is reached. Returns 'end_of_stream' if there are no more items to process.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00587.html">pipeline.h</a></ul>
+<li><a class="el" href="a00385.html">flow_graph.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00348.png b/doc/html/a00348.png
index 3327bd5..a62a815 100644
Binary files a/doc/html/a00348.png and b/doc/html/a00348.png differ
diff --git a/doc/html/a00349.html b/doc/html/a00349.html
index e18a148..e67bf71 100644
--- a/doc/html/a00349.html
+++ b/doc/html/a00349.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tick_count Class Reference</title>
+<title>tbb::task Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,45 +21,633 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00349.html">tick_count</a></div>
-<h1>tbb::tick_count Class Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00349.html">task</a></div>
+<h1>tbb::task Class Reference<br>
<small>
-[<a class="el" href="a00430.html">Timing</a>]</small>
-</h1><!-- doxytag: class="tbb::tick_count" -->Absolute timestamp.
+[<a class="el" href="a00446.html">Task Scheduling</a>]</small>
+</h1><!-- doxytag: class="tbb::task" -->Base class for user-defined tasks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00665.html">tick_count.h</a>></code>
+<code>#include <task.h></code>
<p>
-<a href="a00183.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::task:
+<p><center><img src="a00349.png" usemap="#tbb::task_map" border="0" alt=""></center>
+<map name="tbb::task_map">
+<area href="a00292.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
+</map>
+<a href="a00135.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef internal::affinity_id </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An id as used for specifying affinity. <a href="#d61bb32389d3857bf7511d69beaafb76"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task is running, and will be destroyed after method <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute()</a> completes. <a href="#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task to be rescheduled. <a href="#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task is in ready pool, or is going to be put there, or was just taken off. <a href="#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task object is freshly allocated or recycled. <a href="#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task object is on free list, or is going to be put there, or was just taken off. <a href="#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e2a3f84c7721f6c0b859a91a5ecc660c4">__TBB_RECYCLE_TO_ENQUEUE</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task to be scheduled for starvation-resistant execution <a href="#4a3c415562d17905390ea5b49d12293e2a3f84c7721f6c0b859a91a5ecc660c4"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4a3c415562d17905390ea5b49d12293e72b15f1b9cdfa1f2381435f20b05007c"></a><!-- doxytag: member="tbb::task::endif" ref="4a3c415562d17905390ea5b49d12293e72b15f1b9cdfa1f2381435f20b05007c" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>endif</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
+ <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
+<a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
+<a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
+<a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
+<br>
+ <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
+<a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e2a3f84c7721f6c0b859a91a5ecc660c4">__TBB_RECYCLE_TO_ENQUEUE</a>,
+<b>endif</b>
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enumeration of task states that the scheduler considers. <a href="a00349.html#4a3c415562d17905390ea5b49d12293e">More...</a><br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34593326ae4191e02a13c7cbdab9de4c"></a><!-- doxytag: member="tbb::tick_count::tick_count" ref="34593326ae4191e02a13c7cbdab9de4c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245ee0473f84cb19dbbf8c81134908"></a><!-- doxytag: member="tbb::task::~task" ref="98245ee0473f84cb19dbbf8c81134908" args="()" -->
+virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#98245ee0473f84cb19dbbf8c81134908">~task</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="22c298cd40937a431a06777423f002f6"></a><!-- doxytag: member="tbb::task::execute" ref="22c298cd40937a431a06777423f002f6" args="()=0" -->
+virtual <a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute</a> ()=0</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Should be overridden by derived classes. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">internal::allocate_continuation_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#1434c79a5138993269d034008bff7329">allocate_continuation</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a continuation task of *this. <a href="#1434c79a5138993269d034008bff7329"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ff794f7053cd9148d5f280fbf07377f"></a><!-- doxytag: member="tbb::task::allocate_child" ref="1ff794f7053cd9148d5f280fbf07377f" args="()" -->
+internal::allocate_child_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a child task of *this. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a> (<a class="el" href="a00349.html">task</a> &t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy a task. <a href="#dfaacf92685e5f86393bf657b2853bf8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Change this to be a continuation of its former self. <a href="#a67a79e18f62b43a623a00cfbd76db4c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Recommended to use, safe variant of recycle_as_continuation. <a href="#3b290d14109704e2b69dc1ac980a7a76"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db399855177438bbc9cc61d508dae8d2"></a><!-- doxytag: member="tbb::task::recycle_as_child_of" ref="db399855177438bbc9cc61d508dae8d2" args="(task &new_parent)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00349.html">task</a> &new_parent)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Change this to be a child of new_parent. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Schedule this for reexecution after current <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. <a href="#4f1be9bbcdb487830dbe298b68d85144"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#076120a15237d1ee63060c992e878b29">recycle_to_enqueue</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Schedule this to enqueue after descendant tasks complete. <a href="#076120a15237d1ee63060c992e878b29"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7653ceef53a188d05b5c779e1104b698"></a><!-- doxytag: member="tbb::task::depth" ref="7653ceef53a188d05b5c779e1104b698" args="() const " -->
+intptr_t </td><td class="memItemRight" valign="bottom"><b>depth</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e864e9c80e3d79f00d77fb99f4757621"></a><!-- doxytag: member="tbb::task::set_depth" ref="e864e9c80e3d79f00d77fb99f4757621" args="(intptr_t)" -->
+void </td><td class="memItemRight" valign="bottom"><b>set_depth</b> (intptr_t)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c83fcc26f6513f0e06de70cbab9dee46"></a><!-- doxytag: member="tbb::task::add_to_depth" ref="c83fcc26f6513f0e06de70cbab9dee46" args="(int)" -->
+void </td><td class="memItemRight" valign="bottom"><b>add_to_depth</b> (int)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06a4206a57e8e12a439b14d6d41cfd92"></a><!-- doxytag: member="tbb::task::set_ref_count" ref="06a4206a57e8e12a439b14d6d41cfd92" args="(int count)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a> (int count)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set reference count. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically increment reference count and returns its old value. <a href="#f5fb43c7ad0de5a4b95703cebc39e345"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically decrement reference count and returns its new value. <a href="#ef4680f5c148020c5e7e43ddef44cd5d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ce28ca9baa771cfc37ecd72e69c4f3c"></a><!-- doxytag: member="tbb::task::spawn_and_wait_for_all" ref="3ce28ca9baa771cfc37ecd72e69c4f3c" args="(task &child)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00349.html">task</a> &child)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Similar to spawn followed by wait_for_all, but more efficient. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="894ab68378e502776d8220eea7ce9fa1"></a><!-- doxytag: member="tbb::task::spawn_and_wait_for_all" ref="894ab68378e502776d8220eea7ce9fa1" args="(task_list &list)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00354.html">task_list</a> &list)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Similar to spawn followed by wait_for_all, but more efficient. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Wait for reference count to become one, and set reference count to zero. <a href="#53d2615ad9c38859b4c8080936600283"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="314e98ee4347ccec83efcb9ee22e8596"></a><!-- doxytag: member="tbb::task::parent" ref="314e98ee4347ccec83efcb9ee22e8596" args="() const " -->
+<a class="el" href="a00349.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#314e98ee4347ccec83efcb9ee22e8596">parent</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct an absolute timestamp initialized to zero. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task on whose behalf this task is working, or NULL if this is a root. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2eaf79fcaa3ae473e3bd3f44bd8a464"></a><!-- doxytag: member="tbb::task::set_parent" ref="d2eaf79fcaa3ae473e3bd3f44bd8a464" args="(task *p)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a> (<a class="el" href="a00349.html">task</a> *p)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">sets parent task pointer to specified value <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00353.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">This method is deprecated and will be removed in the future. <a href="#d8c36a93f3972590fbb65ff1cef3173b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5987123486afca36ddebb9e2a8b7779a"></a><!-- doxytag: member="tbb::task::group" ref="5987123486afca36ddebb9e2a8b7779a" args="()" -->
+<a class="el" href="a00353.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#5987123486afca36ddebb9e2a8b7779a">group</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to the task group descriptor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9169402702f56bf519448aaf34450aa"></a><!-- doxytag: member="tbb::task::is_stolen_task" ref="f9169402702f56bf519448aaf34450aa" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if task was stolen from the task pool of another thread. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0af7b2d7e6e8b4333b2accfce3dfb374"></a><!-- doxytag: member="tbb::task::state" ref="0af7b2d7e6e8b4333b2accfce3dfb374" args="() const " -->
+<a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Current execution state. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad774f55eaec008ae02b236423209ced"></a><!-- doxytag: member="tbb::task::ref_count" ref="ad774f55eaec008ae02b236423209ced" args="() const " -->
+int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#ad774f55eaec008ae02b236423209ced">ref_count</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The internal reference count. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c26718b3b247cd13deb1a741902e7105"></a><!-- doxytag: member="tbb::task::is_owned_by_current_thread" ref="c26718b3b247cd13deb1a741902e7105" args="() const " -->
+bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Obsolete, and only retained for the sake of backward compatibility. Always returns true. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dca19d7a45487a7d67a0db517e2b57c9"></a><!-- doxytag: member="tbb::task::set_affinity" ref="dca19d7a45487a7d67a0db517e2b57c9" args="(affinity_id id)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set affinity for this task. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3a920a56b0bcf2801518fb45b2c9d2be"></a><!-- doxytag: member="tbb::task::affinity" ref="3a920a56b0bcf2801518fb45b2c9d2be" args="() const " -->
+<a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Current affinity of this task. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Invoked by scheduler to notify task that it ran on unexpected thread. <a href="#713c338c8eeaebdc5a6b10a69c039b06"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a> (<a class="el" href="a00353.html">task_group_context</a> &ctx)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Moves this task from its current group into another one. <a href="#62247be9a637a814c8e8f4bcfb3a1908"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Initiates cancellation of all tasks in this cancellation group and its subordinate groups. <a href="#0f3fb4aac549ab642022450a4bd13326"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="025f18118c057c4c8db87ff2ce8df975"></a><!-- doxytag: member="tbb::task::is_cancelled" ref="025f18118c057c4c8db87ff2ce8df975" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if the context has received cancellation request. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="025f18118c057c4c8db87ff2ce8df975"></a><!-- doxytag: member="tbb::task::is_cancelled" ref="025f18118c057c4c8db87ff2ce8df975" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><b>is_cancelled</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9ac8d1542d67d9d80121ff986801ac26"></a><!-- doxytag: member="tbb::task::set_group_priority" ref="9ac8d1542d67d9d80121ff986801ac26" args="(priority_t p)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a> (priority_t p)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Changes priority of the task group this task belongs to. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e1d969a1ccab6796e3b8b2c1a5be33d2"></a><!-- doxytag: member="tbb::task::group_priority" ref="e1d969a1ccab6796e3b8b2c1a5be33d2" args="() const " -->
+priority_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Retrieves current priority of the task group this task belongs to. <br></td></tr>
<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb7f78ca61cf28398645ace66e284473"></a><!-- doxytag: member="tbb::tick_count::now" ref="fb7f78ca61cf28398645ace66e284473" args="()" -->
-static <a class="el" href="a00349.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23acb0da0afd690da797f9f882027d34"></a><!-- doxytag: member="tbb::task::allocate_root" ref="23acb0da0afd690da797f9f882027d34" args="()" -->
+static internal::allocate_root_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#23acb0da0afd690da797f9f882027d34">allocate_root</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a root task. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ccc518caf31075a3e073996d2d240a4"></a><!-- doxytag: member="tbb::task::allocate_root" ref="8ccc518caf31075a3e073996d2d240a4" args="(task_group_context &ctx)" -->
+static internal::allocate_root_with_context_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00353.html">task_group_context</a> &ctx)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a root task associated with user supplied context. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce8ce689c26a4ddf343829bc3c73290a"></a><!-- doxytag: member="tbb::task::spawn_root_and_wait" ref="ce8ce689c26a4ddf343829bc3c73290a" args="(task &root)" -->
+static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00349.html">task</a> &root)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn task allocated by allocate_root, wait for it to complete, and deallocate it. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00354.html">task_list</a> &root_list)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn root tasks on list and wait for all of them to finish. <a href="#c33c7edbaec67aa8a56f48986a9dc69f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a> (<a class="el" href="a00349.html">task</a> &t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue task for starvation-resistant execution. <a href="#8365d063c0cc9d7bd616bca47256b93c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe6bf6aaf84e664134fabb6c4f409ea9"></a><!-- doxytag: member="tbb::task::enqueue" ref="fe6bf6aaf84e664134fabb6c4f409ea9" args="(task &t, priority_t p)" -->
+static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a> (<a class="el" href="a00349.html">task</a> &t, priority_t p)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return current time. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue task for starvation-resistant execution on the specified priority level. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd43e8d6249738efafd12d6a4c72c5e3"></a><!-- doxytag: member="tbb::task::self" ref="bd43e8d6249738efafd12d6a4c72c5e3" args="()" -->
+static <a class="el" href="a00349.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The innermost task being executed or destroyed by the current thread at the moment. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bce8ec6e44706e70128f5cf91b76e67"></a><!-- doxytag: member="tbb::task::task" ref="2bce8ec6e44706e70128f5cf91b76e67" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#2bce8ec6e44706e70128f5cf91b76e67">task</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor. <br></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09dde78a4100800c11bb883d6204b586"></a><!-- doxytag: member="tbb::tick_count::operator-" ref="09dde78a4100800c11bb883d6204b586" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00350.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00349.html">tick_count</a> &t1, const <a class="el" href="a00349.html">tick_count</a> &t0)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81d0122aee4ddae419a743ee50d7038e"></a><!-- doxytag: member="tbb::task::interface5::internal::task_base" ref="81d0122aee4ddae419a743ee50d7038e" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface5::internal::task_base</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5eabadbca46f93ce6fb08290e85a0a65"></a><!-- doxytag: member="tbb::task::task_list" ref="5eabadbca46f93ce6fb08290e85a0a65" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>task_list</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e296810002652d771f692e20ca87e898"></a><!-- doxytag: member="tbb::task::internal::scheduler" ref="e296810002652d771f692e20ca87e898" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::scheduler</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="387b945c106854e1ed525f0668092930"></a><!-- doxytag: member="tbb::task::internal::allocate_root_proxy" ref="387b945c106854e1ed525f0668092930" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_root_proxy</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ecedb9436fb30df30cb3a52c64bb97e5"></a><!-- doxytag: member="tbb::task::internal::allocate_root_with_context_proxy" ref="ecedb9436fb30df30cb3a52c64bb97e5" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_root_with_context_proxy</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9987b3b1174772e5e853bd94b9f15350"></a><!-- doxytag: member="tbb::task::internal::allocate_continuation_proxy" ref="9987b3b1174772e5e853bd94b9f15350" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_continuation_proxy</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two timestamps to get the time interval between. <br></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html">interval_t</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f9e255654086b52fe107e4d8bbc8b7d"></a><!-- doxytag: member="tbb::task::internal::allocate_child_proxy" ref="1f9e255654086b52fe107e4d8bbc8b7d" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_child_proxy</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e99ce0045ea3c55d239f38ea026b8a7"></a><!-- doxytag: member="tbb::task::internal::allocate_additional_child_of_proxy" ref="0e99ce0045ea3c55d239f38ea026b8a7" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_additional_child_of_proxy</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval. <a href="a00350.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Absolute timestamp.
+Base class for user-defined tasks.
+<p>
+<hr><h2>Member Typedef Documentation</h2>
+<a class="anchor" name="d61bb32389d3857bf7511d69beaafb76"></a><!-- doxytag: member="tbb::task::affinity_id" ref="d61bb32389d3857bf7511d69beaafb76" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef internal::affinity_id <a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">tbb::task::affinity_id</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+An id as used for specifying affinity.
+<p>
+Guaranteed to be integral type. Value of 0 means no affinity.
+</div>
+</div><p>
+<hr><h2>Member Enumeration Documentation</h2>
+<a class="anchor" name="4a3c415562d17905390ea5b49d12293e"></a><!-- doxytag: member="tbb::task::state_type" ref="4a3c415562d17905390ea5b49d12293e" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enumeration of task states that the scheduler considers.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><!-- doxytag: member="executing" ref="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9" args="" -->executing</em> </td><td>
+task is running, and will be destroyed after method <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute()</a> completes. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513"></a><!-- doxytag: member="reexecute" ref="4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513" args="" -->reexecute</em> </td><td>
+task to be rescheduled. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a"></a><!-- doxytag: member="ready" ref="4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a" args="" -->ready</em> </td><td>
+task is in ready pool, or is going to be put there, or was just taken off. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c"></a><!-- doxytag: member="allocated" ref="4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c" args="" -->allocated</em> </td><td>
+task object is freshly allocated or recycled. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735"></a><!-- doxytag: member="freed" ref="4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735" args="" -->freed</em> </td><td>
+task object is on free list, or is going to be put there, or was just taken off. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e2a3f84c7721f6c0b859a91a5ecc660c4"></a><!-- doxytag: member="__TBB_RECYCLE_TO_ENQUEUE" ref="4a3c415562d17905390ea5b49d12293e2a3f84c7721f6c0b859a91a5ecc660c4" args="" -->__TBB_RECYCLE_TO_ENQUEUE</em> </td><td>
+task to be scheduled for starvation-resistant execution </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="1434c79a5138993269d034008bff7329"></a><!-- doxytag: member="tbb::task::allocate_continuation" ref="1434c79a5138993269d034008bff7329" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">internal::allocate_continuation_proxy& tbb::task::allocate_continuation </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns proxy for overloaded new that allocates a continuation task of *this.
+<p>
+The continuation's parent becomes the parent of *this.
+</div>
+</div><p>
+<a class="anchor" name="0f3fb4aac549ab642022450a4bd13326"></a><!-- doxytag: member="tbb::task::cancel_group_execution" ref="0f3fb4aac549ab642022450a4bd13326" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool tbb::task::cancel_group_execution </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>false if cancellation has already been requested, true otherwise. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="62247be9a637a814c8e8f4bcfb3a1908"></a><!-- doxytag: member="tbb::task::change_group" ref="62247be9a637a814c8e8f4bcfb3a1908" args="(task_group_context &ctx)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void __TBB_EXPORTED_METHOD tbb::task::change_group </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00353.html">task_group_context</a> & </td>
+ <td class="paramname"> <em>ctx</em> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Moves this task from its current group into another one.
+<p>
+Argument ctx specifies the new group.<p>
+The primary purpose of this method is to associate unique task group context with a task allocated for subsequent enqueuing. In contrast to spawned tasks enqueued ones normally outlive the scope where they were created. This makes traditional usage model where task group context are allocated locally on the stack inapplicable. Dynamic allocation of context objects is performance inefficient. Method <a class="el" href="a00349.html#62247be9a637a814c8e8f4bcfb3a1908">change_group()</a> allow [...]
+</div>
+</div><p>
+<a class="anchor" name="d8c36a93f3972590fbb65ff1cef3173b"></a><!-- doxytag: member="tbb::task::context" ref="d8c36a93f3972590fbb65ff1cef3173b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00353.html">task_group_context</a>* tbb::task::context </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+This method is deprecated and will be removed in the future.
+<p>
+Use method <a class="el" href="a00349.html#5987123486afca36ddebb9e2a8b7779a">group()</a> instead.
+</div>
+</div><p>
+<a class="anchor" name="ef4680f5c148020c5e7e43ddef44cd5d"></a><!-- doxytag: member="tbb::task::decrement_ref_count" ref="ef4680f5c148020c5e7e43ddef44cd5d" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int tbb::task::decrement_ref_count </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Atomically decrement reference count and returns its new value.
+<p>
+Has release semantics.
+</div>
+</div><p>
+<a class="anchor" name="dfaacf92685e5f86393bf657b2853bf8"></a><!-- doxytag: member="tbb::task::destroy" ref="dfaacf92685e5f86393bf657b2853bf8" args="(task &t)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void __TBB_EXPORTED_METHOD tbb::task::destroy </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00349.html">task</a> & </td>
+ <td class="paramname"> <em>t</em> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroy a task.
+<p>
+Usually, calling this method is unnecessary, because a task is implicitly deleted after its <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute()</a> method runs. However, sometimes a task needs to be explicitly deallocated, such as when a root task is used as the parent in spawn_and_wait_for_all.
+</div>
+</div><p>
+<a class="anchor" name="8365d063c0cc9d7bd616bca47256b93c"></a><!-- doxytag: member="tbb::task::enqueue" ref="8365d063c0cc9d7bd616bca47256b93c" args="(task &t)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">static void tbb::task::enqueue </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00349.html">task</a> & </td>
+ <td class="paramname"> <em>t</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enqueue task for starvation-resistant execution.
+<p>
+The task will be enqueued on the normal priority level disregarding the priority of its task group.<p>
+The rationale of such semantics is that priority of an enqueued task is statically fixed at the moment of its enqueuing, while task group priority is dynamic. Thus automatic priority inheritance would be generally a subject to the race, which may result in unexpected behavior.<p>
+Use <a class="el" href="a00349.html#8365d063c0cc9d7bd616bca47256b93c">enqueue()</a> overload with explicit priority value and <a class="el" href="a00349.html#e1d969a1ccab6796e3b8b2c1a5be33d2">task::group_priority()</a> method to implement such priority inheritance when it is really necessary.
+</div>
+</div><p>
+<a class="anchor" name="f5fb43c7ad0de5a4b95703cebc39e345"></a><!-- doxytag: member="tbb::task::increment_ref_count" ref="f5fb43c7ad0de5a4b95703cebc39e345" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::task::increment_ref_count </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Atomically increment reference count and returns its old value.
+<p>
+Has acquire semantics
+</div>
+</div><p>
+<a class="anchor" name="713c338c8eeaebdc5a6b10a69c039b06"></a><!-- doxytag: member="tbb::task::note_affinity" ref="713c338c8eeaebdc5a6b10a69c039b06" args="(affinity_id id)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void __TBB_EXPORTED_METHOD tbb::task::note_affinity </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td>
+ <td class="paramname"> <em>id</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Invoked by scheduler to notify task that it ran on unexpected thread.
+<p>
+Invoked before method <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute()</a> runs, if task is stolen, or task has affinity but will be executed on another thread.<p>
+The default action does nothing.
+</div>
+</div><p>
+<a class="anchor" name="a67a79e18f62b43a623a00cfbd76db4c"></a><!-- doxytag: member="tbb::task::recycle_as_continuation" ref="a67a79e18f62b43a623a00cfbd76db4c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::task::recycle_as_continuation </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Change this to be a continuation of its former self.
+<p>
+The caller must guarantee that the task's refcount does not become zero until after the method <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute()</a> return a pointer to a child of the task. If the guarantee cannot be made, use method recycle_as_safe_continuation instead.<p>
+Because of the hazard, this method may be deprecated in the future.
+</div>
+</div><p>
+<a class="anchor" name="3b290d14109704e2b69dc1ac980a7a76"></a><!-- doxytag: member="tbb::task::recycle_as_safe_continuation" ref="3b290d14109704e2b69dc1ac980a7a76" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::task::recycle_as_safe_continuation </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Recommended to use, safe variant of recycle_as_continuation.
+<p>
+For safety, it requires additional increment of ref_count. With no descendants and ref_count of 1, it has the semantics of recycle_to_reexecute.
+</div>
+</div><p>
+<a class="anchor" name="076120a15237d1ee63060c992e878b29"></a><!-- doxytag: member="tbb::task::recycle_to_enqueue" ref="076120a15237d1ee63060c992e878b29" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::task::recycle_to_enqueue </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Schedule this to enqueue after descendant tasks complete.
+<p>
+Save enqueue/spawn difference, it has the semantics of recycle_as_safe_continuation.
+</div>
+</div><p>
+<a class="anchor" name="4f1be9bbcdb487830dbe298b68d85144"></a><!-- doxytag: member="tbb::task::recycle_to_reexecute" ref="4f1be9bbcdb487830dbe298b68d85144" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::task::recycle_to_reexecute </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Schedule this for reexecution after current <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.
+<p>
+Made obsolete by recycle_as_safe_continuation; may become deprecated.
+</div>
+</div><p>
+<a class="anchor" name="c33c7edbaec67aa8a56f48986a9dc69f"></a><!-- doxytag: member="tbb::task::spawn_root_and_wait" ref="c33c7edbaec67aa8a56f48986a9dc69f" args="(task_list &root_list)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::task::spawn_root_and_wait </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00354.html">task_list</a> & </td>
+ <td class="paramname"> <em>root_list</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Spawn root tasks on list and wait for all of them to finish.
+<p>
+If there are more tasks than worker threads, the tasks are spawned in order of front to back.
+</div>
+</div><p>
+<a class="anchor" name="53d2615ad9c38859b4c8080936600283"></a><!-- doxytag: member="tbb::task::wait_for_all" ref="53d2615ad9c38859b4c8080936600283" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::task::wait_for_all </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Wait for reference count to become one, and set reference count to zero.
<p>
+Works on tasks while waiting.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00665.html">tick_count.h</a></ul>
+<li>task.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00337.png b/doc/html/a00349.png
similarity index 100%
rename from doc/html/a00337.png
rename to doc/html/a00349.png
diff --git a/doc/html/a00350.html b/doc/html/a00350.html
index 2832a20..971df90 100644
--- a/doc/html/a00350.html
+++ b/doc/html/a00350.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tick_count::interval_t Class Reference</title>
+<title>tbb::interface6::task_arena Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,60 +21,279 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00349.html">tick_count</a>::<a class="el" href="a00350.html">interval_t</a></div>
-<h1>tbb::tick_count::interval_t Class Reference</h1><!-- doxytag: class="tbb::tick_count::interval_t" -->Relative time interval.
-<a href="#_details">More...</a>
+<a class="el" href="a00428.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00350.html">task_arena</a></div>
+<h1>tbb::interface6::task_arena Class Reference</h1><!-- doxytag: class="tbb::interface6::task_arena" --><code>#include <task_arena.h></code>
<p>
-<code>#include <<a class="el" href="a00665.html">tick_count.h</a>></code>
-<p>
-<a href="a00184.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00138.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="75a9a0949f8a8a84d6758835f1b48dad"></a><!-- doxytag: member="tbb::tick_count::interval_t::interval_t" ref="75a9a0949f8a8a84d6758835f1b48dad" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#5e14461dfcbc713df95367cf7f44738f">task_arena</a> (int max_concurrency=<a class="el" href="a00350.html#fa26370c094032900c1ed69d8e92f4e8">automatic</a>, unsigned reserved_for_masters=1)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct a time interval representing zero time duration. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1a21a428e00cced2e6a49e0f5f2258bf"></a><!-- doxytag: member="tbb::tick_count::interval_t::interval_t" ref="1a21a428e00cced2e6a49e0f5f2258bf" args="(double sec)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a> (double sec)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates <a class="el" href="a00350.html">task_arena</a> with certain concurrency limits. <a href="#5e14461dfcbc713df95367cf7f44738f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ac2706e3f2a989487ba7944b07cb94"></a><!-- doxytag: member="tbb::interface6::task_arena::task_arena" ref="27ac2706e3f2a989487ba7944b07cb94" args="(const task_arena &s)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#27ac2706e3f2a989487ba7944b07cb94">task_arena</a> (const <a class="el" href="a00350.html">task_arena</a> &s)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct a time interval representing sec seconds time duration. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5d8429c0bc59cf6131b2abc7929fa59"></a><!-- doxytag: member="tbb::tick_count::interval_t::seconds" ref="d5d8429c0bc59cf6131b2abc7929fa59" args="() const " -->
-double </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copies settings from another <a class="el" href="a00350.html">task_arena</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="797b8499b58cf6d883f04bacb7d96644"></a><!-- doxytag: member="tbb::interface6::task_arena::initialize" ref="797b8499b58cf6d883f04bacb7d96644" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>initialize</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the length of a time interval in seconds. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd9814947902e26463a69a111530f81b"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator+=" ref="cd9814947902e26463a69a111530f81b" args="(const interval_t &i)" -->
-<a class="el" href="a00350.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00350.html">interval_t</a> &i)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ff36aa5ec1305ca9931396fa608981da"></a><!-- doxytag: member="tbb::interface6::task_arena::initialize" ref="ff36aa5ec1305ca9931396fa608981da" args="(int max_concurrency, unsigned reserved_for_masters=1)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#ff36aa5ec1305ca9931396fa608981da">initialize</a> (int max_concurrency, unsigned reserved_for_masters=1)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Accumulation operator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35ff7eaf7c2031b4a991402ac9ecb940"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-=" ref="35ff7eaf7c2031b4a991402ac9ecb940" args="(const interval_t &i)" -->
-<a class="el" href="a00350.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00350.html">interval_t</a> &i)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Overrides concurrency level and forces initialization of internal representation. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#ee3f3f736da03bfe8b82acfa822624a6">terminate</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtraction operator. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cc3a7ad7000317951ce61f706163efe8"></a><!-- doxytag: member="tbb::tick_count::interval_t::tbb::tick_count" ref="cc3a7ad7000317951ce61f706163efe8" args="" -->
-class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#cc3a7ad7000317951ce61f706163efe8">tbb::tick_count</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#fec24e9b3fa07a6e7b20add7c7e0a660">~task_arena</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#11e35391bf67e96f877183659106583d">is_active</a> () const </td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename F> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00350.html#11e3854e92c842ee7d72a7f83d416896">enqueue</a> (const F &f)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09dde78a4100800c11bb883d6204b586"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-" ref="09dde78a4100800c11bb883d6204b586" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00350.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00349.html">tick_count</a> &t1, const <a class="el" href="a00349.html">tick_count</a> &t0)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename F> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00350.html#780277a89e35868abdec843fecaa2237">enqueue</a> (const F &f, priority_t p)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Extract the intervals from the tick_counts and subtract them. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5871ead1ca230efbe52a5008470e6428"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator+" ref="5871ead1ca230efbe52a5008470e6428" args="(const interval_t &i, const interval_t &j)" -->
-<a class="el" href="a00350.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00350.html">interval_t</a> &i, const <a class="el" href="a00350.html">interval_t</a> &j)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename F> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00350.html#1e013b96178a79c57ec7846ea2cf5e2e">execute</a> (F &f)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add two intervals. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa509691e1d689830931e36edd274f76"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-" ref="fa509691e1d689830931e36edd274f76" args="(const interval_t &i, const interval_t &j)" -->
-<a class="el" href="a00350.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00350.html">interval_t</a> &i, const <a class="el" href="a00350.html">interval_t</a> &j)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename F> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00350.html#082803bb20347e64fed2c11db8e9670e">execute</a> (const F &f)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#776e73ba196e5bbb8b8ed489fc2b77d3">wait_until_empty</a> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e734de6a5f4a0bd4461c0cbdaa29b6ce"></a><!-- doxytag: member="tbb::interface6::task_arena::current_slot" ref="e734de6a5f4a0bd4461c0cbdaa29b6ce" args="()" -->
+static int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#e734de6a5f4a0bd4461c0cbdaa29b6ce">current_slot</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the index, aka slot number, of the calling thread in its current arena. <br></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa26370c094032900c1ed69d8e92f4e8"></a><!-- doxytag: member="tbb::interface6::task_arena::automatic" ref="fa26370c094032900c1ed69d8e92f4e8" args="" -->
+static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#fa26370c094032900c1ed69d8e92f4e8">automatic</a> = -1</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Typedef for number of threads that is automatic. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd0464c9e70fd5fd79f1c8a875ca2849"></a><!-- doxytag: member="tbb::interface6::task_arena::internal::task_scheduler_observer_v3" ref="cd0464c9e70fd5fd79f1c8a875ca2849" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::task_scheduler_observer_v3</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two intervals. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Relative time interval.
+1-to-1 proxy representation class of scheduler's arena Constructors set up settings only, real construction is deferred till the first method invocation TODO: A side effect of this is that it's impossible to create a const <a class="el" href="a00350.html">task_arena</a> object. Rethink? Destructor only removes one of the references to the inner arena representation. Final destruction happens when all the references (and the work) are gone.
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="5e14461dfcbc713df95367cf7f44738f"></a><!-- doxytag: member="tbb::interface6::task_arena::task_arena" ref="5e14461dfcbc713df95367cf7f44738f" args="(int max_concurrency=automatic, unsigned reserved_for_masters=1)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tbb::interface6::task_arena::task_arena </td>
+ <td>(</td>
+ <td class="paramtype">int </td>
+ <td class="paramname"> <em>max_concurrency</em> = <code><a class="el" href="a00350.html#fa26370c094032900c1ed69d8e92f4e8">automatic</a></code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned </td>
+ <td class="paramname"> <em>reserved_for_masters</em> = <code>1</code></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Creates <a class="el" href="a00350.html">task_arena</a> with certain concurrency limits.
+<p>
+<ul>
+<li>max_concurrency specifies total number of slots in arena where threads work </li>
+<li>reserved_for_masters specifies number of slots to be used by master threads only. Value of 1 is default and reflects behavior of implicit arenas. </li>
+</ul>
+
+</div>
+</div><p>
+<a class="anchor" name="fec24e9b3fa07a6e7b20add7c7e0a660"></a><!-- doxytag: member="tbb::interface6::task_arena::~task_arena" ref="fec24e9b3fa07a6e7b20add7c7e0a660" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tbb::interface6::task_arena::~task_arena </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Removes the reference to the internal arena representation, and destroys the external object. Not thread safe wrt concurrent invocations of other methods.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="780277a89e35868abdec843fecaa2237"></a><!-- doxytag: member="tbb::interface6::task_arena::enqueue" ref="780277a89e35868abdec843fecaa2237" args="(const F &f, priority_t p)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename F> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::interface6::task_arena::enqueue </td>
+ <td>(</td>
+ <td class="paramtype">const F & </td>
+ <td class="paramname"> <em>f</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">priority_t </td>
+ <td class="paramname"> <em>p</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enqueues a task with priority p into the arena to process a functor f, and immediately returns. Does not require the calling thread to join the arena
+</div>
+</div><p>
+<a class="anchor" name="11e3854e92c842ee7d72a7f83d416896"></a><!-- doxytag: member="tbb::interface6::task_arena::enqueue" ref="11e3854e92c842ee7d72a7f83d416896" args="(const F &f)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename F> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::interface6::task_arena::enqueue </td>
+ <td>(</td>
+ <td class="paramtype">const F & </td>
+ <td class="paramname"> <em>f</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enqueues a task into the arena to process a functor, and immediately returns. Does not require the calling thread to join the arena
+</div>
+</div><p>
+<a class="anchor" name="082803bb20347e64fed2c11db8e9670e"></a><!-- doxytag: member="tbb::interface6::task_arena::execute" ref="082803bb20347e64fed2c11db8e9670e" args="(const F &f)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename F> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::interface6::task_arena::execute </td>
+ <td>(</td>
+ <td class="paramtype">const F & </td>
+ <td class="paramname"> <em>f</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Joins the arena and executes a functor, then returns If not possible to join, wraps the functor into a task, enqueues it and waits for task completion Can decrement the arena demand for workers, causing a worker to leave and free a slot to the calling thread
+</div>
+</div><p>
+<a class="anchor" name="1e013b96178a79c57ec7846ea2cf5e2e"></a><!-- doxytag: member="tbb::interface6::task_arena::execute" ref="1e013b96178a79c57ec7846ea2cf5e2e" args="(F &f)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename F> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::interface6::task_arena::execute </td>
+ <td>(</td>
+ <td class="paramtype">F & </td>
+ <td class="paramname"> <em>f</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Joins the arena and executes a functor, then returns If not possible to join, wraps the functor into a task, enqueues it and waits for task completion Can decrement the arena demand for workers, causing a worker to leave and free a slot to the calling thread
+</div>
+</div><p>
+<a class="anchor" name="11e35391bf67e96f877183659106583d"></a><!-- doxytag: member="tbb::interface6::task_arena::is_active" ref="11e35391bf67e96f877183659106583d" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool tbb::interface6::task_arena::is_active </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns true if the arena is active (initialized); false otherwise. The name was chosen to match a <a class="el" href="a00355.html">task_scheduler_init</a> method with the same semantics.
+</div>
+</div><p>
+<a class="anchor" name="ee3f3f736da03bfe8b82acfa822624a6"></a><!-- doxytag: member="tbb::interface6::task_arena::terminate" ref="ee3f3f736da03bfe8b82acfa822624a6" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::interface6::task_arena::terminate </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Removes the reference to the internal arena representation. Not thread safe wrt concurrent invocations of other methods.
+</div>
+</div><p>
+<a class="anchor" name="776e73ba196e5bbb8b8ed489fc2b77d3"></a><!-- doxytag: member="tbb::interface6::task_arena::wait_until_empty" ref="776e73ba196e5bbb8b8ed489fc2b77d3" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::interface6::task_arena::wait_until_empty </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
<p>
+Wait for all work in the arena to be completed Even submitted by other application threads Joins arena if/when possible (in the same way as <a class="el" href="a00350.html#1e013b96178a79c57ec7846ea2cf5e2e">execute()</a>)
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00665.html">tick_count.h</a></ul>
+<li>task_arena.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00351.html b/doc/html/a00351.html
index 88e1c1b..5a63dd8 100644
--- a/doc/html/a00351.html
+++ b/doc/html/a00351.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::user_abort Class Reference</title>
+<title>tbb::interface5::internal::task_base Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,27 +21,25 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00351.html">user_abort</a></div>
-<h1>tbb::user_abort Class Reference</h1><!-- doxytag: class="tbb::user_abort" -->Exception for user-initiated abort.
+<a class="el" href="a00428.html">tbb</a>::<b>interface5</b>::<b>internal</b>::<a class="el" href="a00351.html">task_base</a></div>
+<h1>tbb::interface5::internal::task_base Class Reference</h1><!-- doxytag: class="tbb::interface5::internal::task_base" -->Base class for methods that became static in TBB 3.0.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <task.h></code>
<p>
-<a href="a00154.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00132.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="989461aff2934fede08b969ed4bf4e16"></a><!-- doxytag: member="tbb::user_abort::what" ref="989461aff2934fede08b969ed4bf4e16" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
-
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for user-initiated abort.
+Base class for methods that became static in TBB 3.0.
+<p>
+TBB's evolution caused the "this" argument for several methods to become obsolete. However, for backwards binary compatibility, the new methods need distinct names, otherwise the One Definition Rule would be broken. Hence the new methods are defined in this private base class, and then exposed in class task via using declarations.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li>task.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00353.html b/doc/html/a00353.html
index 4374787..d694a91 100644
--- a/doc/html/a00353.html
+++ b/doc/html/a00353.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::zero_allocator< T, Allocator > Class Template Reference</title>
+<title>tbb::task_group_context Struct Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,70 +21,20 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00353.html">zero_allocator</a></div>
-<h1>tbb::zero_allocator< T, Allocator > Class Template Reference<br>
-<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::zero_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
-<a href="#_details">More...</a>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00353.html">task_group_context</a></div>
+<h1>tbb::task_group_context Struct Reference</h1><!-- doxytag: class="tbb::task_group_context" --><code>#include <parallel_invoke.h></code>
<p>
-<code>#include <<a class="el" href="a00634.html">tbb_allocator.h</a>></code>
-<p>
-<a href="a00148.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77c87446a645cc3dbeba6fc82cc7eec0"></a><!-- doxytag: member="tbb::zero_allocator::base_allocator_type" ref="77c87446a645cc3dbeba6fc82cc7eec0" args="" -->
-typedef Allocator< T > </td><td class="memItemRight" valign="bottom"><b>base_allocator_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2eb3bf02103f455e0614e0a392388428"></a><!-- doxytag: member="tbb::zero_allocator::value_type" ref="2eb3bf02103f455e0614e0a392388428" args="" -->
-typedef base_allocator_type::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="54d0a81317a90278dc492d44cc7dcdfc"></a><!-- doxytag: member="tbb::zero_allocator::pointer" ref="54d0a81317a90278dc492d44cc7dcdfc" args="" -->
-typedef base_allocator_type::pointer </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="50536b451124814064b0e8ff7b6cea21"></a><!-- doxytag: member="tbb::zero_allocator::const_pointer" ref="50536b451124814064b0e8ff7b6cea21" args="" -->
-typedef base_allocator_type::const_pointer </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ef488ecc55bf4a619f68b021d5b93e2"></a><!-- doxytag: member="tbb::zero_allocator::reference" ref="2ef488ecc55bf4a619f68b021d5b93e2" args="" -->
-typedef base_allocator_type::reference </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31f0de5db53e4c219e8548078572e1ff"></a><!-- doxytag: member="tbb::zero_allocator::const_reference" ref="31f0de5db53e4c219e8548078572e1ff" args="" -->
-typedef base_allocator_type::const_reference </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55acbfec8d7fd904c9b2040816522084"></a><!-- doxytag: member="tbb::zero_allocator::size_type" ref="55acbfec8d7fd904c9b2040816522084" args="" -->
-typedef base_allocator_type::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c54d45a74bd3b48ff8db174c266ddede"></a><!-- doxytag: member="tbb::zero_allocator::difference_type" ref="c54d45a74bd3b48ff8db174c266ddede" args="" -->
-typedef base_allocator_type::difference_type </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c48c0436e3239be8f07c53c7f6658e4"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="8c48c0436e3239be8f07c53c7f6658e4" args="(const zero_allocator &a)" -->
- </td><td class="memItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00353.html">zero_allocator</a> &a) throw ()</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="67685c1cfcd3b5f81ac8f3c8dd1375b9"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="67685c1cfcd3b5f81ac8f3c8dd1375b9" args="(const zero_allocator< U > &a)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00353.html">zero_allocator</a>< U > &a) throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b6e7eb50d9faeca418d56a9758357377"></a><!-- doxytag: member="tbb::zero_allocator::allocate" ref="b6e7eb50d9faeca418d56a9758357377" args="(const size_type n, const void *hint=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const size_type n, const void *hint=0)</td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
-
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, template< typename X > class Allocator = tbb_allocator><br>
- class tbb::zero_allocator< T, Allocator ></h3>
-
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
-<p>
-The class is an adapter over an actual allocator that fills the allocation using memset function with template argument C as the value. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
+Dummy to avoid cluttering the bulk of the header with enormous amount of ifdefs.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00634.html">tbb_allocator.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li>parallel_invoke.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00354.html b/doc/html/a00354.html
index 787fc5f..5c347d4 100644
--- a/doc/html/a00354.html
+++ b/doc/html/a00354.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::zero_allocator< void, Allocator > Class Template Reference</title>
+<title>tbb::task_list Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,45 +21,60 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00354.html">zero_allocator< void, Allocator ></a></div>
-<h1>tbb::zero_allocator< void, Allocator > Class Template Reference<br>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00354.html">task_list</a></div>
+<h1>tbb::task_list Class Reference<br>
<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::zero_allocator< void, Allocator >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+[<a class="el" href="a00446.html">Task Scheduling</a>]</small>
+</h1><!-- doxytag: class="tbb::task_list" -->A list of children.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00634.html">tbb_allocator.h</a>></code>
+<code>#include <task.h></code>
<p>
-<a href="a00150.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00137.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce4f3bf06e8aaf8020fa443297eff5f7"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::base_allocator_type" ref="ce4f3bf06e8aaf8020fa443297eff5f7" args="" -->
-typedef Allocator< void > </td><td class="memItemRight" valign="bottom"><b>base_allocator_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="416341c2047eaef50417b41eaf7e9de6"></a><!-- doxytag: member="tbb::task_list::task_list" ref="416341c2047eaef50417b41eaf7e9de6" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html#416341c2047eaef50417b41eaf7e9de6">task_list</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5cd644eeecd6d729c848c8e99ffd4592"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::value_type" ref="5cd644eeecd6d729c848c8e99ffd4592" args="" -->
-typedef base_allocator_type::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty list. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6d438f1499a02db1e59c24ab6043e5ba"></a><!-- doxytag: member="tbb::task_list::~task_list" ref="6d438f1499a02db1e59c24ab6043e5ba" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f68aa346a17c94f8c5c7945a2c50858"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::pointer" ref="8f68aa346a17c94f8c5c7945a2c50858" args="" -->
-typedef base_allocator_type::pointer </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys the list, but does not destroy the task objects. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3ac31e092814b90929f81bb30441959"></a><!-- doxytag: member="tbb::task_list::empty" ref="f3ac31e092814b90929f81bb30441959" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html#f3ac31e092814b90929f81bb30441959">empty</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ae95a5761371ee7b61f2c339385684e9"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::const_pointer" ref="ae95a5761371ee7b61f2c339385684e9" args="" -->
-typedef base_allocator_type::const_pointer </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if list if empty; false otherwise. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cd34756bc4763dafb8c84838a0124ff"></a><!-- doxytag: member="tbb::task_list::push_back" ref="4cd34756bc4763dafb8c84838a0124ff" args="(task &task)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00349.html">task</a> &<a class="el" href="a00349.html">task</a>)</td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Push task onto back of list. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fe85df5ed524418389d34051750347d"></a><!-- doxytag: member="tbb::task_list::pop_front" ref="5fe85df5ed524418389d34051750347d" args="()" -->
+<a class="el" href="a00349.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html#5fe85df5ed524418389d34051750347d">pop_front</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pop the front task from the list. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fce446ee13e025969945328f3ff59b95"></a><!-- doxytag: member="tbb::task_list::clear" ref="fce446ee13e025969945328f3ff59b95" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html#fce446ee13e025969945328f3ff59b95">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the list. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e656073628561c8fd68f6134d527e2de"></a><!-- doxytag: member="tbb::task_list::task" ref="e656073628561c8fd68f6134d527e2de" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81d0122aee4ddae419a743ee50d7038e"></a><!-- doxytag: member="tbb::task_list::interface5::internal::task_base" ref="81d0122aee4ddae419a743ee50d7038e" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface5::internal::task_base</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<template< typename T > class Allocator><br>
- class tbb::zero_allocator< void, Allocator ></h3>
-
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+A list of children.
+<p>
+Used for method task::spawn_children
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00634.html">tbb_allocator.h</a></ul>
+<li>task.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00342.html b/doc/html/a00355.html
similarity index 68%
copy from doc/html/a00342.html
copy to doc/html/a00355.html
index d4ca23f..db3ac06 100644
--- a/doc/html/a00342.html
+++ b/doc/html/a00355.html
@@ -21,86 +21,57 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00342.html">task_scheduler_init</a></div>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00355.html">task_scheduler_init</a></div>
<h1>tbb::task_scheduler_init Class Reference<br>
<small>
-[<a class="el" href="a00431.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00446.html">Task Scheduling</a>]</small>
</h1><!-- doxytag: class="tbb::task_scheduler_init" -->Class delimiting the scope of task scheduler activity.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00630.html">task_scheduler_init.h</a>></code>
+<code>#include <task_scheduler_init.h></code>
<p>
-<a href="a00142.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00145.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00355.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00355.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Ensure that scheduler exists for this thread. <a href="#d476053cc712e572554823492a5229ce"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a> (int number_of_threads, stack_size_type thread_stack_size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00355.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a> (int number_of_threads, stack_size_type thread_stack_size)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">The overloaded method with stack size parameter. <a href="#d5ed214a8bb53b0466ed91ff4734b9a3"></a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f73257e04cb7fb9bd5be2b635d9016f1"></a><!-- doxytag: member="tbb::task_scheduler_init::terminate" ref="f73257e04cb7fb9bd5be2b635d9016f1" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a> ()</td></tr>
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00355.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Inverse of method initialize. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="421600bf9bf9338bcf937063f2ff0e90"></a><!-- doxytag: member="tbb::task_scheduler_init::task_scheduler_init" ref="421600bf9bf9338bcf937063f2ff0e90" args="(int number_of_threads=automatic, stack_size_type thread_stack_size=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5dbd23c83603b3b09dffa7982112cc95"></a><!-- doxytag: member="tbb::task_scheduler_init::task_scheduler_init" ref="5dbd23c83603b3b09dffa7982112cc95" args="(int number_of_threads=automatic, stack_size_type thread_stack_size=0, bool wait_workers_in_terminate=false) task_scheduler_init(int number_of_threads" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00355.html#5dbd23c83603b3b09dffa7982112cc95">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00355.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0, bool wait_workers_in_terminate=false) <a class="el" href="a00355.html">task_scheduler_init</a>(int number_of_threads</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Shorthand for default constructor followed by call to initialize(number_of_threads). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4da6c86292d80c703a66c1f6f5299488"></a><!-- doxytag: member="tbb::task_scheduler_init::~task_scheduler_init" ref="4da6c86292d80c703a66c1f6f5299488" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy scheduler for this thread if thread has no other live task_scheduler_inits. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="12752282977029f23416642bc03e8b74"></a><!-- doxytag: member="tbb::task_scheduler_init::is_active" ref="12752282977029f23416642bc03e8b74" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#12752282977029f23416642bc03e8b74">is_active</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00355.html#12752282977029f23416642bc03e8b74">is_active</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if scheduler is active (initialized); false otherwise. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">stack_size_type </td><td class="memItemRight" valign="bottom"><b>thread_stack_size</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the number of threads TBB scheduler would create if initialized by default. <a href="#ba00714c33a41a3c2216f48613971cab"></a><br></td></tr>
<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f5988e2b0fbb2d533fcbb7f2583743f"></a><!-- doxytag: member="tbb::task_scheduler_init::automatic" ref="8f5988e2b0fbb2d533fcbb7f2583743f" args="" -->
-static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1</td></tr>
+static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00355.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Typedef for number of threads that is automatic. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e6c860f1e559026ff3ef4599c0d6c514"></a><!-- doxytag: member="tbb::task_scheduler_init::deferred" ref="e6c860f1e559026ff3ef4599c0d6c514" args="" -->
-static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
+static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00355.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00342.html#d476053cc712e572554823492a5229ce">initialize()</a> or constructor that causes initialization to be deferred. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00355.html#d476053cc712e572554823492a5229ce">initialize()</a> or constructor that causes initialization to be deferred. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
Class delimiting the scope of task scheduler activity.
<p>
-A thread can construct a <a class="el" href="a00342.html">task_scheduler_init</a> object and keep it alive while it uses TBB's tasking subsystem (including parallel algorithms).<p>
+A thread can construct a <a class="el" href="a00355.html">task_scheduler_init</a> object and keep it alive while it uses TBB's tasking subsystem (including parallel algorithms).<p>
This class allows to customize properties of the TBB task pool to some extent. For example it can limit concurrency level of parallel work initiated by the given thread. It also can be used to specify stack size of the TBB worker threads, though this setting is not effective if the thread pool has already been created.<p>
-If a parallel construct is used without <a class="el" href="a00342.html">task_scheduler_init</a> object previously created, the scheduler will be initialized automatically with default settings, and will persist until this thread exits. Default concurrency level is defined as described in <a class="el" href="a00342.html#d476053cc712e572554823492a5229ce">task_scheduler_init::initialize()</a>.
+If a parallel construct is used without <a class="el" href="a00355.html">task_scheduler_init</a> object previously created, the scheduler will be initialized automatically with default settings, and will persist until this thread exits. Default concurrency level is defined as described in <a class="el" href="a00355.html#d476053cc712e572554823492a5229ce">task_scheduler_init::initialize()</a>.
<p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="ba00714c33a41a3c2216f48613971cab"></a><!-- doxytag: member="tbb::task_scheduler_init::default_num_threads" ref="ba00714c33a41a3c2216f48613971cab" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static int __TBB_EXPORTED_FUNC tbb::task_scheduler_init::default_num_threads </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the number of threads TBB scheduler would create if initialized by default.
-<p>
-Result returned by this method does not depend on whether the scheduler has already been initialized.<p>
-Because tbb 2.0 does not support blocking tasks yet, you may use this method to boost the number of threads in the tbb's internal pool, if your tasks are doing I/O operations. The optimal number of additional threads depends on how much time your tasks spend in the blocked state.<p>
-Before TBB 3.0 U4 this method returned the number of logical CPU in the system. Currently on Windows, Linux and FreeBSD it returns the number of logical CPUs available to the current process in accordance with its affinity mask.<p>
-NOTE: The return value of this method never changes after its first invocation. This means that changes in the process affinity mask that took place after this method was first invoked will not affect the number of worker threads in the TBB worker threads pool.
-</div>
-</div><p>
<a class="anchor" name="d5ed214a8bb53b0466ed91ff4734b9a3"></a><!-- doxytag: member="tbb::task_scheduler_init::initialize" ref="d5ed214a8bb53b0466ed91ff4734b9a3" args="(int number_of_threads, stack_size_type thread_stack_size)" -->
<div class="memitem">
<div class="memproto">
@@ -140,7 +111,7 @@ Overloading is necessary to preserve ABI compatibility
<td class="memname">void __TBB_EXPORTED_METHOD tbb::task_scheduler_init::initialize </td>
<td>(</td>
<td class="paramtype">int </td>
- <td class="paramname"> <em>number_of_threads</em> = <code><a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code> </td>
+ <td class="paramname"> <em>number_of_threads</em> = <code><a class="el" href="a00355.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code> </td>
<td> ) </td>
<td width="100%"></td>
</tr>
@@ -155,11 +126,57 @@ A value of -1 lets TBB decide on the number of threads, which is usually maximal
The number_of_threads is ignored if any other task_scheduler_inits currently exist. A thread may construct multiple task_scheduler_inits. Doing so does no harm because the underlying scheduler is reference counted.
</div>
</div><p>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="474d030bbceb4929ca7084eeab598f2b"></a><!-- doxytag: member="tbb::task_scheduler_init::thread_stack_size" ref="474d030bbceb4929ca7084eeab598f2b" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">stack_size_type tbb::task_scheduler_init::thread_stack_size </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<b>Initial value:</b><div class="fragment"><pre class="fragment">0 )
+#endif
+ : my_scheduler(NULL) {
+
+
+
+
+
+
+
+ __TBB_ASSERT( !(thread_stack_size & propagation_mode_mask), <span class="stringliteral">"Requested stack size is not aligned"</span> );
+<span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
+<span class="preprocessor"></span> thread_stack_size |= TBB_USE_CAPTURED_EXCEPTION ? propagation_mode_captured : propagation_mode_exact;
+<span class="preprocessor">#endif </span>
+<span class="preprocessor"></span><span class="preprocessor">#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE</span>
+<span class="preprocessor"></span> <span class="keywordflow">if</span> (wait_workers_in_terminate)
+ my_scheduler = (internal::scheduler*)wait_workers_in_terminate_flag;
+<span class="preprocessor">#endif</span>
+<span class="preprocessor"></span> <a class="code" href="a00355.html#d476053cc712e572554823492a5229ce">initialize</a>( number_of_threads, thread_stack_size );
+ }
+
+
+ ~<a class="code" href="a00355.html#5dbd23c83603b3b09dffa7982112cc95">task_scheduler_init</a>() {
+ <span class="keywordflow">if</span>( my_scheduler )
+ <a class="code" href="a00355.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
+ internal::poison_pointer( my_scheduler );
+ }
+
+
+ <span class="keyword">static</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC default_num_threads ()
+</pre></div>
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00630.html">task_scheduler_init.h</a></ul>
+<li>task_scheduler_init.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00343.html b/doc/html/a00356.html
similarity index 88%
copy from doc/html/a00343.html
copy to doc/html/a00356.html
index 880528b..5332681 100644
--- a/doc/html/a00343.html
+++ b/doc/html/a00356.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00343.html">tbb_allocator</a></div>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00356.html">tbb_allocator</a></div>
<h1>tbb::tbb_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::tbb_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00634.html">tbb_allocator.h</a>></code>
+<code>#include <tbb_allocator.h></code>
<p>
-<a href="a00144.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00148.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3cdd9619bc0a802763e7823068f83a4c"></a><!-- doxytag: member="tbb::tbb_allocator::value_type" ref="3cdd9619bc0a802763e7823068f83a4c" args="" -->
@@ -61,18 +61,18 @@ typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>differen
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf"></a><!-- doxytag: member="tbb::tbb_allocator::standard" ref="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf" args="" -->
</td><td class="memItemRight" valign="bottom"><b>standard</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> { <b>scalable</b>,
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00356.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> { <b>scalable</b>,
<b>standard</b>
}</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies current allocator. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d85cd071047b52eeb207d458d54098cc"></a><!-- doxytag: member="tbb::tbb_allocator::tbb_allocator" ref="d85cd071047b52eeb207d458d54098cc" args="(const tbb_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00343.html">tbb_allocator</a> &) throw ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00356.html">tbb_allocator</a> &) throw ()</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5c3cb04a50d15d38f4c66ca3e5d2f6af"></a><!-- doxytag: member="tbb::tbb_allocator::tbb_allocator" ref="5c3cb04a50d15d38f4c66ca3e5d2f6af" args="(const tbb_allocator< U > &)" -->
template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00343.html">tbb_allocator</a>< U > &) throw ()</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00356.html">tbb_allocator</a>< U > &) throw ()</td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="08d3822344271d0a1c2e64e8c9c16b58"></a><!-- doxytag: member="tbb::tbb_allocator::address" ref="08d3822344271d0a1c2e64e8c9c16b58" args="(reference x) const " -->
pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
@@ -81,20 +81,20 @@ pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (refer
const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6cb487b1bdce0b581f265a77dca6d53"></a><!-- doxytag: member="tbb::tbb_allocator::allocate" ref="f6cb487b1bdce0b581f265a77dca6d53" args="(size_type n, const void *=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a> (size_type n, const void *=0)</td></tr>
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00356.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a> (size_type n, const void *=0)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdd011fdf2f9ad07006dc7c0a7ec1da2"></a><!-- doxytag: member="tbb::tbb_allocator::deallocate" ref="fdd011fdf2f9ad07006dc7c0a7ec1da2" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a> (pointer p, size_type)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00356.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a> (pointer p, size_type)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f059ca2c96243024f0d562ee3a87a3a5"></a><!-- doxytag: member="tbb::tbb_allocator::max_size" ref="f059ca2c96243024f0d562ee3a87a3a5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a> () const throw ()</td></tr>
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00356.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a> () const throw ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="15c431ccb5ccc5a30e5d496edad4c143"></a><!-- doxytag: member="tbb::tbb_allocator::construct" ref="15c431ccb5ccc5a30e5d496edad4c143" args="(pointer p, Args &&...args)" -->
-template<typename... Args> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00343.html#15c431ccb5ccc5a30e5d496edad4c143">construct</a> (pointer p, Args &&...args)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="3999cb92a8b6a995b65ee9ae5c31751f"></a><!-- doxytag: member="tbb::tbb_allocator::construct" ref="3999cb92a8b6a995b65ee9ae5c31751f" args="(U *p, Args &&...args)" -->
+template<typename U, typename... Args> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00356.html#3999cb92a8b6a995b65ee9ae5c31751f">construct</a> (U *p, Args &&...args)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
@@ -110,10 +110,10 @@ Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
The class selects the best memory allocation mechanism available from scalable_malloc and standard malloc. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00634.html">tbb_allocator.h</a></ul>
+<li>tbb_allocator.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00344.html b/doc/html/a00357.html
similarity index 87%
copy from doc/html/a00344.html
copy to doc/html/a00357.html
index e070fb6..c4c5d6e 100644
--- a/doc/html/a00344.html
+++ b/doc/html/a00357.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00344.html">tbb_allocator< void ></a></div>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00357.html">tbb_allocator< void ></a></div>
<h1>tbb::tbb_allocator< void > Class Template Reference<br>
<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::tbb_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00634.html">tbb_allocator.h</a>></code>
+<code>#include <tbb_allocator.h></code>
<p>
-<a href="a00146.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00150.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05f5ff584890407c8d672e4b4378744d"></a><!-- doxytag: member="tbb::tbb_allocator< void >::pointer" ref="05f5ff584890407c8d672e4b4378744d" args="" -->
@@ -53,10 +53,10 @@ typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b
Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00634.html">tbb_allocator.h</a></ul>
+<li>tbb_allocator.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00345.html b/doc/html/a00358.html
similarity index 81%
copy from doc/html/a00345.html
copy to doc/html/a00358.html
index 00bdd33..d88bd74 100644
--- a/doc/html/a00345.html
+++ b/doc/html/a00358.html
@@ -21,48 +21,48 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00345.html">tbb_exception</a></div>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00358.html">tbb_exception</a></div>
<h1>tbb::tbb_exception Class Reference</h1><!-- doxytag: class="tbb::tbb_exception" -->Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <tbb_exception.h></code>
<p>
<p>Inheritance diagram for tbb::tbb_exception:
-<p><center><img src="a00345.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
+<p><center><img src="a00358.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
<map name="tbb::tbb_exception_map">
-<area href="a00266.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
-<area href="a00299.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
+<area href="a00278.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
+<area href="a00311.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
</map>
-<a href="a00157.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00161.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00345.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0 throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00358.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0 throw ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object. <a href="#3e3482bf264d4ca4dde046cd9c02c766"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> ()=0 throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00358.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> ()=0 throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method. <a href="#66c94938eca8bf88b76f3eccaaf215d8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> ()=0</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method. <a href="#66c94938eca8bf88b76f3eccaaf215d8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00358.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> ()=0</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object. <a href="#8588e07fa49692f4d734e4f2e4f048f4"></a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d00f6497e552fee978a02bfcbebf46e2"></a><!-- doxytag: member="tbb::tbb_exception::name" ref="d00f6497e552fee978a02bfcbebf46e2" args="() const =0" -->
-virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0 throw ()</td></tr>
+virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00358.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0 throw ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8157689ecb66bc6c72d3618bf3cc371"></a><!-- doxytag: member="tbb::tbb_exception::what" ref="e8157689ecb66bc6c72d3618bf3cc371" args="() const =0" -->
-virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0 throw ()</td></tr>
+virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00358.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0 throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00345.html#e8157689ecb66bc6c72d3618bf3cc371">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a> (void *p)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00358.html#e8157689ecb66bc6c72d3618bf3cc371">what()</a> method. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00358.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a> (void *p)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.
<p>
-If an unhandled exception of the type derived from <a class="el" href="a00345.html">tbb::tbb_exception</a> is intercepted by the TBB scheduler in one of the worker threads, it is delivered to and re-thrown in the root thread. The root thread is the thread that has started the outermost algorithm or root task sharing the same <a class="el" href="a00340.html">task_group_context</a> with the guilty algorithm/task (the one that threw the exception first).<p>
+If an unhandled exception of the type derived from <a class="el" href="a00358.html">tbb::tbb_exception</a> is intercepted by the TBB scheduler in one of the worker threads, it is delivered to and re-thrown in the root thread. The root thread is the thread that has started the outermost algorithm or root task sharing the same <a class="el" href="a00352.html">task_group_context</a> with the guilty algorithm/task (the one that threw the exception first).<p>
Note: when documentation mentions workers with respect to exception handling, masters are implied as well, because they are completely equivalent in this context. Consequently a root thread can be master or worker thread.<p>
NOTE: In case of nested algorithms or complex task hierarchies when the nested levels share (explicitly or by means of implicit inheritance) the task group context of the outermost level, the exception may be (re-)thrown multiple times (ultimately - in each worker on each nesting level) before reaching the root thread at the outermost level. IMPORTANT: if you intercept an exception derived from this class on a nested level, you must re-throw it in the catch block by means of the "throw;" [...]
-TBB provides two implementations of this interface: <a class="el" href="a00266.html">tbb::captured_exception</a> and template class <a class="el" href="a00299.html">tbb::movable_exception</a>. See their declarations for more info.
+TBB provides two implementations of this interface: <a class="el" href="a00278.html">tbb::captured_exception</a> and template class <a class="el" href="a00311.html">tbb::movable_exception</a>. See their declarations for more info.
<p>
<hr><h2>Member Function Documentation</h2>
<a class="anchor" name="66c94938eca8bf88b76f3eccaaf215d8"></a><!-- doxytag: member="tbb::tbb_exception::destroy" ref="66c94938eca8bf88b76f3eccaaf215d8" args="()=0" -->
@@ -81,11 +81,11 @@ TBB provides two implementations of this interface: <a class="el" href="a00266.h
<div class="memdoc">
<p>
-Destroys objects created by the <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method.
+Destroys objects created by the <a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method.
<p>
Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
<p>
-Implemented in <a class="el" href="a00266.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00299.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00278.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00311.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
</div>
</div><p>
<a class="anchor" name="3e3482bf264d4ca4dde046cd9c02c766"></a><!-- doxytag: member="tbb::tbb_exception::move" ref="3e3482bf264d4ca4dde046cd9c02c766" args="()=0" -->
@@ -93,7 +93,7 @@ Implemented in <a class="el" href="a00266.html#93d875d3555502ff6f18513525de204c"
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">virtual <a class="el" href="a00345.html">tbb_exception</a>* tbb::tbb_exception::move </td>
+ <td class="memname">virtual <a class="el" href="a00358.html">tbb_exception</a>* tbb::tbb_exception::move </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
@@ -108,7 +108,7 @@ Creates and returns pointer to the deep copy of this exception object.
<p>
Move semantics is allowed.
<p>
-Implemented in <a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00278.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00311.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
</div>
</div><p>
<a class="anchor" name="3f2da7f3d8a6e4c1df522af1213afb5a"></a><!-- doxytag: member="tbb::tbb_exception::operator delete" ref="3f2da7f3d8a6e4c1df522af1213afb5a" args="(void *p)" -->
@@ -128,8 +128,8 @@ Implemented in <a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f"
<div class="memdoc">
<p>
-Operator delete is provided only to allow using existing smart pointers with TBB exception objects obtained as the result of applying <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
-When overriding method <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> make sure to override operator delete as well if memory is allocated not by TBB's scalable allocator.
+Operator delete is provided only to allow using existing smart pointers with TBB exception objects obtained as the result of applying <a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
+When overriding method <a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> make sure to override operator delete as well if memory is allocated not by TBB's scalable allocator.
</div>
</div><p>
<a class="anchor" name="8588e07fa49692f4d734e4f2e4f048f4"></a><!-- doxytag: member="tbb::tbb_exception::throw_self" ref="8588e07fa49692f4d734e4f2e4f048f4" args="()=0" -->
@@ -152,14 +152,14 @@ Throws this exception object.
<p>
Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
<p>
-Implemented in <a class="el" href="a00266.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00299.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00278.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00311.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li>tbb_exception.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00345.png b/doc/html/a00358.png
similarity index 100%
rename from doc/html/a00345.png
rename to doc/html/a00358.png
diff --git a/doc/html/a00346.html b/doc/html/a00359.html
similarity index 84%
copy from doc/html/a00346.html
copy to doc/html/a00359.html
index 0834f10..4f8e869 100644
--- a/doc/html/a00346.html
+++ b/doc/html/a00359.html
@@ -21,31 +21,31 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>internal</b>::<a class="el" href="a00346.html">tbb_exception_ptr</a></div>
+<a class="el" href="a00428.html">tbb</a>::<b>internal</b>::<a class="el" href="a00359.html">tbb_exception_ptr</a></div>
<h1>tbb::internal::tbb_exception_ptr Class Reference</h1><!-- doxytag: class="tbb::internal::tbb_exception_ptr" -->Exception container that preserves the exact copy of the original exception.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <tbb_exception.h></code>
<p>
-<a href="a00160.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00164.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00359.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () throw ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys this objects. <a href="#921875bbacd2c8a5f324c7da7a415262"></a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="292832fd5c523e3d8081a22247840a1d"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::throw_self" ref="292832fd5c523e3d8081a22247840a1d" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00359.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws the contained exception . <br></td></tr>
<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="65083750bebe799d3fe8143c794523bb"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="65083750bebe799d3fe8143c794523bb" args="()" -->
-static <a class="el" href="a00346.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> ()</td></tr>
+static <a class="el" href="a00359.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> ()</td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1111b00ba54b7fe35e6d3a0f21de287"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="d1111b00ba54b7fe35e6d3a0f21de287" args="(const tbb_exception &tag)" -->
-static <a class="el" href="a00346.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00345.html">tbb_exception</a> &tag)</td></tr>
+static <a class="el" href="a00359.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00358.html">tbb_exception</a> &tag)</td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c35e5db8e9cdff5d1387db5b0bad2e4a"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="c35e5db8e9cdff5d1387db5b0bad2e4a" args="(captured_exception &src)" -->
-static <a class="el" href="a00346.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00346.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00266.html">captured_exception</a> &src)</td></tr>
+static <a class="el" href="a00359.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00359.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00278.html">captured_exception</a> &src)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">This overload uses move semantics (i.e. it empties src). <br></td></tr>
</table>
@@ -77,10 +77,10 @@ Note that objects of this type can be created only by the allocate() method.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li>tbb_exception.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00254.html b/doc/html/a00360.html
similarity index 53%
rename from doc/html/a00254.html
rename to doc/html/a00360.html
index 5acb7a9..3550e05 100644
--- a/doc/html/a00254.html
+++ b/doc/html/a00360.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::atomic< T > Struct Template Reference</title>
+<title>tbb::tbb_hash_compare< Key > Struct Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,38 +21,33 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00254.html">atomic</a></div>
-<h1>tbb::atomic< T > Struct Template Reference<br>
-<small>
-[<a class="el" href="a00429.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::atomic" -->Primary template for atomic.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00360.html">tbb_hash_compare</a></div>
+<h1>tbb::tbb_hash_compare< Key > Struct Template Reference</h1><!-- doxytag: class="tbb::tbb_hash_compare" -->hash_compare that is default argument for concurrent_hash_map
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00441.html">atomic.h</a>></code>
+<code>#include <concurrent_hash_map.h></code>
<p>
-<a href="a00008.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00018.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e29e03a31436bad5eb1aa5a9d46a2da"></a><!-- doxytag: member="tbb::atomic::operator=" ref="1e29e03a31436bad5eb1aa5a9d46a2da" args="(T rhs)" -->
-T </td><td class="memItemRight" valign="bottom"><b>operator=</b> (T rhs)</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c35d106ad65aa6ca5ba9008c1c86f80d"></a><!-- doxytag: member="tbb::tbb_hash_compare::hash" ref="c35d106ad65aa6ca5ba9008c1c86f80d" args="(const Key &a)" -->
+static size_t </td><td class="memItemRight" valign="bottom"><b>hash</b> (const Key &a)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90791297d59b1659cfaf0d93c7cc59ae"></a><!-- doxytag: member="tbb::atomic::operator=" ref="90791297d59b1659cfaf0d93c7cc59ae" args="(const atomic< T > &rhs)" -->
-<a class="el" href="a00254.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00254.html">atomic</a>< T > &rhs)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b4d302049aabea046e392ddfad8b3f06"></a><!-- doxytag: member="tbb::tbb_hash_compare::equal" ref="b4d302049aabea046e392ddfad8b3f06" args="(const Key &a, const Key &b)" -->
+static bool </td><td class="memItemRight" valign="bottom"><b>equal</b> (const Key &a, const Key &b)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- struct tbb::atomic< T ></h3>
+<h3>template<typename Key><br>
+ struct tbb::tbb_hash_compare< Key ></h3>
-Primary template for atomic.
-<p>
-See the Reference for details.
+hash_compare that is default argument for concurrent_hash_map
<p>
<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00441.html">atomic.h</a></ul>
+<li>concurrent_hash_map.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00348.html b/doc/html/a00361.html
similarity index 90%
copy from doc/html/a00348.html
copy to doc/html/a00361.html
index 16f0a1b..b2aef1b 100644
--- a/doc/html/a00348.html
+++ b/doc/html/a00361.html
@@ -21,21 +21,21 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00348.html">thread_bound_filter</a></div>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00361.html">thread_bound_filter</a></div>
<h1>tbb::thread_bound_filter Class Reference<br>
<small>
-[<a class="el" href="a00426.html">Algorithms</a>]</small>
+[<a class="el" href="a00441.html">Algorithms</a>]</small>
</h1><!-- doxytag: class="tbb::thread_bound_filter" --><!-- doxytag: inherits="tbb::filter" -->A stage in a pipeline served by a user thread.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00587.html">pipeline.h</a>></code>
+<code>#include <pipeline.h></code>
<p>
<p>Inheritance diagram for tbb::thread_bound_filter:
-<p><center><img src="a00348.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
+<p><center><img src="a00361.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
<map name="tbb::thread_bound_filter_map">
-<area href="a00282.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
+<area href="a00294.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
</map>
-<a href="a00106.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00108.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23"></a><!-- doxytag: member="tbb::thread_bound_filter::success" ref="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23" args="" -->
@@ -53,10 +53,10 @@
}</td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00348.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00361.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">If a data item is available, invoke operator() on that item. <a href="#c4f90f2c771bce748beb9be734fa286c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00348.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00361.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Wait until a data item becomes available, and invoke operator() on that item. <a href="#5e726bdc7fbd924c0b07bd558b1d4d5d"></a><br></td></tr>
<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
@@ -111,10 +111,10 @@ This interface is non-blocking. Returns 'success' if an item was processed. Retu
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00587.html">pipeline.h</a></ul>
+<li>pipeline.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00348.png b/doc/html/a00361.png
similarity index 100%
copy from doc/html/a00348.png
copy to doc/html/a00361.png
diff --git a/doc/html/a00349.html b/doc/html/a00362.html
similarity index 71%
copy from doc/html/a00349.html
copy to doc/html/a00362.html
index e18a148..92139ca 100644
--- a/doc/html/a00349.html
+++ b/doc/html/a00362.html
@@ -21,45 +21,49 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00349.html">tick_count</a></div>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00362.html">tick_count</a></div>
<h1>tbb::tick_count Class Reference<br>
<small>
-[<a class="el" href="a00430.html">Timing</a>]</small>
+[<a class="el" href="a00445.html">Timing</a>]</small>
</h1><!-- doxytag: class="tbb::tick_count" -->Absolute timestamp.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00665.html">tick_count.h</a>></code>
+<code>#include <tick_count.h></code>
<p>
-<a href="a00183.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00188.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34593326ae4191e02a13c7cbdab9de4c"></a><!-- doxytag: member="tbb::tick_count::tick_count" ref="34593326ae4191e02a13c7cbdab9de4c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct an absolute timestamp initialized to zero. <br></td></tr>
<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb7f78ca61cf28398645ace66e284473"></a><!-- doxytag: member="tbb::tick_count::now" ref="fb7f78ca61cf28398645ace66e284473" args="()" -->
-static <a class="el" href="a00349.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</td></tr>
+static <a class="el" href="a00362.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Return current time. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8aaa5ac47975a1b0fa3e95752281159e"></a><!-- doxytag: member="tbb::tick_count::resolution" ref="8aaa5ac47975a1b0fa3e95752281159e" args="()" -->
+static double </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#8aaa5ac47975a1b0fa3e95752281159e">resolution</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the resolution of the clock in seconds per tick. <br></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09dde78a4100800c11bb883d6204b586"></a><!-- doxytag: member="tbb::tick_count::operator-" ref="09dde78a4100800c11bb883d6204b586" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00350.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00349.html">tick_count</a> &t1, const <a class="el" href="a00349.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00363.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00362.html">tick_count</a> &t1, const <a class="el" href="a00362.html">tick_count</a> &t0)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two timestamps to get the time interval between. <br></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html">interval_t</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html">interval_t</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval. <a href="a00350.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval. <a href="a00363.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
Absolute timestamp.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00665.html">tick_count.h</a></ul>
+<li>tick_count.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00350.html b/doc/html/a00363.html
similarity index 76%
copy from doc/html/a00350.html
copy to doc/html/a00363.html
index 2832a20..be9d6cc 100644
--- a/doc/html/a00350.html
+++ b/doc/html/a00363.html
@@ -21,49 +21,49 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00349.html">tick_count</a>::<a class="el" href="a00350.html">interval_t</a></div>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00362.html">tick_count</a>::<a class="el" href="a00363.html">interval_t</a></div>
<h1>tbb::tick_count::interval_t Class Reference</h1><!-- doxytag: class="tbb::tick_count::interval_t" -->Relative time interval.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00665.html">tick_count.h</a>></code>
+<code>#include <tick_count.h></code>
<p>
-<a href="a00184.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00189.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="75a9a0949f8a8a84d6758835f1b48dad"></a><!-- doxytag: member="tbb::tick_count::interval_t::interval_t" ref="75a9a0949f8a8a84d6758835f1b48dad" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct a time interval representing zero time duration. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1a21a428e00cced2e6a49e0f5f2258bf"></a><!-- doxytag: member="tbb::tick_count::interval_t::interval_t" ref="1a21a428e00cced2e6a49e0f5f2258bf" args="(double sec)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a> (double sec)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a> (double sec)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct a time interval representing sec seconds time duration. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5d8429c0bc59cf6131b2abc7929fa59"></a><!-- doxytag: member="tbb::tick_count::interval_t::seconds" ref="d5d8429c0bc59cf6131b2abc7929fa59" args="() const " -->
-double </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a> () const </td></tr>
+double </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the length of a time interval in seconds. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd9814947902e26463a69a111530f81b"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator+=" ref="cd9814947902e26463a69a111530f81b" args="(const interval_t &i)" -->
-<a class="el" href="a00350.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00350.html">interval_t</a> &i)</td></tr>
+<a class="el" href="a00363.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00363.html">interval_t</a> &i)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Accumulation operator. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35ff7eaf7c2031b4a991402ac9ecb940"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-=" ref="35ff7eaf7c2031b4a991402ac9ecb940" args="(const interval_t &i)" -->
-<a class="el" href="a00350.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00350.html">interval_t</a> &i)</td></tr>
+<a class="el" href="a00363.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00363.html">interval_t</a> &i)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtraction operator. <br></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cc3a7ad7000317951ce61f706163efe8"></a><!-- doxytag: member="tbb::tick_count::interval_t::tbb::tick_count" ref="cc3a7ad7000317951ce61f706163efe8" args="" -->
-class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#cc3a7ad7000317951ce61f706163efe8">tbb::tick_count</a></td></tr>
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html#cc3a7ad7000317951ce61f706163efe8">tbb::tick_count</a></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09dde78a4100800c11bb883d6204b586"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-" ref="09dde78a4100800c11bb883d6204b586" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00350.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00349.html">tick_count</a> &t1, const <a class="el" href="a00349.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00363.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00362.html">tick_count</a> &t1, const <a class="el" href="a00362.html">tick_count</a> &t0)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Extract the intervals from the tick_counts and subtract them. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5871ead1ca230efbe52a5008470e6428"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator+" ref="5871ead1ca230efbe52a5008470e6428" args="(const interval_t &i, const interval_t &j)" -->
-<a class="el" href="a00350.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00350.html">interval_t</a> &i, const <a class="el" href="a00350.html">interval_t</a> &j)</td></tr>
+<a class="el" href="a00363.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00363.html">interval_t</a> &i, const <a class="el" href="a00363.html">interval_t</a> &j)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Add two intervals. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa509691e1d689830931e36edd274f76"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-" ref="fa509691e1d689830931e36edd274f76" args="(const interval_t &i, const interval_t &j)" -->
-<a class="el" href="a00350.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00350.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00350.html">interval_t</a> &i, const <a class="el" href="a00350.html">interval_t</a> &j)</td></tr>
+<a class="el" href="a00363.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00363.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00363.html">interval_t</a> &i, const <a class="el" href="a00363.html">interval_t</a> &j)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two intervals. <br></td></tr>
</table>
@@ -71,10 +71,10 @@ class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00
Relative time interval.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00665.html">tick_count.h</a></ul>
+<li>tick_count.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00258.html b/doc/html/a00364.html
similarity index 70%
rename from doc/html/a00258.html
rename to doc/html/a00364.html
index 86ac2f2..f8bcd27 100644
--- a/doc/html/a00258.html
+++ b/doc/html/a00364.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::bad_last_alloc Class Reference</title>
+<title>tbb::user_abort Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,27 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00258.html">bad_last_alloc</a></div>
-<h1>tbb::bad_last_alloc Class Reference</h1><!-- doxytag: class="tbb::bad_last_alloc" -->Exception for concurrent containers.
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00364.html">user_abort</a></div>
+<h1>tbb::user_abort Class Reference</h1><!-- doxytag: class="tbb::user_abort" -->Exception for user-initiated abort.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00639.html">tbb_exception.h</a>></code>
+<code>#include <tbb_exception.h></code>
<p>
-<a href="a00152.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00158.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec7a57742ff4dc214266179d88984015"></a><!-- doxytag: member="tbb::bad_last_alloc::what" ref="ec7a57742ff4dc214266179d88984015" args="() const " -->
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="989461aff2934fede08b969ed4bf4e16"></a><!-- doxytag: member="tbb::user_abort::what" ref="989461aff2934fede08b969ed4bf4e16" args="() const " -->
const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for concurrent containers.
+Exception for user-initiated abort.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00639.html">tbb_exception.h</a></ul>
+<li>tbb_exception.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00352.html b/doc/html/a00365.html
similarity index 87%
rename from doc/html/a00352.html
rename to doc/html/a00365.html
index 8b990af..90dc38d 100644
--- a/doc/html/a00352.html
+++ b/doc/html/a00365.html
@@ -21,13 +21,13 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<b>internal</b>::<a class="el" href="a00352.html">work_around_alignment_bug</a></div>
+<a class="el" href="a00428.html">tbb</a>::<b>internal</b>::<a class="el" href="a00365.html">work_around_alignment_bug</a></div>
<h1>tbb::internal::work_around_alignment_bug< Size, T > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::work_around_alignment_bug" -->Work around for bug in GNU 3.2 and MSVC compilers.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00640.html">tbb_machine.h</a>></code>
+<code>#include <tbb_machine.h></code>
<p>
-<a href="a00179.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00183.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14283941aefd819871be2f5e24f5cb37"></a><!-- doxytag: member="tbb::internal::work_around_alignment_bug::alignment" ref="14283941aefd819871be2f5e24f5cb37" args="" -->
@@ -43,10 +43,10 @@ Work around for bug in GNU 3.2 and MSVC compilers.
Bug is that compiler sometimes returns 0 for __alignof(T) when T has not yet been instantiated. The work-around forces instantiation by forcing computation of sizeof(T) before __alignof(T).
<p>
<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00640.html">tbb_machine.h</a></ul>
+<li>tbb_machine.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00353.html b/doc/html/a00366.html
similarity index 92%
copy from doc/html/a00353.html
copy to doc/html/a00366.html
index 4374787..bf1fc56 100644
--- a/doc/html/a00353.html
+++ b/doc/html/a00366.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00353.html">zero_allocator</a></div>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00366.html">zero_allocator</a></div>
<h1>tbb::zero_allocator< T, Allocator > Class Template Reference<br>
<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::zero_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00634.html">tbb_allocator.h</a>></code>
+<code>#include <tbb_allocator.h></code>
<p>
-<a href="a00148.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00152.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77c87446a645cc3dbeba6fc82cc7eec0"></a><!-- doxytag: member="tbb::zero_allocator::base_allocator_type" ref="77c87446a645cc3dbeba6fc82cc7eec0" args="" -->
@@ -59,11 +59,11 @@ typedef base_allocator_type::difference_type </td><td class="memItemRight"
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c48c0436e3239be8f07c53c7f6658e4"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="8c48c0436e3239be8f07c53c7f6658e4" args="(const zero_allocator &a)" -->
- </td><td class="memItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00353.html">zero_allocator</a> &a) throw ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00366.html">zero_allocator</a> &a) throw ()</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="67685c1cfcd3b5f81ac8f3c8dd1375b9"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="67685c1cfcd3b5f81ac8f3c8dd1375b9" args="(const zero_allocator< U > &a)" -->
template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00353.html">zero_allocator</a>< U > &a) throw ()</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00366.html">zero_allocator</a>< U > &a) throw ()</td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b6e7eb50d9faeca418d56a9758357377"></a><!-- doxytag: member="tbb::zero_allocator::allocate" ref="b6e7eb50d9faeca418d56a9758357377" args="(const size_type n, const void *hint=0)" -->
pointer </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const size_type n, const void *hint=0)</td></tr>
@@ -81,10 +81,10 @@ Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
The class is an adapter over an actual allocator that fills the allocation using memset function with template argument C as the value. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00634.html">tbb_allocator.h</a></ul>
+<li>tbb_allocator.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00354.html b/doc/html/a00367.html
similarity index 89%
copy from doc/html/a00354.html
copy to doc/html/a00367.html
index 787fc5f..75b1fef 100644
--- a/doc/html/a00354.html
+++ b/doc/html/a00367.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00414.html">tbb</a>::<a class="el" href="a00354.html">zero_allocator< void, Allocator ></a></div>
+<a class="el" href="a00428.html">tbb</a>::<a class="el" href="a00367.html">zero_allocator< void, Allocator ></a></div>
<h1>tbb::zero_allocator< void, Allocator > Class Template Reference<br>
<small>
-[<a class="el" href="a00428.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00443.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::zero_allocator< void, Allocator >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00634.html">tbb_allocator.h</a>></code>
+<code>#include <tbb_allocator.h></code>
<p>
-<a href="a00150.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00154.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce4f3bf06e8aaf8020fa443297eff5f7"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::base_allocator_type" ref="ce4f3bf06e8aaf8020fa443297eff5f7" args="" -->
@@ -56,10 +56,10 @@ typedef base_allocator_type::const_pointer </td><td class="memItemRight" va
Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00634.html">tbb_allocator.h</a></ul>
+<li>tbb_allocator.h</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00372.html b/doc/html/a00385.html
similarity index 76%
rename from doc/html/a00372.html
rename to doc/html/a00385.html
index d818ad2..e2d13a2 100644
--- a/doc/html/a00372.html
+++ b/doc/html/a00385.html
@@ -21,92 +21,92 @@
</ul></div>
<h1>flow_graph.h File Reference</h1>The graph related classes and functions. <a href="#_details">More...</a>
<p>
-
-<p>
-<a href="a00511.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00414.html">tbb</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html">tbb</a></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>tbb::flow</b></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::internal</b></td></tr>
+
<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>internal::graph_policy_namespace</b></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>interface6::internal::graph_policy_namespace</b></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html">tbb::flow::interface6::continue_msg</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html">tbb::flow::interface6::continue_msg</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An empty class used for messages that mean "I'm done". <a href="a00277.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An empty class used for messages that mean "I'm done". <a href="a00289.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a sender of messages of type T. <a href="a00327.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a sender of messages of type T. <a href="a00339.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a receiver of messages of type T. <a href="a00321.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a receiver of messages of type T. <a href="a00333.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages. <a href="a00279.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages. <a href="a00291.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::graph_iterator< GraphContainerType, GraphNodeType ></b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The graph class. <a href="a00288.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The graph class. <a href="a00300.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::graph::run_task< Body ></b></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::graph::run_and_put_task< Receiver, Body ></b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. <a href="a00289.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. <a href="a00301.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An executable node that acts as a source, i.e. it has no predecessors. <a href="a00330.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An executable node that acts as a source, i.e. it has no predecessors. <a href="a00342.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output. <a href="a00286.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output. <a href="a00298.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output. <a href="a00287.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output. <a href="a00299.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">implements a function node that supports Input -> (set of outputs) <a href="a00300.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">implements a function node that supports Input -> (set of outputs) <a href="a00312.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::multifunction_node< Input, Output, queueing, Allocator ></b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="a00336.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its <a href="a00336.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="a00348.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its <a href="a00348.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::split_node< TupleType, Allocator >::splitting_body</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00277.html">continue_msg</a> -> Output. <a href="a00278.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00289.html">continue_msg</a> -> Output. <a href="a00290.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::overwrite_node< T ></b></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::write_once_node< T ></b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors. <a href="a00262.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors. <a href="a00274.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order. <a href="a00263.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order. <a href="a00275.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::buffer_node< T, A >::buffer_operation</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order. <a href="a00313.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order. <a href="a00325.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order. <a href="a00328.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order. <a href="a00340.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order. <a href="a00312.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order. <a href="a00324.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached. <a href="a00292.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached. <a href="a00304.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::join_node< OutputTuple, reserving ></b></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::join_node< OutputTuple, queueing ></b></td></tr>
@@ -122,28 +122,35 @@
<tr><td class="mdescLeft"> </td><td class="mdescRight">An enumeration the provides the two most common concurrency levels: unlimited and serial. <br></td></tr>
<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="85817bf15a96ff32fac6240629ef3f84"></a><!-- doxytag: member="flow_graph.h::combine_tasks" ref="85817bf15a96ff32fac6240629ef3f84" args="(tbb::task *left, tbb::task *right)" -->
+static <a class="el" href="a00349.html">tbb::task</a> * </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::combine_tasks</b> (<a class="el" href="a00349.html">tbb::task</a> *left, <a class="el" href="a00349.html">tbb::task</a> *right)</td></tr>
+
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="511941e0793451ab18c6ccf489a67e47"></a><!-- doxytag: member="flow_graph.h::make_edge" ref="511941e0793451ab18c6ccf489a67e47" args="(sender< T > &p, receiver< T > &s)" -->
template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00417.html#511941e0793451ab18c6ccf489a67e47">tbb::flow::interface6::make_edge</a> (sender< T > &p, receiver< T > &s)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00431.html#511941e0793451ab18c6ccf489a67e47">tbb::flow::interface6::make_edge</a> (sender< T > &p, receiver< T > &s)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes an edge between a single predecessor and a single successor. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="15f0356fd7bcade4868d3b083ea671c2"></a><!-- doxytag: member="flow_graph.h::remove_edge" ref="15f0356fd7bcade4868d3b083ea671c2" args="(sender< T > &p, receiver< T > &s)" -->
template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00417.html#15f0356fd7bcade4868d3b083ea671c2">tbb::flow::interface6::remove_edge</a> (sender< T > &p, receiver< T > &s)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00431.html#15f0356fd7bcade4868d3b083ea671c2">tbb::flow::interface6::remove_edge</a> (sender< T > &p, receiver< T > &s)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes an edge between a single predecessor and a single successor. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c8a3ee78426f0aa4df0c5a5e4bcd53e1"></a><!-- doxytag: member="flow_graph.h::copy_body" ref="c8a3ee78426f0aa4df0c5a5e4bcd53e1" args="(Node &n)" -->
template<typename Body, typename Node> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Body </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00417.html#c8a3ee78426f0aa4df0c5a5e4bcd53e1">tbb::flow::interface6::copy_body</a> (Node &n)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Body </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00431.html#c8a3ee78426f0aa4df0c5a5e4bcd53e1">tbb::flow::interface6::copy_body</a> (Node &n)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns a copy of the body from a function or continue node. <br></td></tr>
+<tr><td colspan="2"><br><h2>Variables</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dadcbaae98368798c745eb0d16e0760e"></a><!-- doxytag: member="flow_graph.h::SUCCESSFULLY_ENQUEUED" ref="dadcbaae98368798c745eb0d16e0760e" args="" -->
+static <a class="el" href="a00349.html">tbb::task</a> *const </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::SUCCESSFULLY_ENQUEUED</b> = (task *)-1</td></tr>
+
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
The graph related classes and functions.
<p>
There are some applications that best express dependencies as messages passed between nodes in a graph. These messages may contain data or simply act as signals that a predecessors has completed. The graph class and its associated node classes can be used to express such applcations. <hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00373.html b/doc/html/a00386.html
similarity index 87%
rename from doc/html/a00373.html
rename to doc/html/a00386.html
index 66fd77b..cff4d33 100644
--- a/doc/html/a00373.html
+++ b/doc/html/a00386.html
@@ -19,29 +19,27 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>memory_pool.h File Reference</h1>
-<p>
-<a href="a00524.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<h1>memory_pool.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00414.html">tbb</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html">tbb</a></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>tbb::interface6</b></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00296.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00308.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::memory_pool_allocator< T, P >::rebind< U ></b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00297.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00309.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::memory_pool_allocator< void, P >::rebind< U ></b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html">tbb::interface6::memory_pool< Alloc ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html">tbb::interface6::memory_pool< Alloc ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-safe growable pool allocator for variable-size requests. <a href="a00295.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-safe growable pool allocator for variable-size requests. <a href="a00307.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::fixed_pool</b></td></tr>
<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
@@ -57,7 +55,7 @@ template<typename T, typename U, typename P> </td></tr>
<hr><a name="_details"></a><h2>Detailed Description</h2>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00392.html b/doc/html/a00405.html
similarity index 87%
rename from doc/html/a00392.html
rename to doc/html/a00405.html
index caf2a9b..5a39239 100644
--- a/doc/html/a00392.html
+++ b/doc/html/a00405.html
@@ -19,26 +19,24 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>scalable_allocator.h File Reference</h1>
-<p>
-<a href="a00608.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<h1>scalable_allocator.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00411.html">rml</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00425.html">rml</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00414.html">tbb</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html">tbb</a></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rml::MemPoolPolicy</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00325.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00337.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>tbb::scalable_allocator< T >::rebind< U ></b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00326.html">tbb::scalable_allocator< void ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00338.html">tbb::scalable_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00326.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00338.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>tbb::scalable_allocator< void >::rebind< U ></b></td></tr>
<tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
@@ -49,6 +47,9 @@ typedef void *(*) </td><td class="memItemRight" valign="bottom"><b>rml::raw
typedef int(*) </td><td class="memItemRight" valign="bottom"><b>rml::rawFreeType</b> (intptr_t pool_id, void *raw_ptr, size_t raw_bytes)</td></tr>
<tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>AllocationModeParam</b> { <b>USE_HUGE_PAGES</b>
+ }</td></tr>
+
<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>MemPoolError</b> { <b>POOL_OK</b>,
<b>INVALID_POLICY</b>,
<b>UNSUPPORTED_POLICY</b>,
@@ -56,23 +57,25 @@ typedef int(*) </td><td class="memItemRight" valign="bottom"><b>rml::rawFre
}</td></tr>
<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gb9ee52ffc5400f15c3d8af8c7613c05a">scalable_allocation_mode</a> (int param, intptr_t value)</td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7be7b591205c8bf497261d40c0304ab9"></a><!-- doxytag: member="scalable_allocator.h::pool_create_v1" ref="7be7b591205c8bf497261d40c0304ab9" args="(intptr_t pool_id, const MemPoolPolicy *policy, rml::MemoryPool **pool)" -->
MemPoolError </td><td class="memItemRight" valign="bottom"><b>rml::pool_create_v1</b> (intptr_t pool_id, const MemPoolPolicy *policy, rml::MemoryPool **pool)</td></tr>
@@ -110,7 +113,7 @@ template<typename T, typename U> </td></tr>
<hr><a name="_details"></a><h2>Detailed Description</h2>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00414.html b/doc/html/a00414.html
deleted file mode 100644
index 16b5c0d..0000000
--- a/doc/html/a00414.html
+++ /dev/null
@@ -1,667 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb Namespace Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="namespaces.html"><span>Namespace List</span></a></li>
- <li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
- </ul></div>
-<h1>tbb Namespace Reference</h1>The namespace tbb contains all components of the library.
-<a href="#_details">More...</a>
-<p>
-<table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html">aligned_space</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements. <a href="a00253.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html">atomic</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00254.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html">atomic< void * ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00255.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. <a href="a00255.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html">blocked_range</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00259.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html">blocked_range2d</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00260.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html">blocked_range3d</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00261.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html">cache_aligned_allocator</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00264.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html">cache_aligned_allocator< void ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00265.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html">combinable</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00267.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00347.html">tbb_hash_compare</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">hash_compare that is default argument for concurrent_hash_map <a href="a00347.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html">concurrent_bounded_queue</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00268.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html">concurrent_vector</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00276.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html">mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <a href="a00301.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html">null_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00303.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html">null_rw_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00305.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html">parallel_do_feeder</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class the user supplied algorithm body uses to add new tasks. <a href="a00307.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00339.html">task_group_context</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html">pre_scan_tag</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed. <a href="a00311.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html">final_scan_tag</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <a href="a00284.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html">parallel_while</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work. <a href="a00308.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html">simple_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00329.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.html">auto_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00257.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html">affinity_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner. <a href="a00249.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html">filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00282.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00348.html">thread_bound_filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <a href="a00348.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html">pipeline</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <a href="a00310.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html">queuing_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing mutex with local-only spinning. <a href="a00314.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html">queuing_rw_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing reader-writer mutex with local-only spinning. <a href="a00316.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html">recursive_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00322.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html">scalable_allocator</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00325.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00326.html">scalable_allocator< void ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00326.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00331.html">spin_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00331.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html">spin_rw_mutex_v3</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference. <a href="a00333.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html">task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00337.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">empty_task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00280.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html">task_list</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00341.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>task_handle</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>task_group</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>structured_task_group</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html">task_scheduler_init</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class delimiting the scope of task scheduler activity. <a href="a00342.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html">tbb_allocator</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00343.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html">tbb_allocator< void ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00344.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00353.html">zero_allocator</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00353.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html">zero_allocator< void, Allocator ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00354.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html">bad_last_alloc</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers. <a href="a00258.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html">improper_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for PPL locks. <a href="a00290.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00351.html">user_abort</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for user-initiated abort. <a href="a00351.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html">missing_wait</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for missing wait on structured_task_group. <a href="a00298.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html">invalid_multiple_scheduling</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for repeated scheduling of the same task_handle. <a href="a00291.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html">tbb_exception</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Interface to be implemented by all exceptions TBB recognizes and propagates across the threads. <a href="a00345.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html">captured_exception</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">This class is used by TBB to propagate information about unhandled exceptions into the root thread. <a href="a00266.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html">movable_exception</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread. <a href="a00299.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00335.html">split</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <a href="a00335.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html">tick_count</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00349.html#_details">More...</a><br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_do</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="parallel_do_body_req.html">parallel_do Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3383e2703977012b6f384d673410f1f7"></a><!-- doxytag: member="tbb::parallel_do" ref="g3383e2703977012b6f384d673410f1f7" args="(Iterator first, Iterator last, const Body &body)" -->
-template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2617dc9b88b3285a7212599d49f74228"></a><!-- doxytag: member="tbb::parallel_do" ref="g2617dc9b88b3285a7212599d49f74228" args="(Iterator first, Iterator last, const Body &body, task_group_context &context)" -->
-template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work and user-supplied context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_for</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_for_body_req.html">parallel_for Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g68cc046ef72c42ce205fccbc435a0d81"></a><!-- doxytag: member="tbb::parallel_for" ref="g68cc046ef72c42ce205fccbc435a0d81" args="(const Range &range, const Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a> (const Range &range, const Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g13cac5dd55c7533bccea43a51c33d0e5"></a><!-- doxytag: member="tbb::parallel_for" ref="g13cac5dd55c7533bccea43a51c33d0e5" args="(const Range &range, const Body &body, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00329.html">simple_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ga7ac75d532389b55b9247f3fdb0b00d1"></a><!-- doxytag: member="tbb::parallel_for" ref="ga7ac75d532389b55b9247f3fdb0b00d1" args="(const Range &range, const Body &body, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00257.html">auto_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00257.html">auto_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g9cd1b210ceb1c040f30e390b4a21bde8"></a><!-- doxytag: member="tbb::parallel_for" ref="g9cd1b210ceb1c040f30e390b4a21bde8" args="(const Range &range, const Body &body, affinity_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00249.html">affinity_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00249.html">affinity_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2d317a5e0078cd193125439fed60dfdc"></a><!-- doxytag: member="tbb::parallel_for" ref="g2d317a5e0078cd193125439fed60dfdc" args="(const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00329.html">simple_partitioner</a> &partitioner, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c0700e3f85e83a788ff3ede88ebb7e9"></a><!-- doxytag: member="tbb::parallel_for" ref="g1c0700e3f85e83a788ff3ede88ebb7e9" args="(const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00257.html">auto_partitioner</a> &partitioner, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00257.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g04b4696b67370c01353ff5974c8f1196"></a><!-- doxytag: member="tbb::parallel_for" ref="g04b4696b67370c01353ff5974c8f1196" args="(const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00249.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00249.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_for_each</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gcd40c32f319747e61a8f73fcfc452001"></a><!-- doxytag: member="tbb::parallel_for_each" ref="gcd40c32f319747e61a8f73fcfc452001" args="(InputIterator first, InputIterator last, const Function &f, task_group_context &context)" -->
-template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Calls function f for all items from [first, last) interval using user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc2d710ca573f0a9bd94379cba3772def"></a><!-- doxytag: member="tbb::parallel_for_each" ref="gc2d710ca573f0a9bd94379cba3772def" args="(InputIterator first, InputIterator last, const Function &f)" -->
-template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc2d710ca573f0a9bd94379cba3772def">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Uses default context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_invoke</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd3e2998f171494f94c2103f4eb924084"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gd3e2998f171494f94c2103f4eb924084" args="(const F0 &f0, const F1 &f1, tbb::task_group_context &context)" -->
-template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Executes a list of tasks in parallel and waits for all tasks to complete. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4eb73562e4145c8343ed9f996267f039"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g4eb73562e4145c8343ed9f996267f039" args="(const F0 &f0, const F1 &f1, const F2 &f2, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd1335c4b54fbf8d3f5be6a5c255c8c60"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gd1335c4b54fbf8d3f5be6a5c255c8c60" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g40b88e3db7ecb09cbfe0230ea1c24030"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g40b88e3db7ecb09cbfe0230ea1c24030" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g98a8b388f7e0b7621a964a8c23752d1d"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g98a8b388f7e0b7621a964a8c23752d1d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb95f31638bdde9d909361ad2e96a93eb"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gb95f31638bdde9d909361ad2e96a93eb" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1655b24786f010ee0a008907a07bb61d"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g1655b24786f010ee0a008907a07bb61d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g105220f1c95f9888b696a3e47027527b"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g105220f1c95f9888b696a3e47027527b" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1ef1774e0fcc4f632fe0af2591781c4c"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g1ef1774e0fcc4f632fe0af2591781c4c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="tbb::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
-template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb91fec4e7ba49754ad583ccb127afc66"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gb91fec4e7ba49754ad583ccb127afc66" args="(const F0 &f0, const F1 &f1, const F2 &f2)" -->
-template<typename F0, typename F1, typename F2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g421d0f66ee69eea134a35d1ae371d8d6"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g421d0f66ee69eea134a35d1ae371d8d6" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)" -->
-template<typename F0, typename F1, typename F2, typename F3> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8aacce74d691b4f44a0f7becadd9578c"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g8aacce74d691b4f44a0f7becadd9578c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8cc6994f7cd6eaf25feb5d7cc04a2e64"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g8cc6994f7cd6eaf25feb5d7cc04a2e64" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g995ba9583ae24bddb8bd9a599cc8b4c7"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g995ba9583ae24bddb8bd9a599cc8b4c7" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g34341a4c24c6f548886cd14077374c5c"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g34341a4c24c6f548886cd14077374c5c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2a11342753488d460866d48370a69517"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g2a11342753488d460866d48370a69517" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gffcf6835ceee43455f310352a3b4faa5"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gffcf6835ceee43455f310352a3b4faa5" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)</td></tr>
-
-<tr><td colspan="2"><br><h2>parallel_reduce</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a> (const Range &range, Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gec1b7c03f9da909bef5db12e3d41bed3"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gec1b7c03f9da909bef5db12e3d41bed3" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00329.html">simple_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00329.html">simple_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g18a19157e6245992fc00ca0adeb7dd37"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g18a19157e6245992fc00ca0adeb7dd37" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00257.html">auto_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00257.html">auto_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc61e73fcc36c92d79a217fc355ff4a6b"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gc61e73fcc36c92d79a217fc355ff4a6b" args="(const Range &range, Body &body, affinity_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00249.html">affinity_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00249.html">affinity_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g45cb00c42a18e334bbde8b7535afe460"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g45cb00c42a18e334bbde8b7535afe460" args="(const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00329.html">simple_partitioner</a> &partitioner, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c1ea1d7c61b3c225e92c70d669a53a5"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g1c1ea1d7c61b3c225e92c70d669a53a5" args="(const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00257.html">auto_partitioner</a> &partitioner, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00257.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd9ac3a3811060314695f33b703c6e11b"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gd9ac3a3811060314695f33b703c6e11b" args="(const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00249.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00249.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9412e09fb01fcad8c018ea9cffb28ef"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gc9412e09fb01fcad8c018ea9cffb28ef" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc9412e09fb01fcad8c018ea9cffb28ef">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gaddffeec0e892ac3d6fc7fc2053e1eca"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gaddffeec0e892ac3d6fc7fc2053e1eca" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00329.html">simple_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00329.html">simple_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb175401f0729e40dd2c5860a17c14385"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gb175401f0729e40dd2c5860a17c14385" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00257.html">auto_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00257.html">auto_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb7f1f1828ae2b330ce05b8513a495154"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gb7f1f1828ae2b330ce05b8513a495154" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00249.html">affinity_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00249.html">affinity_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfbc0cc2026d87f11a96bcd62788f5bb5"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gfbc0cc2026d87f11a96bcd62788f5bb5" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00329.html">simple_partitioner</a> &partitioner, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g630c90a399937d9d4ae70ff883186dfd"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g630c90a399937d9d4ae70ff883186dfd" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00257.html">auto_partitioner</a> &partitioner, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00257.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g496bd7eadb3b97495ccb5655ef90319e"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g496bd7eadb3b97495ccb5655ef90319e" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00249.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00249.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g873006cc80868b5b4604822bf100ddeb"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="g873006cc80868b5b4604822bf100ddeb" args="(const Range &range, Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a> (const Range &range, Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfd08c56b3a98d4437dadc5365326928a"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="gfd08c56b3a98d4437dadc5365326928a" args="(const Range &range, Body &body, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gfd08c56b3a98d4437dadc5365326928a">parallel_deterministic_reduce</a> (const Range &range, Body &body, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3edb17bb1967c291d227556e0e47e507"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="g3edb17bb1967c291d227556e0e47e507" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g3edb17bb1967c291d227556e0e47e507">parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g0a66bc67567b2d01d709b59b9bddf84a"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="g0a66bc67567b2d01d709b59b9bddf84a" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g0a66bc67567b2d01d709b59b9bddf84a">parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00339.html">task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_scan</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_scan_body_req.html">parallel_scan Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ged143f31dd3d96ded02ab3db915b91c7"></a><!-- doxytag: member="tbb::parallel_scan" ref="ged143f31dd3d96ded02ab3db915b91c7" args="(const Range &range, Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a> (const Range &range, Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9fac8870b2e6365fb337014404529df"></a><!-- doxytag: member="tbb::parallel_scan" ref="gc9fac8870b2e6365fb337014404529df" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00329.html">simple_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00329.html">simple_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g62fde400a37bbca1a2fddc8e3d22f556"></a><!-- doxytag: member="tbb::parallel_scan" ref="g62fde400a37bbca1a2fddc8e3d22f556" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00257.html">auto_partitioner</a> &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00257.html">auto_partitioner</a>. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_sort</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="parallel_sort_iter_req.html">iterators for parallel_sort</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename RandomAccessIterator, typename Compare> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator. <a href="a00426.html#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g16c3eb77d0e530834c51ce3857f01012"></a><!-- doxytag: member="tbb::parallel_sort" ref="g16c3eb77d0e530834c51ce3857f01012" args="(RandomAccessIterator begin, RandomAccessIterator end)" -->
-template<typename RandomAccessIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g16c3eb77d0e530834c51ce3857f01012">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) with a default comparator <code>std::less<RandomAccessIterator></code>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc7576f82fdedc8a701a6c17ad9415926"></a><!-- doxytag: member="tbb::parallel_sort" ref="gc7576f82fdedc8a701a6c17ad9415926" args="(T *begin, T *end)" -->
-template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc7576f82fdedc8a701a6c17ad9415926">parallel_sort</a> (T *begin, T *end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
-<tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf4486f36580f7d4bf95aed2e052a380"></a><!-- doxytag: member="tbb::critical_section" ref="bf4486f36580f7d4bf95aed2e052a380" args="" -->
-typedef internal::critical_section_v4 </td><td class="memItemRight" valign="bottom"><b>critical_section</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fdc2b067a243747d4c3dfe6f3d28476"></a><!-- doxytag: member="tbb::spin_rw_mutex" ref="7fdc2b067a243747d4c3dfe6f3d28476" args="" -->
-typedef <a class="el" href="a00333.html">spin_rw_mutex_v3</a> </td><td class="memItemRight" valign="bottom"><b>spin_rw_mutex</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3d457eb737199125df5ab0cf2f44094"></a><!-- doxytag: member="tbb::stack_size_type" ref="a3d457eb737199125df5ab0cf2f44094" args="" -->
-typedef std::size_t </td><td class="memItemRight" valign="bottom"><b>stack_size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceb89493291d4b03ce5f062fbaac0653"></a><!-- doxytag: member="tbb::task_scheduler_observer" ref="ceb89493291d4b03ce5f062fbaac0653" args="" -->
-typedef internal::task_scheduler_observer_v3 </td><td class="memItemRight" valign="bottom"><b>task_scheduler_observer</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> { <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>,
-<a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
-<a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>,
-<a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>
- }</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies memory semantics. <a href="a00414.html#a8686246bb5d3664bd07563749970fef">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00414.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { <b>ets_key_per_instance</b>,
-<b>ets_no_key</b>
- }</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">enum for selecting between single key and key-per-instance versions <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>priority_t</b> { <b>priority_normal</b> = internal::priority_stride_v4 * 2,
-<b>priority_low</b> = priority_normal - internal::priority_stride_v4,
-<b>priority_high</b> = priority_normal + internal::priority_stride_v4
- }</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>task_group_status</b> { <b>not_complete</b>,
-<b>complete</b>,
-<b>canceled</b>
- }</td></tr>
-
-<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e067bc86f20023cf3034f2ac310927b"></a><!-- doxytag: member="tbb::__TBB_DECL_ATOMIC" ref="2e067bc86f20023cf3034f2ac310927b" args="(__TBB_LONG_LONG) __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG) __TBB_DECL_ATOMIC(long) __TBB_DECL_ATOMIC(unsigned long) __TBB_DECL_ATOMIC_ALT(unsigned" -->
- </td><td class="memItemRight" valign="bottom"><b>__TBB_DECL_ATOMIC</b> (__TBB_LONG_LONG) __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG) __TBB_DECL_ATOMIC(long) __TBB_DECL_ATOMIC(unsigned long) __TBB_DECL_ATOMIC_ALT(unsigned</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad165cf61abbe349d413df2589679add"></a><!-- doxytag: member="tbb::__TBB_DECL_ATOMIC_ALT" ref="ad165cf61abbe349d413df2589679add" args="(int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > st [...]
-size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00414.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a> (int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > struct <a class="el" href="a00254.html">atomic</a>< T * ></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for atomic<T*> with arithmetic and operator->. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1ef5059a6b85fad2e4d510a5a095f2a1"></a><!-- doxytag: member="tbb::load" ref="1ef5059a6b85fad2e4d510a5a095f2a1" args="(const atomic< T > &a)" -->
-template<memory_semantics M, typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>load</b> (const <a class="el" href="a00254.html">atomic</a>< T > &a)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0fc5e34a898372157343886babe84045"></a><!-- doxytag: member="tbb::store" ref="0fc5e34a898372157343886babe84045" args="(atomic< T > &a, T value)" -->
-template<memory_semantics M, typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>store</b> (<a class="el" href="a00254.html">atomic</a>< T > &a, T value)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7af9509624a62ea848afe775f892ed12"></a><!-- doxytag: member="tbb::operator==" ref="7af9509624a62ea848afe775f892ed12" args="(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)" -->
-template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00264.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00264.html">cache_aligned_allocator</a>< U > &)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="426abbf5243087148f5e3767e68c286b"></a><!-- doxytag: member="tbb::operator!=" ref="426abbf5243087148f5e3767e68c286b" args="(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)" -->
-template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00264.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00264.html">cache_aligned_allocator</a>< U > &)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f3609fc523a99c101572fdc68f918d66"></a><!-- doxytag: member="tbb::operator==" ref="f3609fc523a99c101572fdc68f918d66" args="(const concurrent_hash_map< Key, T, HashCompare, A1 > &a, const concurrent_hash_map< Key, T, HashCompare, A2 > &b)" -->
-template<typename Key, typename T, typename HashCompare, typename A1, typename A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00269.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00269.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="2da30ff86b9a39722f45bc35e1c6934d"></a><!-- doxytag: member="tbb::operator!=" ref="2da30ff86b9a39722f45bc35e1c6934d" args="(const concurrent_hash_map< Key, T, HashCompare, A1 > &a, const concurrent_hash_map< Key, T, HashCompare, A2 > &b)" -->
-template<typename Key, typename T, typename HashCompare, typename A1, typename A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00269.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00269.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="817c20df80fe1a933a8557eb76113e24"></a><!-- doxytag: member="tbb::swap" ref="817c20df80fe1a933a8557eb76113e24" args="(concurrent_hash_map< Key, T, HashCompare, A > &a, concurrent_hash_map< Key, T, HashCompare, A > &b)" -->
-template<typename Key, typename T, typename HashCompare, typename A> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00269.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &a, <a class="el" href="a00269.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="11419db87ac98110907dda08a24f0949"></a><!-- doxytag: member="tbb::operator==" ref="11419db87ac98110907dda08a24f0949" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
-template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00276.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00276.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="aa9e09f2e9154ffd6658fad8355fb491"></a><!-- doxytag: member="tbb::operator!=" ref="aa9e09f2e9154ffd6658fad8355fb491" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
-template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00276.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00276.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="33267dd805415351956d45b4b5347190"></a><!-- doxytag: member="tbb::operator<" ref="33267dd805415351956d45b4b5347190" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
-template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<</b> (const <a class="el" href="a00276.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00276.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="14e2968ab20cb714bef1f0352fc152f0"></a><!-- doxytag: member="tbb::operator>" ref="14e2968ab20cb714bef1f0352fc152f0" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
-template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator></b> (const <a class="el" href="a00276.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00276.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0042a36a670a397fb52e713edbaecd0e"></a><!-- doxytag: member="tbb::operator<=" ref="0042a36a670a397fb52e713edbaecd0e" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
-template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<=</b> (const <a class="el" href="a00276.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00276.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f70eb1d931473b69ba4bcf93af8baa33"></a><!-- doxytag: member="tbb::operator>=" ref="f70eb1d931473b69ba4bcf93af8baa33" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
-template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator>=</b> (const <a class="el" href="a00276.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00276.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4a3897ea8d8a48e885d764bd7d370d50"></a><!-- doxytag: member="tbb::swap" ref="4a3897ea8d8a48e885d764bd7d370d50" args="(concurrent_vector< T, A > &a, concurrent_vector< T, A > &b)" -->
-template<typename T, class A> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00276.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00276.html">concurrent_vector</a>< T, A > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="tbb::operator==" ref="906ebb461ecb0446989739fd0399e4b8" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
-template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00325.html">scalable_allocator</a>< T > &, const <a class="el" href="a00325.html">scalable_allocator</a>< U > &)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a92757aca0a69082eb8dc223eb257433"></a><!-- doxytag: member="tbb::operator!=" ref="a92757aca0a69082eb8dc223eb257433" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
-template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00325.html">scalable_allocator</a>< T > &, const <a class="el" href="a00325.html">scalable_allocator</a>< U > &)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7e2f5baabe173fbf48e94fb9058f1b41"></a><!-- doxytag: member="tbb::is_current_task_group_canceling" ref="7e2f5baabe173fbf48e94fb9058f1b41" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>is_current_task_group_canceling</b> ()</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="3bb9a8b837a9b7c4b5107caf01e81329"></a><!-- doxytag: member="tbb::make_task" ref="3bb9a8b837a9b7c4b5107caf01e81329" args="(const F &f)" -->
-template<class F> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">task_handle< F > </td><td class="memTemplItemRight" valign="bottom"><b>make_task</b> (const F &f)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c8a46d6c0fe474eb399d0d09c27a4685"></a><!-- doxytag: member="tbb::operator==" ref="c8a46d6c0fe474eb399d0d09c27a4685" args="(const tbb_allocator< T > &, const tbb_allocator< U > &)" -->
-template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00343.html">tbb_allocator</a>< T > &, const <a class="el" href="a00343.html">tbb_allocator</a>< U > &)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="3d9665c21c894f06f1614947103dc9d6"></a><!-- doxytag: member="tbb::operator!=" ref="3d9665c21c894f06f1614947103dc9d6" args="(const tbb_allocator< T > &, const tbb_allocator< U > &)" -->
-template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00343.html">tbb_allocator</a>< T > &, const <a class="el" href="a00343.html">tbb_allocator</a>< U > &)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="b64fb7e52f0049b5a103cbb6fb5814f0"></a><!-- doxytag: member="tbb::operator==" ref="b64fb7e52f0049b5a103cbb6fb5814f0" args="(const zero_allocator< T1, B1 > &a, const zero_allocator< T2, B2 > &b)" -->
-template<typename T1, template< typename X1 > class B1, typename T2, template< typename X2 > class B2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00353.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00353.html">zero_allocator</a>< T2, B2 > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ae43b5151d0220fe3ade0b447cd64f0d"></a><!-- doxytag: member="tbb::operator!=" ref="ae43b5151d0220fe3ade0b447cd64f0d" args="(const zero_allocator< T1, B1 > &a, const zero_allocator< T2, B2 > &b)" -->
-template<typename T1, template< typename X1 > class B1, typename T2, template< typename X2 > class B2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00353.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00353.html">zero_allocator</a>< T2, B2 > &b)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="250275615f10d5b5de6ad466ae2f54de"></a><!-- doxytag: member="tbb::atomic_fence" ref="250275615f10d5b5de6ad466ae2f54de" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00414.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sequentially consistent full memory fence. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00414.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The function returns the interface version of the TBB shared library being used. <a href="#a6858b22e90041c9c4669674ff39b056"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6a42aa5dbcf06ba86c71efb73d8311c3"></a><!-- doxytag: member="tbb::operator-" ref="6a42aa5dbcf06ba86c71efb73d8311c3" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00350.html">tick_count::interval_t</a> </td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="a00349.html">tick_count</a> &t1, const <a class="el" href="a00349.html">tick_count</a> &t0)</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-The namespace tbb contains all components of the library.
-<p>
-This header provides basic platform abstraction layer by hooking up appropriate architecture/OS/compiler specific headers from the /include/tbb/machine directory. If a plug-in header does not implement all the required APIs, it must specify the missing ones by setting one or more of the following macros:<p>
-__TBB_USE_GENERIC_PART_WORD_CAS __TBB_USE_GENERIC_PART_WORD_FETCH_ADD __TBB_USE_GENERIC_PART_WORD_FETCH_STORE __TBB_USE_GENERIC_FETCH_ADD __TBB_USE_GENERIC_FETCH_STORE __TBB_USE_GENERIC_DWORD_FETCH_ADD __TBB_USE_GENERIC_DWORD_FETCH_STORE __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE __TBB_USE_GENERIC_FULL_FENCED_LOAD_STORE __TBB_USE_GENERIC_RELAXED_LOAD_STORE __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE<p>
-In this case <a class="el" href="a00640.html">tbb_machine.h</a> will add missing functionality based on a minimal set of APIs that are required to be implemented by all plug-n headers as described further. Note that these generic implementations may be sub-optimal for a particular architecture, and thus should be relied upon only after careful evaluation or as the last resort.<p>
-Additionally __TBB_64BIT_ATOMICS can be set to 0 on a 32-bit architecture to indicate that the port is not going to support double word atomics. It may also be set to 1 explicitly, though normally this is not necessary as <a class="el" href="a00640.html">tbb_machine.h</a> will set it automatically.<p>
-__TBB_BIG_ENDIAN macro can be defined by the implementation as well. It is used only if the __TBB_USE_GENERIC_PART_WORD_CAS is set. Possible values are:<ul>
-<li>1 if the system is big endian,</li><li>0 if it is little endian,</li><li>or -1 to explicitly state that __TBB_USE_GENERIC_PART_WORD_CAS can not be used. -1 should be used when it is known in advance that endianness can change in run time or it is not simple big or little but something more complex. The system will try to detect it in run time if it is not set(in assumption that it is either a big or little one).</li></ul>
-<p>
-Prerequisites for each architecture port ---------------------------------------- The following functions and macros have no generic implementation. Therefore they must be implemented in each machine architecture specific header either as a conventional function or as a functional macro.<p>
-__TBB_WORDSIZE This is the size of machine word in bytes, i.e. for 32 bit systems it should be defined to 4.<p>
-__TBB_Yield() Signals OS that the current thread is willing to relinquish the remainder of its time quantum.<p>
-__TBB_full_memory_fence() Must prevent all memory operations from being reordered across it (both by hardware and compiler). All such fences must be totally ordered (or sequentially consistent).<p>
-__TBB_machine_cmpswp4( volatile void *ptr, int32_t value, int32_t comparand ) Must be provided if __TBB_USE_FENCED_ATOMICS is not set.<p>
-__TBB_machine_cmpswp8( volatile void *ptr, int32_t value, int64_t comparand ) Must be provided for 64-bit architectures if __TBB_USE_FENCED_ATOMICS is not set, and for 32-bit architectures if __TBB_64BIT_ATOMICS is set<p>
-__TBB_machine_<op><S><fence>(...), where <op> = {cmpswp, fetchadd, fetchstore} <S> = {1, 2, 4, 8} <fence> = {full_fence, acquire, release, relaxed} Must be provided if __TBB_USE_FENCED_ATOMICS is set.<p>
-__TBB_control_consistency_helper() Bridges the memory-semantics gap between architectures providing only implicit C++0x "consume" semantics (like Power Architecture) and those also implicitly obeying control dependencies (like IA-64). It must be used only in conditional code where the condition is itself data-dependent, and will then make subsequent code behave as if the original data dependency were acquired. It needs only a compiler fence where implied by the architecture either specif [...]
-__TBB_acquire_consistency_helper(), __TBB_release_consistency_helper() Must be provided if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE is set. Enforce acquire and release semantics in generic implementations of fenced store and load operations. Depending on the particular architecture/compiler combination they may be a hardware fence, a compiler fence, both or nothing.
-<p>
-<hr><h2>Enumeration Type Documentation</h2>
-<a class="anchor" name="a8686246bb5d3664bd07563749970fef"></a><!-- doxytag: member="tbb::memory_semantics" ref="a8686246bb5d3664bd07563749970fef" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">enum <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef">tbb::memory_semantics</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Specifies memory semantics.
-<p>
-<dl compact><dt><b>Enumerator: </b></dt><dd>
-<table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff"></a><!-- doxytag: member="full_fence" ref="a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff" args="" -->full_fence</em> </td><td>
-Sequential consistency. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7"></a><!-- doxytag: member="acquire" ref="a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7" args="" -->acquire</em> </td><td>
-Acquire. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70"></a><!-- doxytag: member="release" ref="a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70" args="" -->release</em> </td><td>
-Release. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900"></a><!-- doxytag: member="relaxed" ref="a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900" args="" -->relaxed</em> </td><td>
-No ordering. </td></tr>
-</table>
-</dl>
-
-</div>
-</div><p>
-<hr><h2>Function Documentation</h2>
-<a class="anchor" name="a6858b22e90041c9c4669674ff39b056"></a><!-- doxytag: member="tbb::TBB_runtime_interface_version" ref="a6858b22e90041c9c4669674ff39b056" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int __TBB_EXPORTED_FUNC tbb::TBB_runtime_interface_version </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The function returns the interface version of the TBB shared library being used.
-<p>
-The version it returns is determined at runtime, not at compile/link time. So it can be different than the value of TBB_INTERFACE_VERSION obtained at compile time.
-</div>
-</div><p>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00411.html b/doc/html/a00425.html
similarity index 98%
rename from doc/html/a00411.html
rename to doc/html/a00425.html
index 4d62363..4e2eceb 100644
--- a/doc/html/a00411.html
+++ b/doc/html/a00425.html
@@ -74,7 +74,7 @@ If x is false, print assertion failure message. If the comment argument is not N
<p>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00426.html b/doc/html/a00426.html
deleted file mode 100644
index cd9895b..0000000
--- a/doc/html/a00426.html
+++ /dev/null
@@ -1,364 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Algorithms</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<h1>Algorithms</h1><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00259.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00260.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00261.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html">tbb::pre_scan_tag</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed. <a href="a00311.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html">tbb::final_scan_tag</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <a href="a00284.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html">tbb::parallel_while< Body ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work. <a href="a00308.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00329.html">tbb::simple_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00329.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.html">tbb::auto_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00257.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html">tbb::filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00282.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00348.html">tbb::thread_bound_filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <a href="a00348.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html">tbb::pipeline</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <a href="a00310.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00335.html">tbb::split</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <a href="a00335.html#_details">More...</a><br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_do</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="parallel_do_body_req.html">parallel_do Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3383e2703977012b6f384d673410f1f7"></a><!-- doxytag: member="algorithms::parallel_do" ref="g3383e2703977012b6f384d673410f1f7" args="(Iterator first, Iterator last, const Body &body)" -->
-template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2617dc9b88b3285a7212599d49f74228"></a><!-- doxytag: member="algorithms::parallel_do" ref="g2617dc9b88b3285a7212599d49f74228" args="(Iterator first, Iterator last, const Body &body, task_group_context &context)" -->
-template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g2617dc9b88b3285a7212599d49f74228">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work and user-supplied context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_for</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_for_body_req.html">parallel_for Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g68cc046ef72c42ce205fccbc435a0d81"></a><!-- doxytag: member="algorithms::parallel_for" ref="g68cc046ef72c42ce205fccbc435a0d81" args="(const Range &range, const Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a> (const Range &range, const Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g13cac5dd55c7533bccea43a51c33d0e5"></a><!-- doxytag: member="algorithms::parallel_for" ref="g13cac5dd55c7533bccea43a51c33d0e5" args="(const Range &range, const Body &body, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g13cac5dd55c7533bccea43a51c33d0e5">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ga7ac75d532389b55b9247f3fdb0b00d1"></a><!-- doxytag: member="algorithms::parallel_for" ref="ga7ac75d532389b55b9247f3fdb0b00d1" args="(const Range &range, const Body &body, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#ga7ac75d532389b55b9247f3fdb0b00d1">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00257.html">auto_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g9cd1b210ceb1c040f30e390b4a21bde8"></a><!-- doxytag: member="algorithms::parallel_for" ref="g9cd1b210ceb1c040f30e390b4a21bde8" args="(const Range &range, const Body &body, affinity_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g9cd1b210ceb1c040f30e390b4a21bde8">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00249.html">affinity_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2d317a5e0078cd193125439fed60dfdc"></a><!-- doxytag: member="algorithms::parallel_for" ref="g2d317a5e0078cd193125439fed60dfdc" args="(const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g2d317a5e0078cd193125439fed60dfdc">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c0700e3f85e83a788ff3ede88ebb7e9"></a><!-- doxytag: member="algorithms::parallel_for" ref="g1c0700e3f85e83a788ff3ede88ebb7e9" args="(const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g1c0700e3f85e83a788ff3ede88ebb7e9">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00257.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g04b4696b67370c01353ff5974c8f1196"></a><!-- doxytag: member="algorithms::parallel_for" ref="g04b4696b67370c01353ff5974c8f1196" args="(const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g04b4696b67370c01353ff5974c8f1196">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00249.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_for_each</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gcd40c32f319747e61a8f73fcfc452001"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gcd40c32f319747e61a8f73fcfc452001" args="(InputIterator first, InputIterator last, const Function &f, task_group_context &context)" -->
-template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gcd40c32f319747e61a8f73fcfc452001">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Calls function f for all items from [first, last) interval using user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc2d710ca573f0a9bd94379cba3772def"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gc2d710ca573f0a9bd94379cba3772def" args="(InputIterator first, InputIterator last, const Function &f)" -->
-template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc2d710ca573f0a9bd94379cba3772def">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Uses default context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_invoke</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd3e2998f171494f94c2103f4eb924084"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd3e2998f171494f94c2103f4eb924084" args="(const F0 &f0, const F1 &f1, tbb::task_group_context &context)" -->
-template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Executes a list of tasks in parallel and waits for all tasks to complete. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4eb73562e4145c8343ed9f996267f039"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g4eb73562e4145c8343ed9f996267f039" args="(const F0 &f0, const F1 &f1, const F2 &f2, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd1335c4b54fbf8d3f5be6a5c255c8c60"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd1335c4b54fbf8d3f5be6a5c255c8c60" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g40b88e3db7ecb09cbfe0230ea1c24030"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g40b88e3db7ecb09cbfe0230ea1c24030" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g98a8b388f7e0b7621a964a8c23752d1d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g98a8b388f7e0b7621a964a8c23752d1d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb95f31638bdde9d909361ad2e96a93eb"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb95f31638bdde9d909361ad2e96a93eb" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1655b24786f010ee0a008907a07bb61d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1655b24786f010ee0a008907a07bb61d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g105220f1c95f9888b696a3e47027527b"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g105220f1c95f9888b696a3e47027527b" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1ef1774e0fcc4f632fe0af2591781c4c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1ef1774e0fcc4f632fe0af2591781c4c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00339.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
-template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb91fec4e7ba49754ad583ccb127afc66"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb91fec4e7ba49754ad583ccb127afc66" args="(const F0 &f0, const F1 &f1, const F2 &f2)" -->
-template<typename F0, typename F1, typename F2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g421d0f66ee69eea134a35d1ae371d8d6"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g421d0f66ee69eea134a35d1ae371d8d6" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)" -->
-template<typename F0, typename F1, typename F2, typename F3> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8aacce74d691b4f44a0f7becadd9578c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8aacce74d691b4f44a0f7becadd9578c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8cc6994f7cd6eaf25feb5d7cc04a2e64"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8cc6994f7cd6eaf25feb5d7cc04a2e64" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g995ba9583ae24bddb8bd9a599cc8b4c7"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g995ba9583ae24bddb8bd9a599cc8b4c7" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g34341a4c24c6f548886cd14077374c5c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g34341a4c24c6f548886cd14077374c5c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2a11342753488d460866d48370a69517"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g2a11342753488d460866d48370a69517" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gffcf6835ceee43455f310352a3b4faa5"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gffcf6835ceee43455f310352a3b4faa5" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)</td></tr>
-
-<tr><td colspan="2"><br><h2>parallel_reduce</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">tbb::parallel_reduce</a> (const Range &range, Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gec1b7c03f9da909bef5db12e3d41bed3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gec1b7c03f9da909bef5db12e3d41bed3" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gec1b7c03f9da909bef5db12e3d41bed3">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00329.html">simple_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g18a19157e6245992fc00ca0adeb7dd37"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g18a19157e6245992fc00ca0adeb7dd37" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g18a19157e6245992fc00ca0adeb7dd37">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00257.html">auto_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc61e73fcc36c92d79a217fc355ff4a6b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc61e73fcc36c92d79a217fc355ff4a6b" args="(const Range &range, Body &body, affinity_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc61e73fcc36c92d79a217fc355ff4a6b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00249.html">affinity_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g45cb00c42a18e334bbde8b7535afe460"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g45cb00c42a18e334bbde8b7535afe460" args="(const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g45cb00c42a18e334bbde8b7535afe460">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c1ea1d7c61b3c225e92c70d669a53a5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1c1ea1d7c61b3c225e92c70d669a53a5" args="(const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g1c1ea1d7c61b3c225e92c70d669a53a5">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00257.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd9ac3a3811060314695f33b703c6e11b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gd9ac3a3811060314695f33b703c6e11b" args="(const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gd9ac3a3811060314695f33b703c6e11b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00249.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9412e09fb01fcad8c018ea9cffb28ef"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc9412e09fb01fcad8c018ea9cffb28ef" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc9412e09fb01fcad8c018ea9cffb28ef">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gaddffeec0e892ac3d6fc7fc2053e1eca"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gaddffeec0e892ac3d6fc7fc2053e1eca" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gaddffeec0e892ac3d6fc7fc2053e1eca">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00329.html">simple_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb175401f0729e40dd2c5860a17c14385"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb175401f0729e40dd2c5860a17c14385" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gb175401f0729e40dd2c5860a17c14385">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00257.html">auto_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb7f1f1828ae2b330ce05b8513a495154"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb7f1f1828ae2b330ce05b8513a495154" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gb7f1f1828ae2b330ce05b8513a495154">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00249.html">affinity_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfbc0cc2026d87f11a96bcd62788f5bb5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gfbc0cc2026d87f11a96bcd62788f5bb5" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gfbc0cc2026d87f11a96bcd62788f5bb5">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g630c90a399937d9d4ae70ff883186dfd"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g630c90a399937d9d4ae70ff883186dfd" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g630c90a399937d9d4ae70ff883186dfd">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00257.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g496bd7eadb3b97495ccb5655ef90319e"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g496bd7eadb3b97495ccb5655ef90319e" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g496bd7eadb3b97495ccb5655ef90319e">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00249.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g873006cc80868b5b4604822bf100ddeb"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="g873006cc80868b5b4604822bf100ddeb" args="(const Range &range, Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g873006cc80868b5b4604822bf100ddeb">tbb::parallel_deterministic_reduce</a> (const Range &range, Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfd08c56b3a98d4437dadc5365326928a"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="gfd08c56b3a98d4437dadc5365326928a" args="(const Range &range, Body &body, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gfd08c56b3a98d4437dadc5365326928a">tbb::parallel_deterministic_reduce</a> (const Range &range, Body &body, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3edb17bb1967c291d227556e0e47e507"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="g3edb17bb1967c291d227556e0e47e507" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g3edb17bb1967c291d227556e0e47e507">tbb::parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g0a66bc67567b2d01d709b59b9bddf84a"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="g0a66bc67567b2d01d709b59b9bddf84a" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb::parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_scan</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_scan_body_req.html">parallel_scan Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ged143f31dd3d96ded02ab3db915b91c7"></a><!-- doxytag: member="algorithms::parallel_scan" ref="ged143f31dd3d96ded02ab3db915b91c7" args="(const Range &range, Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#ged143f31dd3d96ded02ab3db915b91c7">tbb::parallel_scan</a> (const Range &range, Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9fac8870b2e6365fb337014404529df"></a><!-- doxytag: member="algorithms::parallel_scan" ref="gc9fac8870b2e6365fb337014404529df" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc9fac8870b2e6365fb337014404529df">tbb::parallel_scan</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00329.html">simple_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g62fde400a37bbca1a2fddc8e3d22f556"></a><!-- doxytag: member="algorithms::parallel_scan" ref="g62fde400a37bbca1a2fddc8e3d22f556" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb::parallel_scan</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00257.html">auto_partitioner</a>. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_sort</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="parallel_sort_iter_req.html">iterators for parallel_sort</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename RandomAccessIterator, typename Compare> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g49edcf9447cd91a9527a3f8e8512b7aa">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator. <a href="#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g16c3eb77d0e530834c51ce3857f01012"></a><!-- doxytag: member="algorithms::parallel_sort" ref="g16c3eb77d0e530834c51ce3857f01012" args="(RandomAccessIterator begin, RandomAccessIterator end)" -->
-template<typename RandomAccessIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#g16c3eb77d0e530834c51ce3857f01012">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) with a default comparator <code>std::less<RandomAccessIterator></code>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc7576f82fdedc8a701a6c17ad9415926"></a><!-- doxytag: member="algorithms::parallel_sort" ref="gc7576f82fdedc8a701a6c17ad9415926" args="(T *begin, T *end)" -->
-template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00426.html#gc7576f82fdedc8a701a6c17ad9415926">tbb::parallel_sort</a> (T *begin, T *end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
-</table>
-<hr><h2>Function Documentation</h2>
-<a class="anchor" name="g49edcf9447cd91a9527a3f8e8512b7aa"></a><!-- doxytag: member="tbb::parallel_sort" ref="g49edcf9447cd91a9527a3f8e8512b7aa" args="(RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename RandomAccessIterator, typename Compare> </div>
- <table class="memname">
- <tr>
- <td class="memname">void tbb::parallel_sort </td>
- <td>(</td>
- <td class="paramtype">RandomAccessIterator </td>
- <td class="paramname"> <em>begin</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">RandomAccessIterator </td>
- <td class="paramname"> <em>end</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Compare & </td>
- <td class="paramname"> <em>comp</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Sorts the data in [begin,end) using the given comparator.
-<p>
-The compare function object is used for all comparisons between elements during sorting. The compare object must define a bool operator() function.
-</div>
-</div><p>
-<hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00428.html b/doc/html/a00428.html
index 1910530..745d5ea 100644
--- a/doc/html/a00428.html
+++ b/doc/html/a00428.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Memory Allocation</title>
+<title>tbb Namespace Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -9,230 +9,645 @@
<ul>
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
-<h1>Memory Allocation</h1><table border="0" cellpadding="0" cellspacing="0">
+<div class="tabs">
+ <ul>
+ <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
+ </ul></div>
+<h1>tbb Namespace Reference</h1>The namespace tbb contains all components of the library.
+<a href="#_details">More...</a>
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html">tbb::aligned_space< T, N ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html">aligned_space</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements. <a href="a00265.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html">atomic</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00266.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html">atomic< void * ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00267.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. <a href="a00267.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html">blocked_range</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00271.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html">blocked_range2d</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00272.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html">blocked_range3d</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00273.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html">cache_aligned_allocator</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00276.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html">cache_aligned_allocator< void ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00277.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html">combinable</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00279.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00360.html">tbb_hash_compare</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">hash_compare that is default argument for concurrent_hash_map <a href="a00360.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">concurrent_bounded_queue</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00280.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html">concurrent_vector</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00288.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html">mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <a href="a00313.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html">null_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00315.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html">null_rw_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00317.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html">parallel_do_feeder</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class the user supplied algorithm body uses to add new tasks. <a href="a00319.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00353.html">task_group_context</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html">pre_scan_tag</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed. <a href="a00323.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html">final_scan_tag</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <a href="a00296.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html">parallel_while</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work. <a href="a00320.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html">simple_partitioner</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00341.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html">auto_partitioner</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00269.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html">affinity_partitioner</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner. <a href="a00261.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html">filter</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00294.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00361.html">thread_bound_filter</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <a href="a00361.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html">pipeline</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <a href="a00322.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00326.html">queuing_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing mutex with local-only spinning. <a href="a00326.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html">queuing_rw_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing reader-writer mutex with local-only spinning. <a href="a00328.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html">recursive_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00334.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html">scalable_allocator</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00337.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00338.html">scalable_allocator< void ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00338.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html">spin_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00343.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html">spin_rw_mutex_v3</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference. <a href="a00345.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html">task</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00349.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html">empty_task</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00292.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html">task_list</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00354.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>task_handle</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>task_group</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>structured_task_group</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00355.html">task_scheduler_init</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class delimiting the scope of task scheduler activity. <a href="a00355.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00356.html">tbb_allocator</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00356.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00357.html">tbb_allocator< void ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00357.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00366.html">zero_allocator</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00366.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00367.html">zero_allocator< void, Allocator ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00367.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html">bad_last_alloc</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers. <a href="a00270.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html">improper_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for PPL locks. <a href="a00302.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00364.html">user_abort</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for user-initiated abort. <a href="a00364.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html">missing_wait</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for missing wait on structured_task_group. <a href="a00310.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html">invalid_multiple_scheduling</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for repeated scheduling of the same task_handle. <a href="a00303.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00358.html">tbb_exception</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Interface to be implemented by all exceptions TBB recognizes and propagates across the threads. <a href="a00358.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html">captured_exception</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">This class is used by TBB to propagate information about unhandled exceptions into the root thread. <a href="a00278.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html">movable_exception</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread. <a href="a00311.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00347.html">split</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <a href="a00347.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html">tick_count</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00362.html#_details">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_do</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="parallel_do_body_req.html">parallel_do Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3383e2703977012b6f384d673410f1f7"></a><!-- doxytag: member="tbb::parallel_do" ref="g3383e2703977012b6f384d673410f1f7" args="(Iterator first, Iterator last, const Body &body)" -->
+template<typename Iterator, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2617dc9b88b3285a7212599d49f74228"></a><!-- doxytag: member="tbb::parallel_do" ref="g2617dc9b88b3285a7212599d49f74228" args="(Iterator first, Iterator last, const Body &body, task_group_context &context)" -->
+template<typename Iterator, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work and user-supplied context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_for</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_for_body_req.html">parallel_for Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g68cc046ef72c42ce205fccbc435a0d81"></a><!-- doxytag: member="tbb::parallel_for" ref="g68cc046ef72c42ce205fccbc435a0d81" args="(const Range &range, const Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a> (const Range &range, const Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g13cac5dd55c7533bccea43a51c33d0e5"></a><!-- doxytag: member="tbb::parallel_for" ref="g13cac5dd55c7533bccea43a51c33d0e5" args="(const Range &range, const Body &body, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00341.html">simple_partitioner</a> &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ga7ac75d532389b55b9247f3fdb0b00d1"></a><!-- doxytag: member="tbb::parallel_for" ref="ga7ac75d532389b55b9247f3fdb0b00d1" args="(const Range &range, const Body &body, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00269.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements. <a href="a00253.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00269.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g9cd1b210ceb1c040f30e390b4a21bde8"></a><!-- doxytag: member="tbb::parallel_for" ref="g9cd1b210ceb1c040f30e390b4a21bde8" args="(const Range &range, const Body &body, affinity_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00261.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00264.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00261.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8a1bab34022d4990e49e287a129529fa"></a><!-- doxytag: member="tbb::parallel_for" ref="g8a1bab34022d4990e49e287a129529fa" args="(const Range &range, const Body &body, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g8a1bab34022d4990e49e287a129529fa">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00265.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2d317a5e0078cd193125439fed60dfdc"></a><!-- doxytag: member="tbb::parallel_for" ref="g2d317a5e0078cd193125439fed60dfdc" args="(const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00341.html">simple_partitioner</a> &partitioner, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00296.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c0700e3f85e83a788ff3ede88ebb7e9"></a><!-- doxytag: member="tbb::parallel_for" ref="g1c0700e3f85e83a788ff3ede88ebb7e9" args="(const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00269.html">auto_partitioner</a> &partitioner, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00297.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00269.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g04b4696b67370c01353ff5974c8f1196"></a><!-- doxytag: member="tbb::parallel_for" ref="g04b4696b67370c01353ff5974c8f1196" args="(const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00261.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00325.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00326.html">tbb::scalable_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00261.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_for_each</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gcd40c32f319747e61a8f73fcfc452001"></a><!-- doxytag: member="tbb::parallel_for_each" ref="gcd40c32f319747e61a8f73fcfc452001" args="(InputIterator first, InputIterator last, const Function &f, task_group_context &context)" -->
+template<typename InputIterator, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00326.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Calls function f for all items from [first, last) interval using user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc2d710ca573f0a9bd94379cba3772def"></a><!-- doxytag: member="tbb::parallel_for_each" ref="gc2d710ca573f0a9bd94379cba3772def" args="(InputIterator first, InputIterator last, const Function &f)" -->
+template<typename InputIterator, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc2d710ca573f0a9bd94379cba3772def">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00343.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html">tbb::tbb_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Uses default context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_invoke</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd3e2998f171494f94c2103f4eb924084"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gd3e2998f171494f94c2103f4eb924084" args="(const F0 &f0, const F1 &f1, tbb::task_group_context &context)" -->
+template<typename F0, typename F1> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00344.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Executes a list of tasks in parallel and waits for all tasks to complete. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4eb73562e4145c8343ed9f996267f039"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g4eb73562e4145c8343ed9f996267f039" args="(const F0 &f0, const F1 &f1, const F2 &f2, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00353.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd1335c4b54fbf8d3f5be6a5c255c8c60"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gd1335c4b54fbf8d3f5be6a5c255c8c60" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g40b88e3db7ecb09cbfe0230ea1c24030"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g40b88e3db7ecb09cbfe0230ea1c24030" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g98a8b388f7e0b7621a964a8c23752d1d"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g98a8b388f7e0b7621a964a8c23752d1d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb95f31638bdde9d909361ad2e96a93eb"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gb95f31638bdde9d909361ad2e96a93eb" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1655b24786f010ee0a008907a07bb61d"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g1655b24786f010ee0a008907a07bb61d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g105220f1c95f9888b696a3e47027527b"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g105220f1c95f9888b696a3e47027527b" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1ef1774e0fcc4f632fe0af2591781c4c"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g1ef1774e0fcc4f632fe0af2591781c4c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="tbb::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
+template<typename F0, typename F1> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb91fec4e7ba49754ad583ccb127afc66"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gb91fec4e7ba49754ad583ccb127afc66" args="(const F0 &f0, const F1 &f1, const F2 &f2)" -->
+template<typename F0, typename F1, typename F2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g421d0f66ee69eea134a35d1ae371d8d6"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g421d0f66ee69eea134a35d1ae371d8d6" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)" -->
+template<typename F0, typename F1, typename F2, typename F3> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8aacce74d691b4f44a0f7becadd9578c"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g8aacce74d691b4f44a0f7becadd9578c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8cc6994f7cd6eaf25feb5d7cc04a2e64"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g8cc6994f7cd6eaf25feb5d7cc04a2e64" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g995ba9583ae24bddb8bd9a599cc8b4c7"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g995ba9583ae24bddb8bd9a599cc8b4c7" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g34341a4c24c6f548886cd14077374c5c"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g34341a4c24c6f548886cd14077374c5c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2a11342753488d460866d48370a69517"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g2a11342753488d460866d48370a69517" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gffcf6835ceee43455f310352a3b4faa5"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gffcf6835ceee43455f310352a3b4faa5" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)</td></tr>
+
+<tr><td colspan="2"><br><h2>parallel_reduce</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gec1b7c03f9da909bef5db12e3d41bed3"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gec1b7c03f9da909bef5db12e3d41bed3" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00341.html">simple_partitioner</a> &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00341.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g18a19157e6245992fc00ca0adeb7dd37"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g18a19157e6245992fc00ca0adeb7dd37" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00269.html">auto_partitioner</a> &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00269.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc61e73fcc36c92d79a217fc355ff4a6b"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gc61e73fcc36c92d79a217fc355ff4a6b" args="(const Range &range, Body &body, affinity_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00261.html">affinity_partitioner</a> &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00261.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g45cb00c42a18e334bbde8b7535afe460"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g45cb00c42a18e334bbde8b7535afe460" args="(const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00341.html">simple_partitioner</a> &partitioner, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c1ea1d7c61b3c225e92c70d669a53a5"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g1c1ea1d7c61b3c225e92c70d669a53a5" args="(const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00269.html">auto_partitioner</a> &partitioner, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00269.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd9ac3a3811060314695f33b703c6e11b"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gd9ac3a3811060314695f33b703c6e11b" args="(const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00261.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00261.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9412e09fb01fcad8c018ea9cffb28ef"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gc9412e09fb01fcad8c018ea9cffb28ef" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc9412e09fb01fcad8c018ea9cffb28ef">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gaddffeec0e892ac3d6fc7fc2053e1eca"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gaddffeec0e892ac3d6fc7fc2053e1eca" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00341.html">simple_partitioner</a> &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00341.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb175401f0729e40dd2c5860a17c14385"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gb175401f0729e40dd2c5860a17c14385" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00269.html">auto_partitioner</a> &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00269.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb7f1f1828ae2b330ce05b8513a495154"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gb7f1f1828ae2b330ce05b8513a495154" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00261.html">affinity_partitioner</a> &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00261.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfbc0cc2026d87f11a96bcd62788f5bb5"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gfbc0cc2026d87f11a96bcd62788f5bb5" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00341.html">simple_partitioner</a> &partitioner, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g630c90a399937d9d4ae70ff883186dfd"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g630c90a399937d9d4ae70ff883186dfd" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00269.html">auto_partitioner</a> &partitioner, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00269.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g496bd7eadb3b97495ccb5655ef90319e"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g496bd7eadb3b97495ccb5655ef90319e" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00261.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00261.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g873006cc80868b5b4604822bf100ddeb"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="g873006cc80868b5b4604822bf100ddeb" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfd08c56b3a98d4437dadc5365326928a"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="gfd08c56b3a98d4437dadc5365326928a" args="(const Range &range, Body &body, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gfd08c56b3a98d4437dadc5365326928a">parallel_deterministic_reduce</a> (const Range &range, Body &body, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3edb17bb1967c291d227556e0e47e507"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="g3edb17bb1967c291d227556e0e47e507" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g3edb17bb1967c291d227556e0e47e507">parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g0a66bc67567b2d01d709b59b9bddf84a"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="g0a66bc67567b2d01d709b59b9bddf84a" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g0a66bc67567b2d01d709b59b9bddf84a">parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00353.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_scan</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_scan_body_req.html">parallel_scan Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ged143f31dd3d96ded02ab3db915b91c7"></a><!-- doxytag: member="tbb::parallel_scan" ref="ged143f31dd3d96ded02ab3db915b91c7" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9fac8870b2e6365fb337014404529df"></a><!-- doxytag: member="tbb::parallel_scan" ref="gc9fac8870b2e6365fb337014404529df" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00341.html">simple_partitioner</a> &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00341.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g62fde400a37bbca1a2fddc8e3d22f556"></a><!-- doxytag: member="tbb::parallel_scan" ref="g62fde400a37bbca1a2fddc8e3d22f556" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00269.html">auto_partitioner</a> &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00269.html">auto_partitioner</a>. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_sort</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="parallel_sort_iter_req.html">iterators for parallel_sort</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename RandomAccessIterator, typename Compare> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator. <a href="a00441.html#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g16c3eb77d0e530834c51ce3857f01012"></a><!-- doxytag: member="tbb::parallel_sort" ref="g16c3eb77d0e530834c51ce3857f01012" args="(RandomAccessIterator begin, RandomAccessIterator end)" -->
+template<typename RandomAccessIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g16c3eb77d0e530834c51ce3857f01012">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) with a default comparator <code>std::less<RandomAccessIterator></code>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc7576f82fdedc8a701a6c17ad9415926"></a><!-- doxytag: member="tbb::parallel_sort" ref="gc7576f82fdedc8a701a6c17ad9415926" args="(T *begin, T *end)" -->
+template<typename T> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc7576f82fdedc8a701a6c17ad9415926">parallel_sort</a> (T *begin, T *end)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
+<tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf4486f36580f7d4bf95aed2e052a380"></a><!-- doxytag: member="tbb::critical_section" ref="bf4486f36580f7d4bf95aed2e052a380" args="" -->
+typedef internal::critical_section_v4 </td><td class="memItemRight" valign="bottom"><b>critical_section</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fdc2b067a243747d4c3dfe6f3d28476"></a><!-- doxytag: member="tbb::spin_rw_mutex" ref="7fdc2b067a243747d4c3dfe6f3d28476" args="" -->
+typedef <a class="el" href="a00345.html">spin_rw_mutex_v3</a> </td><td class="memItemRight" valign="bottom"><b>spin_rw_mutex</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3d457eb737199125df5ab0cf2f44094"></a><!-- doxytag: member="tbb::stack_size_type" ref="a3d457eb737199125df5ab0cf2f44094" args="" -->
+typedef std::size_t </td><td class="memItemRight" valign="bottom"><b>stack_size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="621a403f1b13bcec95297344f205d922"></a><!-- doxytag: member="tbb::task_scheduler_observer" ref="621a403f1b13bcec95297344f205d922" args="" -->
+typedef tbb::internal::task_scheduler_observer_v3 </td><td class="memItemRight" valign="bottom"><b>task_scheduler_observer</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> { <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>,
+<a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
+<a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>,
+<a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies memory semantics. <a href="a00428.html#a8686246bb5d3664bd07563749970fef">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { <b>ets_key_per_instance</b>,
+<b>ets_no_key</b>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">enum for selecting between single key and key-per-instance versions <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>priority_t</b> { <b>priority_normal</b> = internal::priority_stride_v4 * 2,
+<b>priority_low</b> = priority_normal - internal::priority_stride_v4,
+<b>priority_high</b> = priority_normal + internal::priority_stride_v4
+ }</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>task_group_status</b> { <b>not_complete</b>,
+<b>complete</b>,
+<b>canceled</b>
+ }</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00354.html#_details">More...</a><br></td></tr>
<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e067bc86f20023cf3034f2ac310927b"></a><!-- doxytag: member="tbb::__TBB_DECL_ATOMIC" ref="2e067bc86f20023cf3034f2ac310927b" args="(__TBB_LONG_LONG) __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG) __TBB_DECL_ATOMIC(long) __TBB_DECL_ATOMIC(unsigned long) __TBB_DECL_ATOMIC_ALT(unsigned" -->
+ </td><td class="memItemRight" valign="bottom"><b>__TBB_DECL_ATOMIC</b> (__TBB_LONG_LONG) __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG) __TBB_DECL_ATOMIC(long) __TBB_DECL_ATOMIC(unsigned long) __TBB_DECL_ATOMIC_ALT(unsigned</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad165cf61abbe349d413df2589679add"></a><!-- doxytag: member="tbb::__TBB_DECL_ATOMIC_ALT" ref="ad165cf61abbe349d413df2589679add" args="(int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > st [...]
+size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a> (int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > struct <a class="el" href="a00266.html">atomic</a>< T * ></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for atomic<T*> with arithmetic and operator->. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1ef5059a6b85fad2e4d510a5a095f2a1"></a><!-- doxytag: member="tbb::load" ref="1ef5059a6b85fad2e4d510a5a095f2a1" args="(const atomic< T > &a)" -->
+template<memory_semantics M, typename T> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>load</b> (const <a class="el" href="a00266.html">atomic</a>< T > &a)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0fc5e34a898372157343886babe84045"></a><!-- doxytag: member="tbb::store" ref="0fc5e34a898372157343886babe84045" args="(atomic< T > &a, T value)" -->
+template<memory_semantics M, typename T> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>store</b> (<a class="el" href="a00266.html">atomic</a>< T > &a, T value)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7af9509624a62ea848afe775f892ed12"></a><!-- doxytag: member="tbb::operator==" ref="7af9509624a62ea848afe775f892ed12" args="(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)" -->
+template<typename T, typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00276.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00276.html">cache_aligned_allocator</a>< U > &)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="426abbf5243087148f5e3767e68c286b"></a><!-- doxytag: member="tbb::operator!=" ref="426abbf5243087148f5e3767e68c286b" args="(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)" -->
+template<typename T, typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00276.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00276.html">cache_aligned_allocator</a>< U > &)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f3609fc523a99c101572fdc68f918d66"></a><!-- doxytag: member="tbb::operator==" ref="f3609fc523a99c101572fdc68f918d66" args="(const concurrent_hash_map< Key, T, HashCompare, A1 > &a, const concurrent_hash_map< Key, T, HashCompare, A2 > &b)" -->
+template<typename Key, typename T, typename HashCompare, typename A1, typename A2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00281.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00281.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="2da30ff86b9a39722f45bc35e1c6934d"></a><!-- doxytag: member="tbb::operator!=" ref="2da30ff86b9a39722f45bc35e1c6934d" args="(const concurrent_hash_map< Key, T, HashCompare, A1 > &a, const concurrent_hash_map< Key, T, HashCompare, A2 > &b)" -->
+template<typename Key, typename T, typename HashCompare, typename A1, typename A2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00281.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00281.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="817c20df80fe1a933a8557eb76113e24"></a><!-- doxytag: member="tbb::swap" ref="817c20df80fe1a933a8557eb76113e24" args="(concurrent_hash_map< Key, T, HashCompare, A > &a, concurrent_hash_map< Key, T, HashCompare, A > &b)" -->
+template<typename Key, typename T, typename HashCompare, typename A> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00281.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &a, <a class="el" href="a00281.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &b)</td></tr>
-</table>
-<hr><h2>Function Documentation</h2>
-<a class="anchor" name="g65a20e812012f15ec7442d5b45d0cba5"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_free" ref="g65a20e812012f15ec7442d5b45d0cba5" args="(void *ptr)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_FUNC scalable_aligned_free </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="11419db87ac98110907dda08a24f0949"></a><!-- doxytag: member="tbb::operator==" ref="11419db87ac98110907dda08a24f0949" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
+template<typename T, class A1, class A2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00288.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00288.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-<p>
-The "_aligned_free" analogue.
-</div>
-</div><p>
-<a class="anchor" name="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_malloc" ref="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7" args="(size_t size, size_t alignment)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_malloc </td>
- <td>(</td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>alignment</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="aa9e09f2e9154ffd6658fad8355fb491"></a><!-- doxytag: member="tbb::operator!=" ref="aa9e09f2e9154ffd6658fad8355fb491" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
+template<typename T, class A1, class A2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00288.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00288.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-<p>
-The "_aligned_malloc" analogue.
-</div>
-</div><p>
-<a class="anchor" name="gbaea91376be80dfabd7c93eaffd9abaa"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_realloc" ref="gbaea91376be80dfabd7c93eaffd9abaa" args="(void *ptr, size_t size, size_t alignment)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_realloc </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>alignment</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="33267dd805415351956d45b4b5347190"></a><!-- doxytag: member="tbb::operator<" ref="33267dd805415351956d45b4b5347190" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
+template<typename T, class A1, class A2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<</b> (const <a class="el" href="a00288.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00288.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-<p>
-The "_aligned_realloc" analogue.
-</div>
-</div><p>
-<a class="anchor" name="g3f5a2fde0bcaa3eda35be32c8658f444"></a><!-- doxytag: member="scalable_allocator.h::scalable_calloc" ref="g3f5a2fde0bcaa3eda35be32c8658f444" args="(size_t nobj, size_t size)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_calloc </td>
- <td>(</td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>nobj</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="14e2968ab20cb714bef1f0352fc152f0"></a><!-- doxytag: member="tbb::operator>" ref="14e2968ab20cb714bef1f0352fc152f0" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
+template<typename T, class A1, class A2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator></b> (const <a class="el" href="a00288.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00288.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
-<p>
-The "calloc" analogue complementing scalable_malloc.
-</div>
-</div><p>
-<a class="anchor" name="gca3579c21244dba9f0c351e5984d4565"></a><!-- doxytag: member="scalable_allocator.h::scalable_free" ref="gca3579c21244dba9f0c351e5984d4565" args="(void *ptr)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_FUNC scalable_free </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0042a36a670a397fb52e713edbaecd0e"></a><!-- doxytag: member="tbb::operator<=" ref="0042a36a670a397fb52e713edbaecd0e" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
+template<typename T, class A1, class A2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<=</b> (const <a class="el" href="a00288.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00288.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f70eb1d931473b69ba4bcf93af8baa33"></a><!-- doxytag: member="tbb::operator>=" ref="f70eb1d931473b69ba4bcf93af8baa33" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
+template<typename T, class A1, class A2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator>=</b> (const <a class="el" href="a00288.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00288.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4a3897ea8d8a48e885d764bd7d370d50"></a><!-- doxytag: member="tbb::swap" ref="4a3897ea8d8a48e885d764bd7d370d50" args="(concurrent_vector< T, A > &a, concurrent_vector< T, A > &b)" -->
+template<typename T, class A> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00288.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00288.html">concurrent_vector</a>< T, A > &b)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="tbb::operator==" ref="906ebb461ecb0446989739fd0399e4b8" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
+template<typename T, typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00337.html">scalable_allocator</a>< T > &, const <a class="el" href="a00337.html">scalable_allocator</a>< U > &)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a92757aca0a69082eb8dc223eb257433"></a><!-- doxytag: member="tbb::operator!=" ref="a92757aca0a69082eb8dc223eb257433" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
+template<typename T, typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00337.html">scalable_allocator</a>< T > &, const <a class="el" href="a00337.html">scalable_allocator</a>< U > &)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7e2f5baabe173fbf48e94fb9058f1b41"></a><!-- doxytag: member="tbb::is_current_task_group_canceling" ref="7e2f5baabe173fbf48e94fb9058f1b41" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>is_current_task_group_canceling</b> ()</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="3bb9a8b837a9b7c4b5107caf01e81329"></a><!-- doxytag: member="tbb::make_task" ref="3bb9a8b837a9b7c4b5107caf01e81329" args="(const F &f)" -->
+template<class F> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">task_handle< F > </td><td class="memTemplItemRight" valign="bottom"><b>make_task</b> (const F &f)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c8a46d6c0fe474eb399d0d09c27a4685"></a><!-- doxytag: member="tbb::operator==" ref="c8a46d6c0fe474eb399d0d09c27a4685" args="(const tbb_allocator< T > &, const tbb_allocator< U > &)" -->
+template<typename T, typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00356.html">tbb_allocator</a>< T > &, const <a class="el" href="a00356.html">tbb_allocator</a>< U > &)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="3d9665c21c894f06f1614947103dc9d6"></a><!-- doxytag: member="tbb::operator!=" ref="3d9665c21c894f06f1614947103dc9d6" args="(const tbb_allocator< T > &, const tbb_allocator< U > &)" -->
+template<typename T, typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00356.html">tbb_allocator</a>< T > &, const <a class="el" href="a00356.html">tbb_allocator</a>< U > &)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="b64fb7e52f0049b5a103cbb6fb5814f0"></a><!-- doxytag: member="tbb::operator==" ref="b64fb7e52f0049b5a103cbb6fb5814f0" args="(const zero_allocator< T1, B1 > &a, const zero_allocator< T2, B2 > &b)" -->
+template<typename T1, template< typename X1 > class B1, typename T2, template< typename X2 > class B2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00366.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00366.html">zero_allocator</a>< T2, B2 > &b)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ae43b5151d0220fe3ade0b447cd64f0d"></a><!-- doxytag: member="tbb::operator!=" ref="ae43b5151d0220fe3ade0b447cd64f0d" args="(const zero_allocator< T1, B1 > &a, const zero_allocator< T2, B2 > &b)" -->
+template<typename T1, template< typename X1 > class B1, typename T2, template< typename X2 > class B2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00366.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00366.html">zero_allocator</a>< T2, B2 > &b)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="250275615f10d5b5de6ad466ae2f54de"></a><!-- doxytag: member="tbb::atomic_fence" ref="250275615f10d5b5de6ad466ae2f54de" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sequentially consistent full memory fence. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The function returns the interface version of the TBB shared library being used. <a href="#a6858b22e90041c9c4669674ff39b056"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6a42aa5dbcf06ba86c71efb73d8311c3"></a><!-- doxytag: member="tbb::operator-" ref="6a42aa5dbcf06ba86c71efb73d8311c3" args="(const tick_count &t1, const tick_count &t0)" -->
+<a class="el" href="a00363.html">tick_count::interval_t</a> </td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="a00362.html">tick_count</a> &t1, const <a class="el" href="a00362.html">tick_count</a> &t0)</td></tr>
+
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The namespace tbb contains all components of the library.
<p>
-The "free" analogue to discard a previously allocated piece of memory.
-</div>
-</div><p>
-<a class="anchor" name="gc25b8e6c76db0b346a8249796a7a2475"></a><!-- doxytag: member="scalable_allocator.h::scalable_malloc" ref="gc25b8e6c76db0b346a8249796a7a2475" args="(size_t size)" -->
+This header provides basic platform abstraction layer by hooking up appropriate architecture/OS/compiler specific headers from the /include/tbb/machine directory. If a plug-in header does not implement all the required APIs, it must specify the missing ones by setting one or more of the following macros:<p>
+__TBB_USE_GENERIC_PART_WORD_CAS __TBB_USE_GENERIC_PART_WORD_FETCH_ADD __TBB_USE_GENERIC_PART_WORD_FETCH_STORE __TBB_USE_GENERIC_FETCH_ADD __TBB_USE_GENERIC_FETCH_STORE __TBB_USE_GENERIC_DWORD_FETCH_ADD __TBB_USE_GENERIC_DWORD_FETCH_STORE __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE __TBB_USE_GENERIC_FULL_FENCED_LOAD_STORE __TBB_USE_GENERIC_RELAXED_LOAD_STORE __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE<p>
+In this case tbb_machine.h will add missing functionality based on a minimal set of APIs that are required to be implemented by all plug-n headers as described further. Note that these generic implementations may be sub-optimal for a particular architecture, and thus should be relied upon only after careful evaluation or as the last resort.<p>
+Additionally __TBB_64BIT_ATOMICS can be set to 0 on a 32-bit architecture to indicate that the port is not going to support double word atomics. It may also be set to 1 explicitly, though normally this is not necessary as tbb_machine.h will set it automatically.<p>
+__TBB_ENDIANNESS macro can be defined by the implementation as well. It is used only if __TBB_USE_GENERIC_PART_WORD_CAS is set (or for testing), and must specify the layout of aligned 16-bit and 32-bit data anywhere within a process (while the details of unaligned 16-bit or 32-bit data or of 64-bit data are irrelevant). The layout must be the same at all relevant memory locations within the current process; in case of page-specific endianness, one endianness must be kept "out of sight". [...]
+<li>__TBB_ENDIAN_BIG for big-endian data,</li><li>__TBB_ENDIAN_LITTLE for little-endian data,</li><li>__TBB_ENDIAN_DETECT for run-time detection iff exactly one of the above,</li><li>__TBB_ENDIAN_UNSUPPORTED to prevent undefined behavior if none of the above.</li></ul>
+<p>
+Prerequisites for each architecture port ---------------------------------------- The following functions and macros have no generic implementation. Therefore they must be implemented in each machine architecture specific header either as a conventional function or as a functional macro.<p>
+__TBB_WORDSIZE This is the size of machine word in bytes, i.e. for 32 bit systems it should be defined to 4.<p>
+__TBB_Yield() Signals OS that the current thread is willing to relinquish the remainder of its time quantum.<p>
+__TBB_full_memory_fence() Must prevent all memory operations from being reordered across it (both by hardware and compiler). All such fences must be totally ordered (or sequentially consistent).<p>
+__TBB_machine_cmpswp4( volatile void *ptr, int32_t value, int32_t comparand ) Must be provided if __TBB_USE_FENCED_ATOMICS is not set.<p>
+__TBB_machine_cmpswp8( volatile void *ptr, int32_t value, int64_t comparand ) Must be provided for 64-bit architectures if __TBB_USE_FENCED_ATOMICS is not set, and for 32-bit architectures if __TBB_64BIT_ATOMICS is set<p>
+__TBB_machine_<op><S><fence>(...), where <op> = {cmpswp, fetchadd, fetchstore} <S> = {1, 2, 4, 8} <fence> = {full_fence, acquire, release, relaxed} Must be provided if __TBB_USE_FENCED_ATOMICS is set.<p>
+__TBB_control_consistency_helper() Bridges the memory-semantics gap between architectures providing only implicit C++0x "consume" semantics (like Power Architecture) and those also implicitly obeying control dependencies (like IA-64). It must be used only in conditional code where the condition is itself data-dependent, and will then make subsequent code behave as if the original data dependency were acquired. It needs only a compiler fence where implied by the architecture either specif [...]
+__TBB_acquire_consistency_helper(), __TBB_release_consistency_helper() Must be provided if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE is set. Enforce acquire and release semantics in generic implementations of fenced store and load operations. Depending on the particular architecture/compiler combination they may be a hardware fence, a compiler fence, both or nothing.
+<p>
+<hr><h2>Enumeration Type Documentation</h2>
+<a class="anchor" name="a8686246bb5d3664bd07563749970fef"></a><!-- doxytag: member="tbb::memory_semantics" ref="a8686246bb5d3664bd07563749970fef" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_malloc </td>
- <td>(</td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em> </td>
- <td> ) </td>
- <td width="100%"></td>
+ <td class="memname">enum <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef">tbb::memory_semantics</a> </td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-The "malloc" analogue to allocate block of memory of size bytes.
+Specifies memory semantics.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff"></a><!-- doxytag: member="full_fence" ref="a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff" args="" -->full_fence</em> </td><td>
+Sequential consistency. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7"></a><!-- doxytag: member="acquire" ref="a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7" args="" -->acquire</em> </td><td>
+Acquire. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70"></a><!-- doxytag: member="release" ref="a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70" args="" -->release</em> </td><td>
+Release. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900"></a><!-- doxytag: member="relaxed" ref="a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900" args="" -->relaxed</em> </td><td>
+No ordering. </td></tr>
+</table>
+</dl>
+
</div>
</div><p>
-<a class="anchor" name="g0965ce1b4b7835f92869c7fd867265f7"></a><!-- doxytag: member="scalable_allocator.h::scalable_msize" ref="g0965ce1b4b7835f92869c7fd867265f7" args="(void *ptr)" -->
+<hr><h2>Function Documentation</h2>
+<a class="anchor" name="a6858b22e90041c9c4669674ff39b056"></a><!-- doxytag: member="tbb::TBB_runtime_interface_version" ref="a6858b22e90041c9c4669674ff39b056" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">size_t __TBB_EXPORTED_FUNC scalable_msize </td>
+ <td class="memname">int __TBB_EXPORTED_FUNC tbb::TBB_runtime_interface_version </td>
<td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em> </td>
+ <td class="paramname"> </td>
<td> ) </td>
<td width="100%"></td>
</tr>
@@ -241,76 +656,14 @@ The "malloc" analogue to allocate block of memory of size bytes.
<div class="memdoc">
<p>
-The analogue of _msize/malloc_size/malloc_usable_size. Returns the usable size of a memory block previously allocated by scalable_*, or 0 (zero) if ptr does not point to such a block.
-</div>
-</div><p>
-<a class="anchor" name="g05dcec987480bb2c82ecdead6a085899"></a><!-- doxytag: member="scalable_allocator.h::scalable_posix_memalign" ref="g05dcec987480bb2c82ecdead6a085899" args="(void **memptr, size_t alignment, size_t size)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int __TBB_EXPORTED_FUNC scalable_posix_memalign </td>
- <td>(</td>
- <td class="paramtype">void ** </td>
- <td class="paramname"> <em>memptr</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>alignment</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "posix_memalign" analogue.
-</div>
-</div><p>
-<a class="anchor" name="g951bbbbd2d041acb59ba5fa910b52543"></a><!-- doxytag: member="scalable_allocator.h::scalable_realloc" ref="g951bbbbd2d041acb59ba5fa910b52543" args="(void *ptr, size_t size)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_realloc </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+The function returns the interface version of the TBB shared library being used.
<p>
-The "realloc" analogue complementing scalable_malloc.
+The version it returns is determined at runtime, not at compile/link time. So it can be different than the value of TBB_INTERFACE_VERSION obtained at compile time.
</div>
</div><p>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00432.html b/doc/html/a00432.html
deleted file mode 100644
index 1eb992a..0000000
--- a/doc/html/a00432.html
+++ /dev/null
@@ -1,219 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>aggregator.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>aggregator.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB__aggregator_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB__aggregator_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if !TBB_PREVIEW_AGGREGATOR</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#error Set TBB_PREVIEW_AGGREGATOR before including aggregator.h</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00030"></a>00030
-<a name="l00031"></a><a class="code" href="a00414.html">00031</a> <span class="keyword">namespace </span>tbb {
-<a name="l00032"></a>00032 <span class="keyword">namespace </span>interface6 {
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00035"></a>00035
-<a name="l00036"></a>00036 <span class="keyword">class </span>aggregator_operation {
-<a name="l00037"></a>00037 <span class="keyword">template</span><<span class="keyword">typename</span> handler_type> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00252.html">aggregator_ext</a>;
-<a name="l00038"></a>00038 uintptr_t status;
-<a name="l00039"></a>00039 aggregator_operation* my_next;
-<a name="l00040"></a>00040 <span class="keyword">public</span>:
-<a name="l00041"></a>00041 <span class="keyword">enum</span> aggregator_operation_status { agg_waiting=0, agg_finished };
-<a name="l00042"></a>00042 aggregator_operation() : status(agg_waiting), my_next(NULL) {}
-<a name="l00044"></a>00044 <span class="keywordtype">void</span> start() { call_itt_notify(acquired, &status); }
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="keywordtype">void</span> finish() { itt_store_word_with_release(status, uintptr_t(agg_finished)); }
-<a name="l00048"></a>00048 aggregator_operation* next() { <span class="keywordflow">return</span> itt_hide_load_word(my_next);}
-<a name="l00049"></a>00049 <span class="keywordtype">void</span> set_next(aggregator_operation* n) { itt_hide_store_word(my_next, n); }
-<a name="l00050"></a>00050 };
-<a name="l00051"></a>00051
-<a name="l00052"></a>00052 <span class="keyword">namespace </span>internal {
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keyword">class </span>basic_operation_base : <span class="keyword">public</span> aggregator_operation {
-<a name="l00055"></a>00055 <span class="keyword">friend</span> <span class="keyword">class </span>basic_handler;
-<a name="l00056"></a>00056 <span class="keyword">virtual</span> <span class="keywordtype">void</span> apply_body() = 0;
-<a name="l00057"></a>00057 <span class="keyword">public</span>:
-<a name="l00058"></a>00058 basic_operation_base() : aggregator_operation() {}
-<a name="l00059"></a>00059 <span class="keyword">virtual</span> ~basic_operation_base() {}
-<a name="l00060"></a>00060 };
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00063"></a>00063 <span class="keyword">class </span>basic_operation : <span class="keyword">public</span> basic_operation_base, no_assign {
-<a name="l00064"></a>00064 <span class="keyword">const</span> Body& my_body;
-<a name="l00065"></a>00065 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> apply_body() { my_body(); }
-<a name="l00066"></a>00066 <span class="keyword">public</span>:
-<a name="l00067"></a>00067 basic_operation(<span class="keyword">const</span> Body& b) : basic_operation_base(), my_body(b) {}
-<a name="l00068"></a>00068 };
-<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <span class="keyword">class </span>basic_handler {
-<a name="l00071"></a>00071 <span class="keyword">public</span>:
-<a name="l00072"></a>00072 basic_handler() {}
-<a name="l00073"></a>00073 <span class="keywordtype">void</span> operator()(aggregator_operation* op_list)<span class="keyword"> const </span>{
-<a name="l00074"></a>00074 <span class="keywordflow">while</span> (op_list) {
-<a name="l00075"></a>00075 <span class="comment">// ITT note: &(op_list->status) tag is used to cover accesses to the operation data.</span>
-<a name="l00076"></a>00076 <span class="comment">// The executing thread "acquires" the tag (see start()) and then performs</span>
-<a name="l00077"></a>00077 <span class="comment">// the associated operation w/o triggering a race condition diagnostics.</span>
-<a name="l00078"></a>00078 <span class="comment">// A thread that created the operation is waiting for its status (see execute_impl()),</span>
-<a name="l00079"></a>00079 <span class="comment">// so when this thread is done with the operation, it will "release" the tag </span>
-<a name="l00080"></a>00080 <span class="comment">// and update the status (see finish()) to give control back to the waiting thread.</span>
-<a name="l00081"></a>00081 basic_operation_base& request = static_cast<basic_operation_base&>(*op_list);
-<a name="l00082"></a>00082 <span class="comment">// IMPORTANT: need to advance op_list to op_list->next() before calling request.finish()</span>
-<a name="l00083"></a>00083 op_list = op_list->next();
-<a name="l00084"></a>00084 request.start();
-<a name="l00085"></a>00085 request.apply_body();
-<a name="l00086"></a>00086 request.finish();
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088 }
-<a name="l00089"></a>00089 };
-<a name="l00090"></a>00090
-<a name="l00091"></a>00091 } <span class="comment">// namespace internal</span>
-<a name="l00092"></a>00092
-<a name="l00094"></a>00094
-<a name="l00096"></a>00096 <span class="keyword">template</span> <<span class="keyword">typename</span> handler_type>
-<a name="l00097"></a><a class="code" href="a00252.html">00097</a> <span class="keyword">class </span><a class="code" href="a00252.html">aggregator_ext</a> : tbb::internal::no_copy {
-<a name="l00098"></a>00098 <span class="keyword">public</span>:
-<a name="l00099"></a>00099 <a class="code" href="a00252.html">aggregator_ext</a>(<span class="keyword">const</span> handler_type& h) : handler_busy(0), handle_operations(h) { mailbox = NULL; }
-<a name="l00100"></a>00100
-<a name="l00102"></a>00102
-<a name="l00103"></a><a class="code" href="a00252.html#ccd88bf4333dc100ba97da8e2170277d">00103</a> <span class="keywordtype">void</span> <a class="code" href="a00252.html#ccd88bf4333dc100ba97da8e2170277d">process</a>(aggregator_operation *op) { <a class="code" href="a00252.html#fdd0a9ce522246b9e14ae5e44bc72d31">execute_impl</a>(*op); }
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keyword">protected</span>:
-<a name="l00108"></a><a class="code" href="a00252.html#fdd0a9ce522246b9e14ae5e44bc72d31">00108</a> <span class="keywordtype">void</span> <a class="code" href="a00252.html#fdd0a9ce522246b9e14ae5e44bc72d31">execute_impl</a>(aggregator_operation& op) {
-<a name="l00109"></a>00109 aggregator_operation* res;
-<a name="l00110"></a>00110
-<a name="l00111"></a>00111 <span class="comment">// ITT note: &(op.status) tag is used to cover accesses to this operation. This</span>
-<a name="l00112"></a>00112 <span class="comment">// thread has created the operation, and now releases it so that the handler</span>
-<a name="l00113"></a>00113 <span class="comment">// thread may handle the associated operation w/o triggering a race condition;</span>
-<a name="l00114"></a>00114 <span class="comment">// thus this tag will be acquired just before the operation is handled in the</span>
-<a name="l00115"></a>00115 <span class="comment">// handle_operations functor.</span>
-<a name="l00116"></a>00116 call_itt_notify(releasing, &(op.status));
-<a name="l00117"></a>00117 <span class="comment">// insert the operation in the queue</span>
-<a name="l00118"></a>00118 <span class="keywordflow">do</span> {
-<a name="l00119"></a>00119 <span class="comment">// ITT may flag the following line as a race; it is a false positive:</span>
-<a name="l00120"></a>00120 <span class="comment">// This is an atomic read; we don't provide itt_hide_load_word for atomics</span>
-<a name="l00121"></a>00121 op.my_next = res = mailbox; <span class="comment">// NOT A RACE </span>
-<a name="l00122"></a>00122 } <span class="keywordflow">while</span> (mailbox.compare_and_swap(&op, res) != res);
-<a name="l00123"></a>00123 <span class="keywordflow">if</span> (!res) { <span class="comment">// first in the list; handle the operations</span>
-<a name="l00124"></a>00124 <span class="comment">// ITT note: &mailbox tag covers access to the handler_busy flag, which this</span>
-<a name="l00125"></a>00125 <span class="comment">// waiting handler thread will try to set before entering handle_operations.</span>
-<a name="l00126"></a>00126 call_itt_notify(acquired, &mailbox);
-<a name="l00127"></a>00127 start_handle_operations();
-<a name="l00128"></a>00128 __TBB_ASSERT(op.status, NULL);
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130 <span class="keywordflow">else</span> { <span class="comment">// not first; wait for op to be ready</span>
-<a name="l00131"></a>00131 call_itt_notify(prepare, &(op.status));
-<a name="l00132"></a>00132 spin_wait_while_eq(op.status, uintptr_t(aggregator_operation::agg_waiting));
-<a name="l00133"></a>00133 itt_load_word_with_acquire(op.status);
-<a name="l00134"></a>00134 }
-<a name="l00135"></a>00135 }
-<a name="l00136"></a>00136
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138 <span class="keyword">private</span>:
-<a name="l00140"></a>00140 <a class="code" href="a00254.html">atomic<aggregator_operation *></a> mailbox;
-<a name="l00141"></a>00141
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 uintptr_t handler_busy;
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 handler_type handle_operations;
-<a name="l00147"></a>00147
-<a name="l00149"></a>00149 <span class="keywordtype">void</span> start_handle_operations() {
-<a name="l00150"></a>00150 aggregator_operation *pending_operations;
-<a name="l00151"></a>00151
-<a name="l00152"></a>00152 <span class="comment">// ITT note: &handler_busy tag covers access to mailbox as it is passed</span>
-<a name="l00153"></a>00153 <span class="comment">// between active and waiting handlers. Below, the waiting handler waits until</span>
-<a name="l00154"></a>00154 <span class="comment">// the active handler releases, and the waiting handler acquires &handler_busy as</span>
-<a name="l00155"></a>00155 <span class="comment">// it becomes the active_handler. The release point is at the end of this</span>
-<a name="l00156"></a>00156 <span class="comment">// function, when all operations in mailbox have been handled by the</span>
-<a name="l00157"></a>00157 <span class="comment">// owner of this aggregator.</span>
-<a name="l00158"></a>00158 call_itt_notify(prepare, &handler_busy);
-<a name="l00159"></a>00159 <span class="comment">// get handler_busy: only one thread can possibly spin here at a time</span>
-<a name="l00160"></a>00160 spin_wait_until_eq(handler_busy, uintptr_t(0));
-<a name="l00161"></a>00161 call_itt_notify(acquired, &handler_busy);
-<a name="l00162"></a>00162 <span class="comment">// acquire fence not necessary here due to causality rule and surrounding atomics</span>
-<a name="l00163"></a>00163 __TBB_store_with_release(handler_busy, uintptr_t(1));
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="comment">// ITT note: &mailbox tag covers access to the handler_busy flag itself. </span>
-<a name="l00166"></a>00166 <span class="comment">// Capturing the state of the mailbox signifies that handler_busy has been </span>
-<a name="l00167"></a>00167 <span class="comment">// set and a new active handler will now process that list's operations.</span>
-<a name="l00168"></a>00168 call_itt_notify(releasing, &mailbox);
-<a name="l00169"></a>00169 <span class="comment">// grab pending_operations</span>
-<a name="l00170"></a>00170 pending_operations = mailbox.fetch_and_store(NULL);
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="comment">// handle all the operations</span>
-<a name="l00173"></a>00173 handle_operations(pending_operations);
-<a name="l00174"></a>00174
-<a name="l00175"></a>00175 <span class="comment">// release the handler</span>
-<a name="l00176"></a>00176 itt_store_word_with_release(handler_busy, uintptr_t(0));
-<a name="l00177"></a>00177 }
-<a name="l00178"></a>00178 };
-<a name="l00179"></a>00179
-<a name="l00181"></a><a class="code" href="a00251.html">00181</a> <span class="keyword">class </span><a class="code" href="a00251.html">aggregator</a> : <span class="keyword">private</span> <a class="code" href="a00252.html">aggregator_ext</a><internal::basic_handler> {
-<a name="l00182"></a>00182 <span class="keyword">public</span>:
-<a name="l00183"></a>00183 <a class="code" href="a00251.html">aggregator</a>() : <a class="code" href="a00252.html">aggregator_ext<internal::basic_handler></a>(internal::basic_handler()) {}
-<a name="l00185"></a>00185
-<a name="l00187"></a>00187 template<typename Body>
-<a name="l00188"></a><a class="code" href="a00251.html#641c8dc43652589d12eefaef130c094d">00188</a> <span class="keywordtype">void</span> <a class="code" href="a00251.html#641c8dc43652589d12eefaef130c094d">execute</a>(<span class="keyword">const</span> Body& b) {
-<a name="l00189"></a>00189 internal::basic_operation<Body> op(b);
-<a name="l00190"></a>00190 this-><a class="code" href="a00252.html#fdd0a9ce522246b9e14ae5e44bc72d31">execute_impl</a>(op);
-<a name="l00191"></a>00191 }
-<a name="l00192"></a>00192 };
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 } <span class="comment">// namespace interface6</span>
-<a name="l00195"></a>00195
-<a name="l00196"></a>00196 <span class="keyword">using</span> interface6::aggregator;
-<a name="l00197"></a>00197 <span class="keyword">using</span> interface6::aggregator_ext;
-<a name="l00198"></a>00198 <span class="keyword">using</span> interface6::aggregator_operation;
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 } <span class="comment">// namespace tbb</span>
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="preprocessor">#endif // __TBB__aggregator_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00440.html b/doc/html/a00440.html
deleted file mode 100644
index e394dd2..0000000
--- a/doc/html/a00440.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>aligned_space.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>aligned_space.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_aligned_space_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_aligned_space_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030
-<a name="l00032"></a>00032 <span class="keyword">template</span><<span class="keyword">typename</span> T,size_t N>
-<a name="l00033"></a><a class="code" href="a00253.html">00033</a> <span class="keyword">class </span><a class="code" href="a00253.html">aligned_space</a> {
-<a name="l00034"></a>00034 <span class="keyword">private</span>:
-<a name="l00035"></a>00035 <span class="keyword">typedef</span> __TBB_TypeWithAlignmentAtLeastAsStrict(T) element_type;
-<a name="l00036"></a>00036 element_type array[(<span class="keyword">sizeof</span>(T)*N+<span class="keyword">sizeof</span>(element_type)-1)/<span class="keyword">sizeof</span>(element_type)];
-<a name="l00037"></a>00037 <span class="keyword">public</span>:
-<a name="l00039"></a><a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">00039</a> T* <a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>() {<span class="keywordflow">return</span> internal::punned_cast<T*>(<span class="keyword">this</span>);}
-<a name="l00040"></a>00040
-<a name="l00042"></a><a class="code" href="a00253.html#024be075c23c0394c9a2518d993bcd9e">00042</a> T* <a class="code" href="a00253.html#024be075c23c0394c9a2518d993bcd9e">end</a>() {<span class="keywordflow">return</span> <a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()+N;}
-<a name="l00043"></a>00043 };
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 } <span class="comment">// namespace tbb </span>
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_aligned_space_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00441.html b/doc/html/a00441.html
index 0d06971..e70da03 100644
--- a/doc/html/a00441.html
+++ b/doc/html/a00441.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>atomic.h Source File</title>
+<title>Algorithms</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -11,439 +11,356 @@
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>atomic.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_atomic_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_atomic_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <cstddef></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_LONG_LONG __int64</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_LONG_LONG long long</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER */</span>
-<a name="l00032"></a>00032
-<a name="l00033"></a>00033 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warnings</span>
-<a name="l00037"></a>00037 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4244 4267)</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span>
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
-<a name="l00042"></a>00042
-<a name="l00044"></a><a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef">00044</a> <span class="keyword">enum</span> <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> {
-<a name="l00046"></a>00046 <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>,
-<a name="l00048"></a>00048 <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
-<a name="l00050"></a>00050 <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>,
-<a name="l00052"></a>00052 <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>
-<a name="l00053"></a>00053 };
-<a name="l00054"></a>00054
-<a name="l00056"></a>00056 <span class="keyword">namespace </span>internal {
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 <span class="preprocessor">#if __TBB_ATTRIBUTE_ALIGNED_PRESENT</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f __attribute__ ((aligned(a)));</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#elif __TBB_DECLSPEC_ALIGN_PRESENT</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor"> #error Do not know syntax for forcing alignment.</span>
-<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00065"></a>00065 <span class="preprocessor"></span>
-<a name="l00066"></a>00066 <span class="keyword">template</span><size_t S>
-<a name="l00067"></a>00067 <span class="keyword">struct </span>atomic_rep; <span class="comment">// Primary template declared, but never defined.</span>
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <span class="keyword">template</span><>
-<a name="l00070"></a>00070 <span class="keyword">struct </span>atomic_rep<1> { <span class="comment">// Specialization</span>
-<a name="l00071"></a>00071 <span class="keyword">typedef</span> int8_t word;
-<a name="l00072"></a>00072 int8_t value;
-<a name="l00073"></a>00073 };
-<a name="l00074"></a>00074 <span class="keyword">template</span><>
-<a name="l00075"></a>00075 <span class="keyword">struct </span>atomic_rep<2> { <span class="comment">// Specialization</span>
-<a name="l00076"></a>00076 <span class="keyword">typedef</span> int16_t word;
-<a name="l00077"></a>00077 __TBB_DECL_ATOMIC_FIELD(int16_t,value,2)
-<a name="l00078"></a>00078 };
-<a name="l00079"></a>00079 <span class="keyword">template</span><>
-<a name="l00080"></a>00080 <span class="keyword">struct </span>atomic_rep<4> { <span class="comment">// Specialization</span>
-<a name="l00081"></a>00081 <span class="preprocessor">#if _MSC_VER && !_WIN64</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span> <span class="comment">// Work-around that avoids spurious /Wp64 warnings</span>
-<a name="l00083"></a>00083 <span class="keyword">typedef</span> intptr_t word;
-<a name="l00084"></a>00084 <span class="preprocessor">#else</span>
-<a name="l00085"></a>00085 <span class="preprocessor"></span> <span class="keyword">typedef</span> int32_t word;
-<a name="l00086"></a>00086 <span class="preprocessor">#endif</span>
-<a name="l00087"></a>00087 <span class="preprocessor"></span> __TBB_DECL_ATOMIC_FIELD(int32_t,value,4)
-<a name="l00088"></a>00088 };
-<a name="l00089"></a>00089 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="keyword">template</span><>
-<a name="l00091"></a>00091 <span class="keyword">struct </span>atomic_rep<8> { <span class="comment">// Specialization</span>
-<a name="l00092"></a>00092 <span class="keyword">typedef</span> int64_t word;
-<a name="l00093"></a>00093 __TBB_DECL_ATOMIC_FIELD(int64_t,value,8)
-<a name="l00094"></a>00094 };
-<a name="l00095"></a>00095 <span class="preprocessor">#endif</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span>
-<a name="l00097"></a>00097 <span class="keyword">template</span><size_t Size, memory_semantics M>
-<a name="l00098"></a>00098 <span class="keyword">struct </span>atomic_traits; <span class="comment">// Primary template declared, but not defined.</span>
-<a name="l00099"></a>00099
-<a name="l00100"></a>00100 <span class="preprocessor">#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M) \</span>
-<a name="l00101"></a>00101 <span class="preprocessor"> template<> struct atomic_traits<S,M> { \</span>
-<a name="l00102"></a>00102 <span class="preprocessor"> typedef atomic_rep<S>::word word; \</span>
-<a name="l00103"></a>00103 <span class="preprocessor"> inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \</span>
-<a name="l00104"></a>00104 <span class="preprocessor"> return __TBB_machine_cmpswp##S##M(location,new_value,comparand); \</span>
-<a name="l00105"></a>00105 <span class="preprocessor"> } \</span>
-<a name="l00106"></a>00106 <span class="preprocessor"> inline static word fetch_and_add( volatile void* location, word addend ) { \</span>
-<a name="l00107"></a>00107 <span class="preprocessor"> return __TBB_machine_fetchadd##S##M(location,addend); \</span>
-<a name="l00108"></a>00108 <span class="preprocessor"> } \</span>
-<a name="l00109"></a>00109 <span class="preprocessor"> inline static word fetch_and_store( volatile void* location, word value ) { \</span>
-<a name="l00110"></a>00110 <span class="preprocessor"> return __TBB_machine_fetchstore##S##M(location,value); \</span>
-<a name="l00111"></a>00111 <span class="preprocessor"> } \</span>
-<a name="l00112"></a>00112 <span class="preprocessor"> };</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span>
-<a name="l00114"></a>00114 <span class="preprocessor">#define __TBB_DECL_ATOMIC_PRIMITIVES(S) \</span>
-<a name="l00115"></a>00115 <span class="preprocessor"> template<memory_semantics M> \</span>
-<a name="l00116"></a>00116 <span class="preprocessor"> struct atomic_traits<S,M> { \</span>
-<a name="l00117"></a>00117 <span class="preprocessor"> typedef atomic_rep<S>::word word; \</span>
-<a name="l00118"></a>00118 <span class="preprocessor"> inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \</span>
-<a name="l00119"></a>00119 <span class="preprocessor"> return __TBB_machine_cmpswp##S(location,new_value,comparand); \</span>
-<a name="l00120"></a>00120 <span class="preprocessor"> } \</span>
-<a name="l00121"></a>00121 <span class="preprocessor"> inline static word fetch_and_add( volatile void* location, word addend ) { \</span>
-<a name="l00122"></a>00122 <span class="preprocessor"> return __TBB_machine_fetchadd##S(location,addend); \</span>
-<a name="l00123"></a>00123 <span class="preprocessor"> } \</span>
-<a name="l00124"></a>00124 <span class="preprocessor"> inline static word fetch_and_store( volatile void* location, word value ) { \</span>
-<a name="l00125"></a>00125 <span class="preprocessor"> return __TBB_machine_fetchstore##S(location,value); \</span>
-<a name="l00126"></a>00126 <span class="preprocessor"> } \</span>
-<a name="l00127"></a>00127 <span class="preprocessor"> };</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>
-<a name="l00129"></a>00129 <span class="keyword">template</span><memory_semantics M>
-<a name="l00130"></a>00130 <span class="keyword">struct </span>atomic_load_store_traits; <span class="comment">// Primary template declaration</span>
-<a name="l00131"></a>00131
-<a name="l00132"></a>00132 <span class="preprocessor">#define __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(M) \</span>
-<a name="l00133"></a>00133 <span class="preprocessor"> template<> struct atomic_load_store_traits<M> { \</span>
-<a name="l00134"></a>00134 <span class="preprocessor"> template <typename T> \</span>
-<a name="l00135"></a>00135 <span class="preprocessor"> inline static T load( const volatile T& location ) { \</span>
-<a name="l00136"></a>00136 <span class="preprocessor"> return __TBB_load_##M( location ); \</span>
-<a name="l00137"></a>00137 <span class="preprocessor"> } \</span>
-<a name="l00138"></a>00138 <span class="preprocessor"> template <typename T> \</span>
-<a name="l00139"></a>00139 <span class="preprocessor"> inline static void store( volatile T& location, T value ) { \</span>
-<a name="l00140"></a>00140 <span class="preprocessor"> __TBB_store_##M( location, value ); \</span>
-<a name="l00141"></a>00141 <span class="preprocessor"> } \</span>
-<a name="l00142"></a>00142 <span class="preprocessor"> }</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span>
-<a name="l00144"></a>00144 <span class="preprocessor">#if __TBB_USE_FENCED_ATOMICS</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
-<a name="l00146"></a>00146 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
-<a name="l00147"></a>00147 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
-<a name="l00148"></a>00148 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00149"></a>00149 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00150"></a>00150 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00151"></a>00151 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00152"></a>00152 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00153"></a>00153 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00154"></a>00154 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>)
-<a name="l00155"></a>00155 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>)
-<a name="l00156"></a>00156 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>)
-<a name="l00157"></a>00157 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00158"></a>00158 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
-<a name="l00159"></a>00159 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00160"></a>00160 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00161"></a>00161 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,relaxed)
-<a name="l00162"></a>00162 <span class="preprocessor">#endif</span>
-<a name="l00163"></a>00163 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
-<a name="l00164"></a>00164 __TBB_DECL_ATOMIC_PRIMITIVES(1)
-<a name="l00165"></a>00165 __TBB_DECL_ATOMIC_PRIMITIVES(2)
-<a name="l00166"></a>00166 __TBB_DECL_ATOMIC_PRIMITIVES(4)
-<a name="l00167"></a>00167 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00168"></a>00168 <span class="preprocessor"></span>__TBB_DECL_ATOMIC_PRIMITIVES(8)
-<a name="l00169"></a>00169 <span class="preprocessor">#endif</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>);
-<a name="l00173"></a>00173 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>);
-<a name="l00174"></a>00174 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(<a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>);
-<a name="l00175"></a>00175 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(relaxed);
-<a name="l00176"></a>00176
-<a name="l00178"></a>00178
-<a name="l00180"></a>00180 <span class="preprocessor">#define __TBB_MINUS_ONE(T) (T(T(0)-T(1)))</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span>
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00186"></a>00186 <span class="keyword">struct </span>atomic_impl {
-<a name="l00187"></a>00187 <span class="keyword">protected</span>:
-<a name="l00188"></a>00188 atomic_rep<sizeof(T)> rep;
-<a name="l00189"></a>00189 <span class="keyword">private</span>:
-<a name="l00191"></a>00191 <span class="keyword">union </span>converter {
-<a name="l00192"></a>00192 T value;
-<a name="l00193"></a>00193 <span class="keyword">typename</span> atomic_rep<sizeof(T)>::word bits;
-<a name="l00194"></a>00194 };
-<a name="l00195"></a>00195 <span class="keyword">public</span>:
-<a name="l00196"></a>00196 <span class="keyword">typedef</span> T value_type;
-<a name="l00197"></a>00197
-<a name="l00198"></a>00198 <span class="keyword">template</span><memory_semantics M>
-<a name="l00199"></a>00199 value_type fetch_and_store( value_type value ) {
-<a name="l00200"></a>00200 converter u, w;
-<a name="l00201"></a>00201 u.value = value;
-<a name="l00202"></a>00202 w.bits = internal::atomic_traits<sizeof(value_type),M>::fetch_and_store(&rep.value,u.bits);
-<a name="l00203"></a>00203 <span class="keywordflow">return</span> w.value;
-<a name="l00204"></a>00204 }
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 value_type fetch_and_store( value_type value ) {
-<a name="l00207"></a>00207 <span class="keywordflow">return</span> fetch_and_store<full_fence>(value);
-<a name="l00208"></a>00208 }
-<a name="l00209"></a>00209
-<a name="l00210"></a>00210 <span class="keyword">template</span><memory_semantics M>
-<a name="l00211"></a>00211 value_type compare_and_swap( value_type value, value_type comparand ) {
-<a name="l00212"></a>00212 converter u, v, w;
-<a name="l00213"></a>00213 u.value = value;
-<a name="l00214"></a>00214 v.value = comparand;
-<a name="l00215"></a>00215 w.bits = internal::atomic_traits<sizeof(value_type),M>::compare_and_swap(&rep.value,u.bits,v.bits);
-<a name="l00216"></a>00216 <span class="keywordflow">return</span> w.value;
-<a name="l00217"></a>00217 }
-<a name="l00218"></a>00218
-<a name="l00219"></a>00219 value_type compare_and_swap( value_type value, value_type comparand ) {
-<a name="l00220"></a>00220 <span class="keywordflow">return</span> compare_and_swap<full_fence>(value,comparand);
-<a name="l00221"></a>00221 }
-<a name="l00222"></a>00222
-<a name="l00223"></a>00223 operator value_type()<span class="keyword"> const volatile </span>{ <span class="comment">// volatile qualifier here for backwards compatibility</span>
-<a name="l00224"></a>00224 converter w;
-<a name="l00225"></a>00225 w.bits = __TBB_load_with_acquire( rep.value );
-<a name="l00226"></a>00226 <span class="keywordflow">return</span> w.value;
-<a name="l00227"></a>00227 }
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="keyword">template</span><memory_semantics M>
-<a name="l00230"></a>00230 value_type load ()<span class="keyword"> const </span>{
-<a name="l00231"></a>00231 converter u;
-<a name="l00232"></a>00232 u.bits = internal::atomic_load_store_traits<M>::load( rep.value );
-<a name="l00233"></a>00233 <span class="keywordflow">return</span> u.value;
-<a name="l00234"></a>00234 }
-<a name="l00235"></a>00235
-<a name="l00236"></a>00236 value_type load ()<span class="keyword"> const </span>{
-<a name="l00237"></a>00237 <span class="keywordflow">return</span> load<acquire>();
-<a name="l00238"></a>00238 }
-<a name="l00239"></a>00239
-<a name="l00240"></a>00240 <span class="keyword">template</span><memory_semantics M>
-<a name="l00241"></a>00241 <span class="keywordtype">void</span> store ( value_type value ) {
-<a name="l00242"></a>00242 converter u;
-<a name="l00243"></a>00243 u.value = value;
-<a name="l00244"></a>00244 internal::atomic_load_store_traits<M>::store( rep.value, u.bits );
-<a name="l00245"></a>00245 }
-<a name="l00246"></a>00246
-<a name="l00247"></a>00247 <span class="keywordtype">void</span> store ( value_type value ) {
-<a name="l00248"></a>00248 store<release>( value );
-<a name="l00249"></a>00249 }
-<a name="l00250"></a>00250
-<a name="l00251"></a>00251 <span class="keyword">protected</span>:
-<a name="l00252"></a>00252 value_type store_with_release( value_type rhs ) {
-<a name="l00253"></a>00253 converter u;
-<a name="l00254"></a>00254 u.value = rhs;
-<a name="l00255"></a>00255 __TBB_store_with_release(rep.value,u.bits);
-<a name="l00256"></a>00256 <span class="keywordflow">return</span> rhs;
-<a name="l00257"></a>00257 }
-<a name="l00258"></a>00258 };
-<a name="l00259"></a>00259
-<a name="l00261"></a>00261
-<a name="l00264"></a>00264 <span class="keyword">template</span><<span class="keyword">typename</span> I, <span class="keyword">typename</span> D, <span class="keyword">typename</span> StepType>
-<a name="l00265"></a>00265 <span class="keyword">struct </span>atomic_impl_with_arithmetic: atomic_impl<I> {
-<a name="l00266"></a>00266 <span class="keyword">public</span>:
-<a name="l00267"></a>00267 <span class="keyword">typedef</span> I value_type;
-<a name="l00268"></a>00268
-<a name="l00269"></a>00269 <span class="keyword">template</span><memory_semantics M>
-<a name="l00270"></a>00270 value_type fetch_and_add( D addend ) {
-<a name="l00271"></a>00271 <span class="keywordflow">return</span> value_type(internal::atomic_traits<<span class="keyword">sizeof</span>(value_type),M>::fetch_and_add( &this->rep.value, addend*<span class="keyword">sizeof</span>(StepType) ));
-<a name="l00272"></a>00272 }
-<a name="l00273"></a>00273
-<a name="l00274"></a>00274 value_type fetch_and_add( D addend ) {
-<a name="l00275"></a>00275 <span class="keywordflow">return</span> fetch_and_add<full_fence>(addend);
-<a name="l00276"></a>00276 }
-<a name="l00277"></a>00277
-<a name="l00278"></a>00278 <span class="keyword">template</span><memory_semantics M>
-<a name="l00279"></a>00279 value_type fetch_and_increment() {
-<a name="l00280"></a>00280 <span class="keywordflow">return</span> fetch_and_add<M>(1);
-<a name="l00281"></a>00281 }
-<a name="l00282"></a>00282
-<a name="l00283"></a>00283 value_type fetch_and_increment() {
-<a name="l00284"></a>00284 <span class="keywordflow">return</span> fetch_and_add(1);
-<a name="l00285"></a>00285 }
-<a name="l00286"></a>00286
-<a name="l00287"></a>00287 <span class="keyword">template</span><memory_semantics M>
-<a name="l00288"></a>00288 value_type fetch_and_decrement() {
-<a name="l00289"></a>00289 <span class="keywordflow">return</span> fetch_and_add<M>(__TBB_MINUS_ONE(D));
-<a name="l00290"></a>00290 }
-<a name="l00291"></a>00291
-<a name="l00292"></a>00292 value_type fetch_and_decrement() {
-<a name="l00293"></a>00293 <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
-<a name="l00294"></a>00294 }
-<a name="l00295"></a>00295
-<a name="l00296"></a>00296 <span class="keyword">public</span>:
-<a name="l00297"></a>00297 value_type operator+=( D value ) {
-<a name="l00298"></a>00298 <span class="keywordflow">return</span> fetch_and_add(value)+value;
-<a name="l00299"></a>00299 }
-<a name="l00300"></a>00300
-<a name="l00301"></a>00301 value_type operator-=( D value ) {
-<a name="l00302"></a>00302 <span class="comment">// Additive inverse of value computed using binary minus,</span>
-<a name="l00303"></a>00303 <span class="comment">// instead of unary minus, for sake of avoiding compiler warnings.</span>
-<a name="l00304"></a>00304 <span class="keywordflow">return</span> operator+=(D(0)-value);
-<a name="l00305"></a>00305 }
-<a name="l00306"></a>00306
-<a name="l00307"></a>00307 value_type operator++() {
-<a name="l00308"></a>00308 <span class="keywordflow">return</span> fetch_and_add(1)+1;
-<a name="l00309"></a>00309 }
-<a name="l00310"></a>00310
-<a name="l00311"></a>00311 value_type operator--() {
-<a name="l00312"></a>00312 <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D))-1;
-<a name="l00313"></a>00313 }
-<a name="l00314"></a>00314
-<a name="l00315"></a>00315 value_type operator++(<span class="keywordtype">int</span>) {
-<a name="l00316"></a>00316 <span class="keywordflow">return</span> fetch_and_add(1);
-<a name="l00317"></a>00317 }
-<a name="l00318"></a>00318
-<a name="l00319"></a>00319 value_type operator--(<span class="keywordtype">int</span>) {
-<a name="l00320"></a>00320 <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
-<a name="l00321"></a>00321 }
-<a name="l00322"></a>00322 };
-<a name="l00323"></a>00323
-<a name="l00324"></a>00324 } <span class="comment">/* Internal */</span>
-<a name="l00326"></a>00326
-<a name="l00328"></a>00328
-<a name="l00330"></a>00330 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00331"></a><a class="code" href="a00254.html">00331</a> <span class="keyword">struct </span><a class="code" href="a00254.html">atomic</a>: internal::atomic_impl<T> {
-<a name="l00332"></a>00332 T operator=( T rhs ) {
-<a name="l00333"></a>00333 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00334"></a>00334 <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00335"></a>00335 }
-<a name="l00336"></a>00336 <a class="code" href="a00254.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00254.html">atomic<T></a>& rhs ) {this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
-<a name="l00337"></a>00337 };
-<a name="l00338"></a>00338
-<a name="l00339"></a>00339 <span class="preprocessor">#define __TBB_DECL_ATOMIC(T) \</span>
-<a name="l00340"></a>00340 <span class="preprocessor"> template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \</span>
-<a name="l00341"></a>00341 <span class="preprocessor"> T operator=( T rhs ) {return store_with_release(rhs);} \</span>
-<a name="l00342"></a>00342 <span class="preprocessor"> atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \</span>
-<a name="l00343"></a>00343 <span class="preprocessor"> };</span>
-<a name="l00344"></a>00344 <span class="preprocessor"></span>
-<a name="l00345"></a>00345 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00346"></a>00346 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(__TBB_LONG_LONG)
-<a name="l00347"></a>00347 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> __TBB_LONG_LONG)
-<a name="l00348"></a>00348 <span class="preprocessor">#else</span>
-<a name="l00349"></a>00349 <span class="preprocessor"></span><span class="comment">// test_atomic will verify that sizeof(long long)==8</span>
-<a name="l00350"></a>00350 <span class="preprocessor">#endif</span>
-<a name="l00351"></a>00351 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">long</span>)
-<a name="l00352"></a>00352 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)
-<a name="l00353"></a>00353
-<a name="l00354"></a>00354 <span class="preprocessor">#if _MSC_VER && !_WIN64</span>
-<a name="l00355"></a>00355 <span class="preprocessor"></span><span class="comment">/* Special version of __TBB_DECL_ATOMIC that avoids gratuitous warnings from cl /Wp64 option.</span>
-<a name="l00356"></a>00356 <span class="comment"> It is identical to __TBB_DECL_ATOMIC(unsigned) except that it replaces operator=(T)</span>
-<a name="l00357"></a>00357 <span class="comment"> with an operator=(U) that explicitly converts the U to a T. Types T and U should be</span>
-<a name="l00358"></a>00358 <span class="comment"> type synonyms on the platform. Type U should be the wider variant of T from the</span>
-<a name="l00359"></a>00359 <span class="comment"> perspective of /Wp64. */</span>
-<a name="l00360"></a>00360 <span class="preprocessor">#define __TBB_DECL_ATOMIC_ALT(T,U) \</span>
-<a name="l00361"></a>00361 <span class="preprocessor"> template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \</span>
-<a name="l00362"></a>00362 <span class="preprocessor"> T operator=( U rhs ) {return store_with_release(T(rhs));} \</span>
-<a name="l00363"></a>00363 <span class="preprocessor"> atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \</span>
-<a name="l00364"></a>00364 <span class="preprocessor"> };</span>
-<a name="l00365"></a>00365 <span class="preprocessor"></span><a class="code" href="a00414.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">unsigned</span>,size_t)
-<a name="l00366"></a><a class="code" href="a00414.html#ad165cf61abbe349d413df2589679add">00366</a> <a class="code" href="a00414.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">int</span>,ptrdiff_t)
-<a name="l00367"></a>00367 <span class="preprocessor">#else</span>
-<a name="l00368"></a>00368 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span>)
-<a name="l00369"></a>00369 __TBB_DECL_ATOMIC(<span class="keywordtype">int</span>)
-<a name="l00370"></a>00370 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER && !_WIN64 */</span>
-<a name="l00371"></a>00371
-<a name="l00372"></a>00372 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>)
-<a name="l00373"></a>00373 __TBB_DECL_ATOMIC(<span class="keywordtype">short</span>)
-<a name="l00374"></a>00374 __TBB_DECL_ATOMIC(<span class="keywordtype">char</span>)
-<a name="l00375"></a>00375 __TBB_DECL_ATOMIC(<span class="keywordtype">signed</span> <span class="keywordtype">char</span>)
-<a name="l00376"></a>00376 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)
-<a name="l00377"></a>00377
-<a name="l00378"></a>00378 <span class="preprocessor">#if !_MSC_VER || defined(_NATIVE_WCHAR_T_DEFINED)</span>
-<a name="l00379"></a>00379 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">wchar_t</span>)
-<a name="l00380"></a>00380 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER||!defined(_NATIVE_WCHAR_T_DEFINED) */</span>
-<a name="l00381"></a>00381
-<a name="l00383"></a>00383 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="a00254.html">atomic</a><T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
-<a name="l00384"></a>00384 T* operator=( T* rhs ) {
-<a name="l00385"></a>00385 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00386"></a>00386 <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00387"></a>00387 }
-<a name="l00388"></a>00388 <a class="code" href="a00254.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00254.html">atomic<T*></a>& rhs ) {
-<a name="l00389"></a>00389 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00390"></a>00390 }
-<a name="l00391"></a>00391 T* operator->()<span class="keyword"> const </span>{
-<a name="l00392"></a>00392 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00393"></a>00393 }
-<a name="l00394"></a>00394 };
-<a name="l00395"></a>00395
-<a name="l00397"></a><a class="code" href="a00255.html">00397</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00254.html">atomic</a><void*>: internal::atomic_impl<void*> {
-<a name="l00398"></a>00398 <span class="keywordtype">void</span>* operator=( <span class="keywordtype">void</span>* rhs ) {
-<a name="l00399"></a>00399 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00400"></a>00400 <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00401"></a>00401 }
-<a name="l00402"></a>00402 <a class="code" href="a00254.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00254.html">atomic<void*></a>& rhs ) {
-<a name="l00403"></a>00403 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00404"></a>00404 }
-<a name="l00405"></a>00405 };
-<a name="l00406"></a>00406
-<a name="l00407"></a>00407 <span class="comment">// Helpers to workaround ugly syntax of calling template member function of a</span>
-<a name="l00408"></a>00408 <span class="comment">// template class with template argument dependent on template parameters.</span>
-<a name="l00409"></a>00409
-<a name="l00410"></a>00410 <span class="keyword">template</span> <memory_semantics M, <span class="keyword">typename</span> T>
-<a name="l00411"></a>00411 T load ( <span class="keyword">const</span> <a class="code" href="a00254.html">atomic<T></a>& a ) { <span class="keywordflow">return</span> a.template load<M>(); }
-<a name="l00412"></a>00412
-<a name="l00413"></a>00413 <span class="keyword">template</span> <memory_semantics M, <span class="keyword">typename</span> T>
-<a name="l00414"></a>00414 <span class="keywordtype">void</span> store ( atomic<T>& a, T value ) { <span class="keywordflow">return</span> a.template store<M>(value); }
-<a name="l00415"></a>00415
-<a name="l00416"></a>00416 <span class="keyword">namespace </span>interface6{
-<a name="l00418"></a>00418 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00419"></a>00419 atomic<T> make_atomic(T t) {
-<a name="l00420"></a>00420 atomic<T> a;
-<a name="l00421"></a>00421 store<relaxed>(a,t);
-<a name="l00422"></a>00422 <span class="keywordflow">return</span> a;
-<a name="l00423"></a>00423 }
-<a name="l00424"></a>00424 }
-<a name="l00425"></a>00425 <span class="keyword">using</span> interface6::make_atomic;
-<a name="l00426"></a>00426
-<a name="l00427"></a>00427 <span class="keyword">namespace </span>internal {
-<a name="l00428"></a>00428
-<a name="l00429"></a>00429 <span class="comment">// only to aid in the gradual conversion of ordinary variables to proper atomics</span>
-<a name="l00430"></a>00430 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00431"></a>00431 <span class="keyword">inline</span> atomic<T>& as_atomic( T& t ) {
-<a name="l00432"></a>00432 <span class="keywordflow">return</span> (atomic<T>&)t;
-<a name="l00433"></a>00433 }
-<a name="l00434"></a>00434 } <span class="comment">// namespace tbb::internal</span>
-<a name="l00435"></a>00435
-<a name="l00436"></a>00436 } <span class="comment">// namespace tbb</span>
-<a name="l00437"></a>00437
-<a name="l00438"></a>00438 <span class="preprocessor">#if _MSC_VER && !__INTEL_COMPILER</span>
-<a name="l00439"></a>00439 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00440"></a>00440 <span class="preprocessor"></span><span class="preprocessor">#endif // warnings 4244, 4267 are back</span>
-<a name="l00441"></a>00441 <span class="preprocessor"></span>
-<a name="l00442"></a>00442 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_atomic_H */</span>
-</pre></div><hr>
+<h1>Algorithms</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00271.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00272.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00273.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html">tbb::pre_scan_tag</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed. <a href="a00323.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html">tbb::final_scan_tag</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <a href="a00296.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html">tbb::parallel_while< Body ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work. <a href="a00320.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html">tbb::simple_partitioner</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00341.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html">tbb::auto_partitioner</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00269.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html">tbb::filter</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00294.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00361.html">tbb::thread_bound_filter</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <a href="a00361.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html">tbb::pipeline</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <a href="a00322.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00347.html">tbb::split</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <a href="a00347.html#_details">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_do</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="parallel_do_body_req.html">parallel_do Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3383e2703977012b6f384d673410f1f7"></a><!-- doxytag: member="algorithms::parallel_do" ref="g3383e2703977012b6f384d673410f1f7" args="(Iterator first, Iterator last, const Body &body)" -->
+template<typename Iterator, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2617dc9b88b3285a7212599d49f74228"></a><!-- doxytag: member="algorithms::parallel_do" ref="g2617dc9b88b3285a7212599d49f74228" args="(Iterator first, Iterator last, const Body &body, task_group_context &context)" -->
+template<typename Iterator, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g2617dc9b88b3285a7212599d49f74228">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work and user-supplied context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_for</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_for_body_req.html">parallel_for Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g68cc046ef72c42ce205fccbc435a0d81"></a><!-- doxytag: member="algorithms::parallel_for" ref="g68cc046ef72c42ce205fccbc435a0d81" args="(const Range &range, const Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a> (const Range &range, const Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g13cac5dd55c7533bccea43a51c33d0e5"></a><!-- doxytag: member="algorithms::parallel_for" ref="g13cac5dd55c7533bccea43a51c33d0e5" args="(const Range &range, const Body &body, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g13cac5dd55c7533bccea43a51c33d0e5">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ga7ac75d532389b55b9247f3fdb0b00d1"></a><!-- doxytag: member="algorithms::parallel_for" ref="ga7ac75d532389b55b9247f3fdb0b00d1" args="(const Range &range, const Body &body, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#ga7ac75d532389b55b9247f3fdb0b00d1">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00269.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g9cd1b210ceb1c040f30e390b4a21bde8"></a><!-- doxytag: member="algorithms::parallel_for" ref="g9cd1b210ceb1c040f30e390b4a21bde8" args="(const Range &range, const Body &body, affinity_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g9cd1b210ceb1c040f30e390b4a21bde8">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00261.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8a1bab34022d4990e49e287a129529fa"></a><!-- doxytag: member="algorithms::parallel_for" ref="g8a1bab34022d4990e49e287a129529fa" args="(const Range &range, const Body &body, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g8a1bab34022d4990e49e287a129529fa">tbb::parallel_for</a> (const Range &range, const Body &body, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2d317a5e0078cd193125439fed60dfdc"></a><!-- doxytag: member="algorithms::parallel_for" ref="g2d317a5e0078cd193125439fed60dfdc" args="(const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g2d317a5e0078cd193125439fed60dfdc">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c0700e3f85e83a788ff3ede88ebb7e9"></a><!-- doxytag: member="algorithms::parallel_for" ref="g1c0700e3f85e83a788ff3ede88ebb7e9" args="(const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g1c0700e3f85e83a788ff3ede88ebb7e9">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00269.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g04b4696b67370c01353ff5974c8f1196"></a><!-- doxytag: member="algorithms::parallel_for" ref="g04b4696b67370c01353ff5974c8f1196" args="(const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g04b4696b67370c01353ff5974c8f1196">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00261.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_for_each</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gcd40c32f319747e61a8f73fcfc452001"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gcd40c32f319747e61a8f73fcfc452001" args="(InputIterator first, InputIterator last, const Function &f, task_group_context &context)" -->
+template<typename InputIterator, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gcd40c32f319747e61a8f73fcfc452001">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Calls function f for all items from [first, last) interval using user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc2d710ca573f0a9bd94379cba3772def"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gc2d710ca573f0a9bd94379cba3772def" args="(InputIterator first, InputIterator last, const Function &f)" -->
+template<typename InputIterator, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc2d710ca573f0a9bd94379cba3772def">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Uses default context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_invoke</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd3e2998f171494f94c2103f4eb924084"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd3e2998f171494f94c2103f4eb924084" args="(const F0 &f0, const F1 &f1, tbb::task_group_context &context)" -->
+template<typename F0, typename F1> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Executes a list of tasks in parallel and waits for all tasks to complete. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4eb73562e4145c8343ed9f996267f039"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g4eb73562e4145c8343ed9f996267f039" args="(const F0 &f0, const F1 &f1, const F2 &f2, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd1335c4b54fbf8d3f5be6a5c255c8c60"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd1335c4b54fbf8d3f5be6a5c255c8c60" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g40b88e3db7ecb09cbfe0230ea1c24030"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g40b88e3db7ecb09cbfe0230ea1c24030" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g98a8b388f7e0b7621a964a8c23752d1d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g98a8b388f7e0b7621a964a8c23752d1d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb95f31638bdde9d909361ad2e96a93eb"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb95f31638bdde9d909361ad2e96a93eb" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1655b24786f010ee0a008907a07bb61d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1655b24786f010ee0a008907a07bb61d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g105220f1c95f9888b696a3e47027527b"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g105220f1c95f9888b696a3e47027527b" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1ef1774e0fcc4f632fe0af2591781c4c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1ef1774e0fcc4f632fe0af2591781c4c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00353.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
+template<typename F0, typename F1> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb91fec4e7ba49754ad583ccb127afc66"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb91fec4e7ba49754ad583ccb127afc66" args="(const F0 &f0, const F1 &f1, const F2 &f2)" -->
+template<typename F0, typename F1, typename F2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g421d0f66ee69eea134a35d1ae371d8d6"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g421d0f66ee69eea134a35d1ae371d8d6" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)" -->
+template<typename F0, typename F1, typename F2, typename F3> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8aacce74d691b4f44a0f7becadd9578c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8aacce74d691b4f44a0f7becadd9578c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8cc6994f7cd6eaf25feb5d7cc04a2e64"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8cc6994f7cd6eaf25feb5d7cc04a2e64" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g995ba9583ae24bddb8bd9a599cc8b4c7"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g995ba9583ae24bddb8bd9a599cc8b4c7" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g34341a4c24c6f548886cd14077374c5c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g34341a4c24c6f548886cd14077374c5c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2a11342753488d460866d48370a69517"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g2a11342753488d460866d48370a69517" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gffcf6835ceee43455f310352a3b4faa5"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gffcf6835ceee43455f310352a3b4faa5" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)</td></tr>
+
+<tr><td colspan="2"><br><h2>parallel_reduce</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g1b3d59c5eb62683c5754db6970392fa3">tbb::parallel_reduce</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gec1b7c03f9da909bef5db12e3d41bed3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gec1b7c03f9da909bef5db12e3d41bed3" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gec1b7c03f9da909bef5db12e3d41bed3">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00341.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g18a19157e6245992fc00ca0adeb7dd37"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g18a19157e6245992fc00ca0adeb7dd37" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g18a19157e6245992fc00ca0adeb7dd37">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00269.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc61e73fcc36c92d79a217fc355ff4a6b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc61e73fcc36c92d79a217fc355ff4a6b" args="(const Range &range, Body &body, affinity_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc61e73fcc36c92d79a217fc355ff4a6b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00261.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g45cb00c42a18e334bbde8b7535afe460"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g45cb00c42a18e334bbde8b7535afe460" args="(const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g45cb00c42a18e334bbde8b7535afe460">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c1ea1d7c61b3c225e92c70d669a53a5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1c1ea1d7c61b3c225e92c70d669a53a5" args="(const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g1c1ea1d7c61b3c225e92c70d669a53a5">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00269.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd9ac3a3811060314695f33b703c6e11b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gd9ac3a3811060314695f33b703c6e11b" args="(const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gd9ac3a3811060314695f33b703c6e11b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00261.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9412e09fb01fcad8c018ea9cffb28ef"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc9412e09fb01fcad8c018ea9cffb28ef" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc9412e09fb01fcad8c018ea9cffb28ef">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gaddffeec0e892ac3d6fc7fc2053e1eca"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gaddffeec0e892ac3d6fc7fc2053e1eca" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gaddffeec0e892ac3d6fc7fc2053e1eca">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00341.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb175401f0729e40dd2c5860a17c14385"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb175401f0729e40dd2c5860a17c14385" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gb175401f0729e40dd2c5860a17c14385">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00269.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb7f1f1828ae2b330ce05b8513a495154"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb7f1f1828ae2b330ce05b8513a495154" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gb7f1f1828ae2b330ce05b8513a495154">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00261.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfbc0cc2026d87f11a96bcd62788f5bb5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gfbc0cc2026d87f11a96bcd62788f5bb5" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gfbc0cc2026d87f11a96bcd62788f5bb5">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g630c90a399937d9d4ae70ff883186dfd"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g630c90a399937d9d4ae70ff883186dfd" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g630c90a399937d9d4ae70ff883186dfd">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00269.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g496bd7eadb3b97495ccb5655ef90319e"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g496bd7eadb3b97495ccb5655ef90319e" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g496bd7eadb3b97495ccb5655ef90319e">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00261.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g873006cc80868b5b4604822bf100ddeb"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="g873006cc80868b5b4604822bf100ddeb" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g873006cc80868b5b4604822bf100ddeb">tbb::parallel_deterministic_reduce</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfd08c56b3a98d4437dadc5365326928a"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="gfd08c56b3a98d4437dadc5365326928a" args="(const Range &range, Body &body, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gfd08c56b3a98d4437dadc5365326928a">tbb::parallel_deterministic_reduce</a> (const Range &range, Body &body, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3edb17bb1967c291d227556e0e47e507"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="g3edb17bb1967c291d227556e0e47e507" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g3edb17bb1967c291d227556e0e47e507">tbb::parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g0a66bc67567b2d01d709b59b9bddf84a"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="g0a66bc67567b2d01d709b59b9bddf84a" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb::parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_scan</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_scan_body_req.html">parallel_scan Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ged143f31dd3d96ded02ab3db915b91c7"></a><!-- doxytag: member="algorithms::parallel_scan" ref="ged143f31dd3d96ded02ab3db915b91c7" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#ged143f31dd3d96ded02ab3db915b91c7">tbb::parallel_scan</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9fac8870b2e6365fb337014404529df"></a><!-- doxytag: member="algorithms::parallel_scan" ref="gc9fac8870b2e6365fb337014404529df" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc9fac8870b2e6365fb337014404529df">tbb::parallel_scan</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00341.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g62fde400a37bbca1a2fddc8e3d22f556"></a><!-- doxytag: member="algorithms::parallel_scan" ref="g62fde400a37bbca1a2fddc8e3d22f556" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb::parallel_scan</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00269.html">auto_partitioner</a>. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_sort</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="parallel_sort_iter_req.html">iterators for parallel_sort</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename RandomAccessIterator, typename Compare> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g49edcf9447cd91a9527a3f8e8512b7aa">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator. <a href="#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g16c3eb77d0e530834c51ce3857f01012"></a><!-- doxytag: member="algorithms::parallel_sort" ref="g16c3eb77d0e530834c51ce3857f01012" args="(RandomAccessIterator begin, RandomAccessIterator end)" -->
+template<typename RandomAccessIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#g16c3eb77d0e530834c51ce3857f01012">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) with a default comparator <code>std::less<RandomAccessIterator></code>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc7576f82fdedc8a701a6c17ad9415926"></a><!-- doxytag: member="algorithms::parallel_sort" ref="gc7576f82fdedc8a701a6c17ad9415926" args="(T *begin, T *end)" -->
+template<typename T> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00441.html#gc7576f82fdedc8a701a6c17ad9415926">tbb::parallel_sort</a> (T *begin, T *end)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
+</table>
+<hr><h2>Function Documentation</h2>
+<a class="anchor" name="g49edcf9447cd91a9527a3f8e8512b7aa"></a><!-- doxytag: member="tbb::parallel_sort" ref="g49edcf9447cd91a9527a3f8e8512b7aa" args="(RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename RandomAccessIterator, typename Compare> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::parallel_sort </td>
+ <td>(</td>
+ <td class="paramtype">RandomAccessIterator </td>
+ <td class="paramname"> <em>begin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">RandomAccessIterator </td>
+ <td class="paramname"> <em>end</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Compare & </td>
+ <td class="paramname"> <em>comp</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Sorts the data in [begin,end) using the given comparator.
+<p>
+The compare function object is used for all comparisons between elements during sorting. The compare object must define a bool operator() function.
+</div>
+</div><p>
+<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00427.html b/doc/html/a00442.html
similarity index 75%
rename from doc/html/a00427.html
rename to doc/html/a00442.html
index 3e458d9..3eab210 100644
--- a/doc/html/a00427.html
+++ b/doc/html/a00442.html
@@ -17,31 +17,31 @@
<h1>Containers</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html">tbb::combinable< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html">tbb::combinable< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00267.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00279.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Unordered map from Key to T. <a href="a00269.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Unordered map from Key to T. <a href="a00281.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue. <a href="a00274.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue. <a href="a00286.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00268.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00280.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00275.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00287.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00276.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00288.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The <a class="el" href="a00281.html">enumerable_thread_specific</a> container. <a href="a00281.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The <a class="el" href="a00293.html">enumerable_thread_specific</a> container. <a href="a00293.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00428.html b/doc/html/a00443.html
similarity index 81%
copy from doc/html/a00428.html
copy to doc/html/a00443.html
index 1910530..72629dd 100644
--- a/doc/html/a00428.html
+++ b/doc/html/a00443.html
@@ -17,57 +17,59 @@
<h1>Memory Allocation</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html">tbb::aligned_space< T, N ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html">tbb::aligned_space< T, N ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements. <a href="a00253.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements. <a href="a00265.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00264.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00276.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00265.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00277.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00296.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00308.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00297.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00309.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00325.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00326.html">tbb::scalable_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00337.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00338.html">tbb::scalable_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00326.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00338.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00343.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00344.html">tbb::tbb_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00356.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00357.html">tbb::tbb_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00344.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00357.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00353.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00366.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00354.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00367.html#_details">More...</a><br></td></tr>
<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00428.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00443.html#gb9ee52ffc5400f15c3d8af8c7613c05a">scalable_allocation_mode</a> (int param, intptr_t value)</td></tr>
</table>
<hr><h2>Function Documentation</h2>
@@ -155,6 +157,35 @@ The "_aligned_malloc" analogue.
The "_aligned_realloc" analogue.
</div>
</div><p>
+<a class="anchor" name="gb9ee52ffc5400f15c3d8af8c7613c05a"></a><!-- doxytag: member="scalable_allocator.h::scalable_allocation_mode" ref="gb9ee52ffc5400f15c3d8af8c7613c05a" args="(int param, intptr_t value)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int __TBB_EXPORTED_FUNC scalable_allocation_mode </td>
+ <td>(</td>
+ <td class="paramtype">int </td>
+ <td class="paramname"> <em>param</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">intptr_t </td>
+ <td class="paramname"> <em>value</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Set TBB allocator-specific allocation modes.
+</div>
+</div><p>
<a class="anchor" name="g3f5a2fde0bcaa3eda35be32c8658f444"></a><!-- doxytag: member="scalable_allocator.h::scalable_calloc" ref="g3f5a2fde0bcaa3eda35be32c8658f444" args="(size_t nobj, size_t size)" -->
<div class="memitem">
<div class="memproto">
@@ -310,7 +341,7 @@ The "realloc" analogue complementing scalable_malloc.
</div><p>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00429.html b/doc/html/a00444.html
similarity index 73%
rename from doc/html/a00429.html
rename to doc/html/a00444.html
index 18ce518..4f101ba 100644
--- a/doc/html/a00429.html
+++ b/doc/html/a00444.html
@@ -17,40 +17,40 @@
<h1>Synchronization</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html">tbb::atomic< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html">tbb::atomic< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00254.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html">tbb::mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00266.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html">tbb::mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <a href="a00301.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html">tbb::null_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <a href="a00313.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html">tbb::null_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00303.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html">tbb::null_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00315.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html">tbb::null_rw_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00305.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html">tbb::queuing_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00317.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00326.html">tbb::queuing_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing mutex with local-only spinning. <a href="a00314.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html">tbb::queuing_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing mutex with local-only spinning. <a href="a00326.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00328.html">tbb::queuing_rw_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing reader-writer mutex with local-only spinning. <a href="a00316.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing reader-writer mutex with local-only spinning. <a href="a00328.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Writer-preference reader-writer lock with local-only spinning on readers. <a href="a00318.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html">tbb::recursive_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Writer-preference reader-writer lock with local-only spinning on readers. <a href="a00330.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00334.html">tbb::recursive_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00322.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00331.html">tbb::spin_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00334.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00343.html">tbb::spin_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00331.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00343.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference. <a href="a00333.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference. <a href="a00345.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00430.html b/doc/html/a00445.html
similarity index 88%
rename from doc/html/a00430.html
rename to doc/html/a00445.html
index ec37257..22dcba3 100644
--- a/doc/html/a00430.html
+++ b/doc/html/a00445.html
@@ -17,13 +17,13 @@
<h1>Timing</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html">tbb::tick_count</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html">tbb::tick_count</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00349.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00362.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00431.html b/doc/html/a00446.html
similarity index 78%
rename from doc/html/a00431.html
rename to doc/html/a00446.html
index 2b72f6d..5efba0b 100644
--- a/doc/html/a00431.html
+++ b/doc/html/a00446.html
@@ -17,25 +17,25 @@
<h1>Task Scheduling</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00340.html">tbb::task_group_context</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00352.html">tbb::task_group_context</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00340.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00337.html">tbb::task</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00352.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00349.html">tbb::task</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00337.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">tbb::empty_task</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00349.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html">tbb::empty_task</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00280.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00341.html">tbb::task_list</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00292.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00354.html">tbb::task_list</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00341.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00354.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class delimiting the scope of task scheduler activity. <a href="a00342.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class delimiting the scope of task scheduler activity. <a href="a00355.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00449.html b/doc/html/a00449.html
deleted file mode 100644
index a59568e..0000000
--- a/doc/html/a00449.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>blocked_range.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>blocked_range.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00040"></a><a class="code" href="a00259.html">00040</a> <span class="keyword">class </span><a class="code" href="a00259.html">blocked_range</a> {
-<a name="l00041"></a>00041 <span class="keyword">public</span>:
-<a name="l00043"></a>00043
-<a name="l00045"></a><a class="code" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a> <span class="keyword">typedef</span> Value <a class="code" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
-<a name="l00046"></a>00046
-<a name="l00048"></a><a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">00048</a> <span class="keyword">typedef</span> std::size_t <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
-<a name="l00049"></a>00049
-<a name="l00051"></a>00051
-<a name="l00052"></a><a class="code" href="a00259.html#94607755c5110d199202234d58d022ac">00052</a> <a class="code" href="a00259.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
-<a name="l00053"></a>00053
-<a name="l00055"></a><a class="code" href="a00259.html#14795a36ead1414b4371dbe1a4656359">00055</a> <a class="code" href="a00259.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1 ) :
-<a name="l00056"></a>00056 my_end(end_), my_begin(begin_), my_grainsize(grainsize_)
-<a name="l00057"></a>00057 {
-<a name="l00058"></a>00058 __TBB_ASSERT( my_grainsize>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00059"></a>00059 }
-<a name="l00060"></a>00060
-<a name="l00062"></a><a class="code" href="a00259.html#18d2258400756ac1446dac7676b18df3">00062</a> <a class="code" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00259.html#18d2258400756ac1446dac7676b18df3">begin</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
-<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a> <a class="code" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
-<a name="l00066"></a>00066
-<a name="l00068"></a>00068
-<a name="l00069"></a><a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a> <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
-<a name="l00070"></a>00070 __TBB_ASSERT( !(<a class="code" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00259.html#18d2258400756ac1446dac7676b18df3">begin</a>()), <span class="stringliteral">"size() unspecified if end()<begin()"</span> );
-<a name="l00071"></a>00071 <span class="keywordflow">return</span> <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>(my_end-my_begin);
-<a name="l00072"></a>00072 }
-<a name="l00073"></a>00073
-<a name="l00075"></a><a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a> <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00078"></a>00078 <span class="comment">// Methods that implement Range concept</span>
-<a name="l00079"></a>00079 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00080"></a>00080
-<a name="l00082"></a><a class="code" href="a00259.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a> <span class="keywordtype">bool</span> <a class="code" href="a00259.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !(my_begin<my_end);}
-<a name="l00083"></a>00083
-<a name="l00085"></a>00085
-<a name="l00086"></a><a class="code" href="a00259.html#41a58b703d574b6e1ca155df3576f578">00086</a> <span class="keywordtype">bool</span> <a class="code" href="a00259.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
-<a name="l00087"></a>00087
-<a name="l00089"></a>00089
-<a name="l00091"></a><a class="code" href="a00259.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a> <a class="code" href="a00259.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00259.html">blocked_range</a>& r, <a class="code" href="a00335.html">split</a> ) :
-<a name="l00092"></a>00092 my_end(r.my_end),
-<a name="l00093"></a>00093 my_begin(do_split(r)),
-<a name="l00094"></a>00094 my_grainsize(r.my_grainsize)
-<a name="l00095"></a>00095 {}
-<a name="l00096"></a>00096
-<a name="l00097"></a>00097 <span class="keyword">private</span>:
-<a name="l00099"></a>00099 Value my_end;
-<a name="l00100"></a>00100 Value my_begin;
-<a name="l00101"></a>00101 <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> my_grainsize;
-<a name="l00102"></a>00102
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keyword">static</span> Value do_split( <a class="code" href="a00259.html">blocked_range</a>& r ) {
-<a name="l00106"></a>00106 __TBB_ASSERT( r.<a class="code" href="a00259.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>(), <span class="stringliteral">"cannot split blocked_range that is not divisible"</span> );
-<a name="l00107"></a>00107 Value middle = r.<a class="code" href="a00259.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00259.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00259.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
-<a name="l00108"></a>00108 r.<a class="code" href="a00259.html#1ec95c8988b50064dd603998b16f3930">my_end</a> = middle;
-<a name="l00109"></a>00109 <span class="keywordflow">return</span> middle;
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue>
-<a name="l00113"></a>00113 <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range2d;
-<a name="l00114"></a>00114
-<a name="l00115"></a>00115 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue, <span class="keyword">typename</span> PageValue>
-<a name="l00116"></a>00116 <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range3d;
-<a name="l00117"></a>00117 };
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 } <span class="comment">// namespace tbb </span>
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00450.html b/doc/html/a00450.html
deleted file mode 100644
index fe4847d..0000000
--- a/doc/html/a00450.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>blocked_range2d.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>blocked_range2d.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range2d_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range2d_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue=RowValue>
-<a name="l00032"></a><a class="code" href="a00260.html">00032</a> <span class="keyword">class </span><a class="code" href="a00260.html">blocked_range2d</a> {
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00260.html#a807a22fe658ec38b8edfd69521d0383">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00259.html">blocked_range<RowValue></a> <a class="code" href="a00259.html">row_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00259.html">blocked_range<ColValue></a> <a class="code" href="a00259.html">col_range_type</a>;
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="keyword">private</span>:
-<a name="l00039"></a>00039 <a class="code" href="a00259.html">row_range_type</a> my_rows;
-<a name="l00040"></a>00040 <a class="code" href="a00259.html">col_range_type</a> my_cols;
-<a name="l00041"></a>00041
-<a name="l00042"></a>00042 <span class="keyword">public</span>:
-<a name="l00043"></a>00043
-<a name="l00044"></a>00044 <a class="code" href="a00260.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
-<a name="l00045"></a>00045 ColValue col_begin, ColValue col_end, <span class="keyword">typename</span> <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
-<a name="l00046"></a>00046 my_rows(row_begin,row_end,row_grainsize),
-<a name="l00047"></a>00047 my_cols(col_begin,col_end,col_grainsize)
-<a name="l00048"></a>00048 {
-<a name="l00049"></a>00049 }
-<a name="l00050"></a>00050
-<a name="l00051"></a>00051 <a class="code" href="a00260.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end,
-<a name="l00052"></a>00052 ColValue col_begin, ColValue col_end ) :
-<a name="l00053"></a>00053 my_rows(row_begin,row_end),
-<a name="l00054"></a>00054 my_cols(col_begin,col_end)
-<a name="l00055"></a>00055 {
-<a name="l00056"></a>00056 }
-<a name="l00057"></a>00057
-<a name="l00059"></a><a class="code" href="a00260.html#d144cb2d88cef553420311aca8667a44">00059</a> <span class="keywordtype">bool</span> <a class="code" href="a00260.html#d144cb2d88cef553420311aca8667a44">empty</a>()<span class="keyword"> const </span>{
-<a name="l00060"></a>00060 <span class="comment">// Yes, it is a logical OR here, not AND.</span>
-<a name="l00061"></a>00061 <span class="keywordflow">return</span> my_rows.<a class="code" href="a00259.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00259.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
-<a name="l00062"></a>00062 }
-<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00260.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00260.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>()<span class="keyword"> const </span>{
-<a name="l00066"></a>00066 <span class="keywordflow">return</span> my_rows.<a class="code" href="a00259.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00259.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
-<a name="l00067"></a>00067 }
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <a class="code" href="a00260.html">blocked_range2d</a>( <a class="code" href="a00260.html">blocked_range2d</a>& r, <a class="code" href="a00335.html">split</a> ) :
-<a name="l00070"></a>00070 my_rows(r.my_rows),
-<a name="l00071"></a>00071 my_cols(r.my_cols)
-<a name="l00072"></a>00072 {
-<a name="l00073"></a>00073 <span class="keywordflow">if</span>( my_rows.<a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00074"></a>00074 my_cols.<a class="code" href="a00259.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00260.html#9837bbaabc5836741fde79512ea1131d">my_cols</a>);
-<a name="l00075"></a>00075 } <span class="keywordflow">else</span> {
-<a name="l00076"></a>00076 my_rows.<a class="code" href="a00259.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00260.html#4be7c7b39da256afe9c67be735b6f788">my_rows</a>);
-<a name="l00077"></a>00077 }
-<a name="l00078"></a>00078 }
-<a name="l00079"></a>00079
-<a name="l00081"></a><a class="code" href="a00260.html#f496e7348a82652fba581203477cc07c">00081</a> <span class="keyword">const</span> <a class="code" href="a00259.html">row_range_type</a>& <a class="code" href="a00260.html#f496e7348a82652fba581203477cc07c">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
-<a name="l00082"></a>00082
-<a name="l00084"></a><a class="code" href="a00260.html#392a46759af2c884957115771affa7f4">00084</a> <span class="keyword">const</span> <a class="code" href="a00259.html">col_range_type</a>& <a class="code" href="a00260.html#392a46759af2c884957115771affa7f4">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
-<a name="l00085"></a>00085 };
-<a name="l00086"></a>00086
-<a name="l00087"></a>00087 } <span class="comment">// namespace tbb </span>
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range2d_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00451.html b/doc/html/a00451.html
deleted file mode 100644
index 3f8bee2..0000000
--- a/doc/html/a00451.html
+++ /dev/null
@@ -1,131 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>blocked_range3d.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>blocked_range3d.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range3d_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range3d_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> PageValue, <span class="keyword">typename</span> RowValue=PageValue, <span class="keyword">typename</span> ColValue=RowValue>
-<a name="l00032"></a><a class="code" href="a00261.html">00032</a> <span class="keyword">class </span><a class="code" href="a00261.html">blocked_range3d</a> {
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00261.html#b8ebf17a552ba47825e9b3887855b719">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00259.html">blocked_range<PageValue></a> <a class="code" href="a00259.html">page_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00259.html">blocked_range<RowValue></a> <a class="code" href="a00259.html">row_range_type</a>;
-<a name="l00037"></a>00037 <span class="keyword">typedef</span> <a class="code" href="a00259.html">blocked_range<ColValue></a> <a class="code" href="a00259.html">col_range_type</a>;
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">private</span>:
-<a name="l00040"></a>00040 <a class="code" href="a00259.html">page_range_type</a> my_pages;
-<a name="l00041"></a>00041 <a class="code" href="a00259.html">row_range_type</a> my_rows;
-<a name="l00042"></a>00042 <a class="code" href="a00259.html">col_range_type</a> my_cols;
-<a name="l00043"></a>00043
-<a name="l00044"></a>00044 <span class="keyword">public</span>:
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <a class="code" href="a00261.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end,
-<a name="l00047"></a>00047 RowValue row_begin, RowValue row_end,
-<a name="l00048"></a>00048 ColValue col_begin, ColValue col_end ) :
-<a name="l00049"></a>00049 my_pages(page_begin,page_end),
-<a name="l00050"></a>00050 my_rows(row_begin,row_end),
-<a name="l00051"></a>00051 my_cols(col_begin,col_end)
-<a name="l00052"></a>00052 {
-<a name="l00053"></a>00053 }
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <a class="code" href="a00261.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize,
-<a name="l00056"></a>00056 RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
-<a name="l00057"></a>00057 ColValue col_begin, ColValue col_end, <span class="keyword">typename</span> <a class="code" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
-<a name="l00058"></a>00058 my_pages(page_begin,page_end,page_grainsize),
-<a name="l00059"></a>00059 my_rows(row_begin,row_end,row_grainsize),
-<a name="l00060"></a>00060 my_cols(col_begin,col_end,col_grainsize)
-<a name="l00061"></a>00061 {
-<a name="l00062"></a>00062 }
-<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00261.html#356860e1c977d91711e8216bd55c0b25">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00261.html#356860e1c977d91711e8216bd55c0b25">empty</a>()<span class="keyword"> const </span>{
-<a name="l00066"></a>00066 <span class="comment">// Yes, it is a logical OR here, not AND.</span>
-<a name="l00067"></a>00067 <span class="keywordflow">return</span> my_pages.<a class="code" href="a00259.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00259.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00259.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
-<a name="l00068"></a>00068 }
-<a name="l00069"></a>00069
-<a name="l00071"></a><a class="code" href="a00261.html#39d69191721c488e737ae5d9c5336b9c">00071</a> <span class="keywordtype">bool</span> <a class="code" href="a00261.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>()<span class="keyword"> const </span>{
-<a name="l00072"></a>00072 <span class="keywordflow">return</span> my_pages.<a class="code" href="a00259.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00259.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00259.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
-<a name="l00073"></a>00073 }
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <a class="code" href="a00261.html">blocked_range3d</a>( <a class="code" href="a00261.html">blocked_range3d</a>& r, <a class="code" href="a00335.html">split</a> ) :
-<a name="l00076"></a>00076 my_pages(r.my_pages),
-<a name="l00077"></a>00077 my_rows(r.my_rows),
-<a name="l00078"></a>00078 my_cols(r.my_cols)
-<a name="l00079"></a>00079 {
-<a name="l00080"></a>00080 <span class="keywordflow">if</span>( my_pages.<a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00081"></a>00081 <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00082"></a>00082 my_cols.<a class="code" href="a00259.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00261.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
-<a name="l00083"></a>00083 } <span class="keywordflow">else</span> {
-<a name="l00084"></a>00084 my_rows.<a class="code" href="a00259.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00261.html#76ead25c280ef630b88a1c8846471707">my_rows</a>);
-<a name="l00085"></a>00085 }
-<a name="l00086"></a>00086 } <span class="keywordflow">else</span> {
-<a name="l00087"></a>00087 <span class="keywordflow">if</span> ( my_pages.<a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00088"></a>00088 my_cols.<a class="code" href="a00259.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00261.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
-<a name="l00089"></a>00089 } <span class="keywordflow">else</span> {
-<a name="l00090"></a>00090 my_pages.<a class="code" href="a00259.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00261.html#b18ae46a01d42745078d9e287ab87baa">my_pages</a>);
-<a name="l00091"></a>00091 }
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094
-<a name="l00096"></a><a class="code" href="a00261.html#cf971430aa12361d3ed245344b7c6764">00096</a> <span class="keyword">const</span> <a class="code" href="a00259.html">page_range_type</a>& <a class="code" href="a00261.html#cf971430aa12361d3ed245344b7c6764">pages</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_pages;}
-<a name="l00097"></a>00097
-<a name="l00099"></a><a class="code" href="a00261.html#1584623e59ff32a8aa82006827508be4">00099</a> <span class="keyword">const</span> <a class="code" href="a00259.html">row_range_type</a>& <a class="code" href="a00261.html#1584623e59ff32a8aa82006827508be4">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
-<a name="l00100"></a>00100
-<a name="l00102"></a><a class="code" href="a00261.html#3336ba9480fd6c43e158f9beb024c050">00102</a> <span class="keyword">const</span> <a class="code" href="a00259.html">col_range_type</a>& <a class="code" href="a00261.html#3336ba9480fd6c43e158f9beb024c050">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
-<a name="l00103"></a>00103
-<a name="l00104"></a>00104 };
-<a name="l00105"></a>00105
-<a name="l00106"></a>00106 } <span class="comment">// namespace tbb </span>
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range3d_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00452.html b/doc/html/a00452.html
deleted file mode 100644
index f2a69b1..0000000
--- a/doc/html/a00452.html
+++ /dev/null
@@ -1,153 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>cache_aligned_allocator.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>cache_aligned_allocator.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_cache_aligned_allocator_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_cache_aligned_allocator_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <new></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#if __TBB_CPP11_RVALUE_REF_PRESENT && !__TBB_CPP11_STD_FORWARD_BROKEN</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor"> #include <utility></span> <span class="comment">// std::forward</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#endif</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span>
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031
-<a name="l00033"></a>00033 <span class="keyword">namespace </span>internal {
-<a name="l00035"></a>00035
-<a name="l00036"></a>00036 size_t __TBB_EXPORTED_FUNC NFS_GetLineSize();
-<a name="l00037"></a>00037
-<a name="l00039"></a>00039
-<a name="l00040"></a>00040 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC NFS_Allocate( size_t n_element, size_t element_size, <span class="keywordtype">void</span>* hint );
-<a name="l00041"></a>00041
-<a name="l00043"></a>00043
-<a name="l00045"></a>00045 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC NFS_Free( <span class="keywordtype">void</span>* );
-<a name="l00046"></a>00046 }
-<a name="l00048"></a>00048
-<a name="l00049"></a>00049 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
-<a name="l00051"></a>00051 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span>
-<a name="l00056"></a>00056
-<a name="l00059"></a>00059 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00060"></a><a class="code" href="a00264.html">00060</a> <span class="keyword">class </span><a class="code" href="a00264.html">cache_aligned_allocator</a> {
-<a name="l00061"></a>00061 <span class="keyword">public</span>:
-<a name="l00062"></a>00062 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
-<a name="l00063"></a>00063 <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00064"></a>00064 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00065"></a>00065 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00066"></a>00066 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00067"></a>00067 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00068"></a>00068 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00069"></a>00069 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00070"></a>00070 <span class="keyword">typedef</span> <a class="code" href="a00264.html">cache_aligned_allocator<U></a> other;
-<a name="l00071"></a>00071 };
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <a class="code" href="a00264.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00074"></a>00074 <a class="code" href="a00264.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00264.html">cache_aligned_allocator</a>& ) <span class="keywordflow">throw</span>() {}
-<a name="l00075"></a>00075 <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00264.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00264.html">cache_aligned_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00078"></a>00078 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00079"></a>00079
-<a name="l00081"></a><a class="code" href="a00264.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00081</a> pointer <a class="code" href="a00264.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* hint=0 ) {
-<a name="l00082"></a>00082 <span class="comment">// The "hint" argument is always ignored in NFS_Allocate thus const_cast shouldn't hurt</span>
-<a name="l00083"></a>00083 <span class="keywordflow">return</span> pointer(internal::NFS_Allocate( n, <span class="keyword">sizeof</span>(value_type), const_cast<void*>(hint) ));
-<a name="l00084"></a>00084 }
-<a name="l00085"></a>00085
-<a name="l00087"></a><a class="code" href="a00264.html#3d4eadf188f7d85d3805ae534e0b8e1c">00087</a> <span class="keywordtype">void</span> <a class="code" href="a00264.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( pointer p, size_type ) {
-<a name="l00088"></a>00088 internal::NFS_Free(p);
-<a name="l00089"></a>00089 }
-<a name="l00090"></a>00090
-<a name="l00092"></a><a class="code" href="a00264.html#fb23b687b4c0429dab4c7f8017266cf0">00092</a> size_type <a class="code" href="a00264.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const throw() {
-<a name="l00093"></a>00093 <span class="keywordflow">return</span> (~size_t(0)-internal::NFS_MaxLineSize)/<span class="keyword">sizeof</span>(value_type);
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095
-<a name="l00097"></a>00097 <span class="preprocessor">#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span>... Args>
-<a name="l00099"></a><a class="code" href="a00264.html#48a7e49dfb0578edc84a90a5ac30793d">00099</a> <span class="keywordtype">void</span> <a class="code" href="a00264.html#48a7e49dfb0578edc84a90a5ac30793d">construct</a>(pointer p, Args&&... args)
-<a name="l00100"></a>00100 <span class="preprocessor">#if __TBB_CPP11_STD_FORWARD_BROKEN</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span> { ::new((<span class="keywordtype">void</span> *)p) T((args)...); }
-<a name="l00102"></a>00102 <span class="preprocessor"> #else</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span> { ::new((<span class="keywordtype">void</span> *)p) T(std::forward<Args>(args)...); }
-<a name="l00104"></a>00104 <span class="preprocessor">#endif</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#else // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span> <span class="keywordtype">void</span> <a class="code" href="a00264.html#48a7e49dfb0578edc84a90a5ac30793d">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
-<a name="l00107"></a>00107 <span class="preprocessor">#endif // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span>
-<a name="l00110"></a>00110 <span class="keywordtype">void</span> destroy( pointer p ) {p->~value_type();}
-<a name="l00111"></a>00111 };
-<a name="l00112"></a>00112
-<a name="l00113"></a>00113 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span>
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keyword">template</span><>
-<a name="l00120"></a><a class="code" href="a00265.html">00120</a> <span class="keyword">class </span><a class="code" href="a00264.html">cache_aligned_allocator</a><void> {
-<a name="l00121"></a>00121 <span class="keyword">public</span>:
-<a name="l00122"></a>00122 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00123"></a>00123 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00124"></a>00124 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00125"></a>00125 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00126"></a>00126 <span class="keyword">typedef</span> <a class="code" href="a00264.html">cache_aligned_allocator<U></a> other;
-<a name="l00127"></a>00127 };
-<a name="l00128"></a>00128 };
-<a name="l00129"></a>00129
-<a name="l00130"></a>00130 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00131"></a>00131 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00264.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00264.html">cache_aligned_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00134"></a>00134 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> cache_aligned_allocator<T>&, <span class="keyword">const</span> cache_aligned_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 } <span class="comment">// namespace tbb</span>
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_cache_aligned_allocator_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00454.html b/doc/html/a00454.html
deleted file mode 100644
index 315bfc1..0000000
--- a/doc/html/a00454.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>combinable.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>combinable.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_combinable_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_combinable_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "enumerable_thread_specific.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032
-<a name="l00033"></a>00033 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00034"></a><a class="code" href="a00267.html">00034</a> <span class="keyword">class </span><a class="code" href="a00267.html">combinable</a> {
-<a name="l00035"></a>00035 <span class="keyword">private</span>:
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00264.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00264.html">my_alloc</a>;
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="keyword">typedef</span> <span class="keyword">typename</span> tbb::enumerable_thread_specific<T, my_alloc, ets_no_key> my_ets_type;
-<a name="l00039"></a>00039 my_ets_type my_ets;
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="keyword">public</span>:
-<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <a class="code" href="a00267.html">combinable</a>() { }
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="keyword">template</span> <<span class="keyword">typename</span> finit>
-<a name="l00046"></a>00046 <a class="code" href="a00267.html">combinable</a>( finit _finit) : my_ets(_finit) { }
-<a name="l00047"></a>00047
-<a name="l00049"></a><a class="code" href="a00267.html#2c87e79ae98588a5780f708773388843">00049</a> <a class="code" href="a00267.html#2c87e79ae98588a5780f708773388843">~combinable</a>() {
-<a name="l00050"></a>00050 }
-<a name="l00051"></a>00051
-<a name="l00052"></a>00052 <a class="code" href="a00267.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00267.html">combinable</a>& other) : my_ets(other.my_ets) { }
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 combinable & operator=( <span class="keyword">const</span> combinable & other) { my_ets = other.my_ets; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> clear() { my_ets.clear(); }
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 T& local() { <span class="keywordflow">return</span> my_ets.local(); }
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 T& local(<span class="keywordtype">bool</span> & exists) { <span class="keywordflow">return</span> my_ets.local(exists); }
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
-<a name="l00063"></a>00063 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00064"></a>00064 T combine(combine_func_t f_combine) { <span class="keywordflow">return</span> my_ets.combine(f_combine); }
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
-<a name="l00067"></a>00067 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00068"></a>00068 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) { my_ets.combine_each(f_combine); }
-<a name="l00069"></a>00069
-<a name="l00070"></a>00070 };
-<a name="l00071"></a>00071 } <span class="comment">// namespace tbb</span>
-<a name="l00072"></a>00072 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_combinable_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00455.html b/doc/html/a00455.html
deleted file mode 100644
index 8c7af05..0000000
--- a/doc/html/a00455.html
+++ /dev/null
@@ -1,1219 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_hash_map.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>concurrent_hash_map.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_hash_map_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_hash_map_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <iterator></span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include <utility></span> <span class="comment">// Need std::pair</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include <cstring></span> <span class="comment">// Need std::memset</span>
-<a name="l00035"></a>00035
-<a name="l00036"></a>00036 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span>
-<a name="l00040"></a>00040 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00044"></a>00044 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include "internal/_concurrent_unordered_impl.h"</span> <span class="comment">// Need tbb_hasher</span>
-<a name="l00048"></a>00048 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#include <typeinfo></span>
-<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#include <stdio.h></span>
-<a name="l00053"></a>00053 <span class="preprocessor">#endif</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span>
-<a name="l00055"></a>00055 <span class="keyword">namespace </span>tbb {
-<a name="l00056"></a>00056
-<a name="l00058"></a>00058 <span class="keyword">template</span><<span class="keyword">typename</span> Key>
-<a name="l00059"></a><a class="code" href="a00347.html">00059</a> <span class="keyword">struct </span><a class="code" href="a00347.html">tbb_hash_compare</a> {
-<a name="l00060"></a>00060 <span class="keyword">static</span> size_t hash( <span class="keyword">const</span> Key& a ) { <span class="keywordflow">return</span> tbb_hasher(a); }
-<a name="l00061"></a>00061 <span class="keyword">static</span> <span class="keywordtype">bool</span> equal( <span class="keyword">const</span> Key& a, <span class="keyword">const</span> Key& b ) { <span class="keywordflow">return</span> a == b; }
-<a name="l00062"></a>00062 };
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">namespace </span>interface5 {
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare = tbb_hash_compare<Key>, <span class="keyword">typename</span> A = tbb_allocator<std::pair<Key, T> > >
-<a name="l00067"></a>00067 <span class="keyword">class </span><a class="code" href="a00269.html">concurrent_hash_map</a>;
-<a name="l00068"></a>00068
-<a name="l00070"></a>00070 <span class="keyword">namespace </span>internal {
-<a name="l00071"></a>00071
-<a name="l00072"></a>00072
-<a name="l00074"></a>00074 <span class="keyword">typedef</span> size_t hashcode_t;
-<a name="l00076"></a>00076 <span class="keyword">struct </span>hash_map_node_base : tbb::internal::no_copy {
-<a name="l00078"></a>00078 <span class="keyword">typedef</span> <a class="code" href="a00333.html">spin_rw_mutex</a> mutex_t;
-<a name="l00080"></a>00080 <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
-<a name="l00082"></a>00082 hash_map_node_base *next;
-<a name="l00083"></a>00083 mutex_t <a class="code" href="a00301.html">mutex</a>;
-<a name="l00084"></a>00084 };
-<a name="l00086"></a>00086 <span class="keyword">static</span> hash_map_node_base *<span class="keyword">const</span> rehash_req = reinterpret_cast<hash_map_node_base*>(size_t(3));
-<a name="l00088"></a>00088 <span class="keyword">static</span> hash_map_node_base *<span class="keyword">const</span> empty_rehashed = reinterpret_cast<hash_map_node_base*>(size_t(0));
-<a name="l00090"></a>00090 <span class="keyword">class </span>hash_map_base {
-<a name="l00091"></a>00091 <span class="keyword">public</span>:
-<a name="l00093"></a>00093 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00095"></a>00095 <span class="keyword">typedef</span> size_t hashcode_t;
-<a name="l00097"></a>00097 <span class="keyword">typedef</span> size_t segment_index_t;
-<a name="l00099"></a>00099 <span class="keyword">typedef</span> hash_map_node_base node_base;
-<a name="l00101"></a>00101 <span class="keyword">struct </span>bucket : tbb::internal::no_copy {
-<a name="l00103"></a>00103 <span class="keyword">typedef</span> spin_rw_mutex mutex_t;
-<a name="l00105"></a>00105 <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
-<a name="l00106"></a>00106 mutex_t mutex;
-<a name="l00107"></a>00107 node_base *node_list;
-<a name="l00108"></a>00108 };
-<a name="l00110"></a>00110 <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_block = 1;
-<a name="l00112"></a>00112 <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_buckets = 1<<embedded_block;
-<a name="l00114"></a>00114 <span class="keyword">static</span> size_type <span class="keyword">const</span> first_block = 8; <span class="comment">//including embedded_block. perfect with bucket size 16, so the allocations are power of 4096</span>
-<a name="l00116"></a>00116 <span class="comment"></span> <span class="keyword">static</span> size_type <span class="keyword">const</span> pointers_per_table = <span class="keyword">sizeof</span>(segment_index_t) * 8; <span class="comment">// one segment per bit</span>
-<a name="l00118"></a>00118 <span class="comment"></span> <span class="keyword">typedef</span> bucket *segment_ptr_t;
-<a name="l00120"></a>00120 <span class="keyword">typedef</span> segment_ptr_t segments_table_t[pointers_per_table];
-<a name="l00122"></a>00122 atomic<hashcode_t> my_mask;
-<a name="l00124"></a>00124 segments_table_t my_table;
-<a name="l00126"></a>00126 atomic<size_type> my_size; <span class="comment">// It must be in separate cache line from my_mask due to performance effects</span>
-<a name="l00128"></a>00128 <span class="comment"></span> bucket my_embedded_segment[embedded_buckets];
-<a name="l00129"></a>00129 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span> atomic<unsigned> my_info_resizes; <span class="comment">// concurrent ones</span>
-<a name="l00131"></a>00131 <span class="keyword">mutable</span> atomic<unsigned> my_info_restarts; <span class="comment">// race collisions</span>
-<a name="l00132"></a>00132 atomic<unsigned> my_info_rehashes; <span class="comment">// invocations of rehash_bucket</span>
-<a name="l00133"></a>00133 <span class="preprocessor">#endif</span>
-<a name="l00135"></a>00135 <span class="preprocessor"> hash_map_base() {</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span> std::memset( <span class="keyword">this</span>, 0, pointers_per_table*<span class="keyword">sizeof</span>(segment_ptr_t) <span class="comment">// 32*4=128 or 64*8=512</span>
-<a name="l00137"></a>00137 + <span class="keyword">sizeof</span>(my_size) + <span class="keyword">sizeof</span>(my_mask) <span class="comment">// 4+4 or 8+8</span>
-<a name="l00138"></a>00138 + embedded_buckets*<span class="keyword">sizeof</span>(bucket) ); <span class="comment">// n*8 or n*16</span>
-<a name="l00139"></a>00139 <span class="keywordflow">for</span>( size_type i = 0; i < embedded_block; i++ ) <span class="comment">// fill the table</span>
-<a name="l00140"></a>00140 my_table[i] = my_embedded_segment + segment_base(i);
-<a name="l00141"></a>00141 my_mask = embedded_buckets - 1;
-<a name="l00142"></a>00142 __TBB_ASSERT( embedded_block <= first_block, <span class="stringliteral">"The first block number must include embedded blocks"</span>);
-<a name="l00143"></a>00143 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00144"></a>00144 <span class="preprocessor"></span> my_info_resizes = 0; <span class="comment">// concurrent ones</span>
-<a name="l00145"></a>00145 my_info_restarts = 0; <span class="comment">// race collisions</span>
-<a name="l00146"></a>00146 my_info_rehashes = 0; <span class="comment">// invocations of rehash_bucket</span>
-<a name="l00147"></a>00147 <span class="preprocessor">#endif</span>
-<a name="l00148"></a>00148 <span class="preprocessor"></span> }
-<a name="l00149"></a>00149
-<a name="l00151"></a>00151 <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
-<a name="l00152"></a>00152 <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
-<a name="l00153"></a>00153 }
-<a name="l00154"></a>00154
-<a name="l00156"></a>00156 <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
-<a name="l00157"></a>00157 <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159
-<a name="l00161"></a>00161 <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
-<a name="l00162"></a>00162 <span class="keywordflow">return</span> size_type(1)<<k; <span class="comment">// fake value for k==0</span>
-<a name="l00163"></a>00163 }
-<a name="l00164"></a>00164
-<a name="l00166"></a>00166 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_valid( <span class="keywordtype">void</span> *ptr ) {
-<a name="l00167"></a>00167 <span class="keywordflow">return</span> reinterpret_cast<uintptr_t>(ptr) > uintptr_t(63);
-<a name="l00168"></a>00168 }
-<a name="l00169"></a>00169
-<a name="l00171"></a>00171 <span class="keyword">static</span> <span class="keywordtype">void</span> init_buckets( segment_ptr_t ptr, size_type sz, <span class="keywordtype">bool</span> is_initial ) {
-<a name="l00172"></a>00172 <span class="keywordflow">if</span>( is_initial ) std::memset(ptr, 0, sz*<span class="keyword">sizeof</span>(bucket) );
-<a name="l00173"></a>00173 <span class="keywordflow">else</span> <span class="keywordflow">for</span>(size_type i = 0; i < sz; i++, ptr++) {
-<a name="l00174"></a>00174 *reinterpret_cast<intptr_t*>(&ptr->mutex) = 0;
-<a name="l00175"></a>00175 ptr->node_list = rehash_req;
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177 }
-<a name="l00178"></a>00178
-<a name="l00180"></a>00180 <span class="keyword">static</span> <span class="keywordtype">void</span> add_to_bucket( bucket *b, node_base *n ) {
-<a name="l00181"></a>00181 __TBB_ASSERT(b->node_list != rehash_req, NULL);
-<a name="l00182"></a>00182 n->next = b->node_list;
-<a name="l00183"></a>00183 b->node_list = n; <span class="comment">// its under lock and flag is set</span>
-<a name="l00184"></a>00184 }
-<a name="l00185"></a>00185
-<a name="l00187"></a>00187 <span class="keyword">struct </span>enable_segment_failsafe : tbb::internal::no_copy {
-<a name="l00188"></a>00188 segment_ptr_t *my_segment_ptr;
-<a name="l00189"></a>00189 enable_segment_failsafe(segments_table_t &table, segment_index_t k) : my_segment_ptr(&table[k]) {}
-<a name="l00190"></a>00190 ~enable_segment_failsafe() {
-<a name="l00191"></a>00191 <span class="keywordflow">if</span>( my_segment_ptr ) *my_segment_ptr = 0; <span class="comment">// indicate no allocation in progress</span>
-<a name="l00192"></a>00192 }
-<a name="l00193"></a>00193 };
-<a name="l00194"></a>00194
-<a name="l00196"></a>00196 <span class="keywordtype">void</span> enable_segment( segment_index_t k, <span class="keywordtype">bool</span> is_initial = <span class="keyword">false</span> ) {
-<a name="l00197"></a>00197 __TBB_ASSERT( k, <span class="stringliteral">"Zero segment must be embedded"</span> );
-<a name="l00198"></a>00198 enable_segment_failsafe watchdog( my_table, k );
-<a name="l00199"></a>00199 cache_aligned_allocator<bucket> alloc;
-<a name="l00200"></a>00200 size_type sz;
-<a name="l00201"></a>00201 __TBB_ASSERT( !is_valid(my_table[k]), <span class="stringliteral">"Wrong concurrent assignment"</span>);
-<a name="l00202"></a>00202 <span class="keywordflow">if</span>( k >= first_block ) {
-<a name="l00203"></a>00203 sz = segment_size( k );
-<a name="l00204"></a>00204 segment_ptr_t ptr = alloc.allocate( sz );
-<a name="l00205"></a>00205 init_buckets( ptr, sz, is_initial );
-<a name="l00206"></a>00206 itt_hide_store_word( my_table[k], ptr );
-<a name="l00207"></a>00207 sz <<= 1;<span class="comment">// double it to get entire capacity of the container</span>
-<a name="l00208"></a>00208 } <span class="keywordflow">else</span> { <span class="comment">// the first block</span>
-<a name="l00209"></a>00209 __TBB_ASSERT( k == embedded_block, <span class="stringliteral">"Wrong segment index"</span> );
-<a name="l00210"></a>00210 sz = segment_size( first_block );
-<a name="l00211"></a>00211 segment_ptr_t ptr = alloc.allocate( sz - embedded_buckets );
-<a name="l00212"></a>00212 init_buckets( ptr, sz - embedded_buckets, is_initial );
-<a name="l00213"></a>00213 ptr -= segment_base(embedded_block);
-<a name="l00214"></a>00214 <span class="keywordflow">for</span>(segment_index_t i = embedded_block; i < first_block; i++) <span class="comment">// calc the offsets</span>
-<a name="l00215"></a>00215 itt_hide_store_word( my_table[i], ptr + segment_base(i) );
-<a name="l00216"></a>00216 }
-<a name="l00217"></a>00217 itt_store_word_with_release( my_mask, sz-1 );
-<a name="l00218"></a>00218 watchdog.my_segment_ptr = 0;
-<a name="l00219"></a>00219 }
-<a name="l00220"></a>00220
-<a name="l00222"></a>00222 bucket *get_bucket( hashcode_t h ) <span class="keyword">const</span> <span class="keywordflow">throw</span>() { <span class="comment">// TODO: add throw() everywhere?</span>
-<a name="l00223"></a>00223 segment_index_t s = segment_index_of( h );
-<a name="l00224"></a>00224 h -= segment_base(s);
-<a name="l00225"></a>00225 segment_ptr_t seg = my_table[s];
-<a name="l00226"></a>00226 __TBB_ASSERT( is_valid(seg), <span class="stringliteral">"hashcode must be cut by valid mask for allocated segments"</span> );
-<a name="l00227"></a>00227 <span class="keywordflow">return</span> &seg[h];
-<a name="l00228"></a>00228 }
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 <span class="comment">// internal serial rehashing helper</span>
-<a name="l00231"></a>00231 <span class="keywordtype">void</span> mark_rehashed_levels( hashcode_t h ) <span class="keywordflow">throw</span> () {
-<a name="l00232"></a>00232 segment_index_t s = segment_index_of( h );
-<a name="l00233"></a>00233 <span class="keywordflow">while</span>( segment_ptr_t seg = my_table[++s] )
-<a name="l00234"></a>00234 <span class="keywordflow">if</span>( seg[h].node_list == rehash_req ) {
-<a name="l00235"></a>00235 seg[h].node_list = empty_rehashed;
-<a name="l00236"></a>00236 mark_rehashed_levels( h + ((hashcode_t)1<<s) ); <span class="comment">// optimized segment_base(s)</span>
-<a name="l00237"></a>00237 }
-<a name="l00238"></a>00238 }
-<a name="l00239"></a>00239
-<a name="l00241"></a>00241 <span class="comment">// Splitting into two functions should help inlining</span>
-<a name="l00242"></a>00242 <span class="keyword">inline</span> <span class="keywordtype">bool</span> check_mask_race( <span class="keyword">const</span> hashcode_t h, hashcode_t &m )<span class="keyword"> const </span>{
-<a name="l00243"></a>00243 hashcode_t m_now, m_old = m;
-<a name="l00244"></a>00244 m_now = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l00245"></a>00245 <span class="keywordflow">if</span>( m_old != m_now )
-<a name="l00246"></a>00246 <span class="keywordflow">return</span> check_rehashing_collision( h, m_old, m = m_now );
-<a name="l00247"></a>00247 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00248"></a>00248 }
-<a name="l00249"></a>00249
-<a name="l00251"></a>00251 <span class="keywordtype">bool</span> check_rehashing_collision( <span class="keyword">const</span> hashcode_t h, hashcode_t m_old, hashcode_t m )<span class="keyword"> const </span>{
-<a name="l00252"></a>00252 __TBB_ASSERT(m_old != m, NULL); <span class="comment">// TODO?: m arg could be optimized out by passing h = h&m</span>
-<a name="l00253"></a>00253 <span class="keywordflow">if</span>( (h & m_old) != (h & m) ) { <span class="comment">// mask changed for this hashcode, rare event</span>
-<a name="l00254"></a>00254 <span class="comment">// condition above proves that 'h' has some other bits set beside 'm_old'</span>
-<a name="l00255"></a>00255 <span class="comment">// find next applicable mask after m_old //TODO: look at bsl instruction</span>
-<a name="l00256"></a>00256 <span class="keywordflow">for</span>( ++m_old; !(h & m_old); m_old <<= 1 ) <span class="comment">// at maximum few rounds depending on the first block size</span>
-<a name="l00257"></a>00257 ;
-<a name="l00258"></a>00258 m_old = (m_old<<1) - 1; <span class="comment">// get full mask from a bit</span>
-<a name="l00259"></a>00259 __TBB_ASSERT((m_old&(m_old+1))==0 && m_old <= m, NULL);
-<a name="l00260"></a>00260 <span class="comment">// check whether it is rehashing/ed</span>
-<a name="l00261"></a>00261 <span class="keywordflow">if</span>( itt_load_word_with_acquire(get_bucket(h & m_old)->node_list) != rehash_req )
-<a name="l00262"></a>00262 {
-<a name="l00263"></a>00263 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00264"></a>00264 <span class="preprocessor"></span> my_info_restarts++; <span class="comment">// race collisions</span>
-<a name="l00265"></a>00265 <span class="preprocessor">#endif</span>
-<a name="l00266"></a>00266 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00267"></a>00267 }
-<a name="l00268"></a>00268 }
-<a name="l00269"></a>00269 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00270"></a>00270 }
-<a name="l00271"></a>00271
-<a name="l00273"></a>00273 segment_index_t insert_new_node( bucket *b, node_base *n, hashcode_t mask ) {
-<a name="l00274"></a>00274 size_type sz = ++my_size; <span class="comment">// prefix form is to enforce allocation after the first item inserted</span>
-<a name="l00275"></a>00275 add_to_bucket( b, n );
-<a name="l00276"></a>00276 <span class="comment">// check load factor</span>
-<a name="l00277"></a>00277 <span class="keywordflow">if</span>( sz >= mask ) { <span class="comment">// TODO: add custom load_factor</span>
-<a name="l00278"></a>00278 segment_index_t new_seg = __TBB_Log2( mask+1 ); <span class="comment">//optimized segment_index_of</span>
-<a name="l00279"></a>00279 __TBB_ASSERT( is_valid(my_table[new_seg-1]), <span class="stringliteral">"new allocations must not publish new mask until segment has allocated"</span>);
-<a name="l00280"></a>00280 <span class="keywordflow">if</span>( !itt_hide_load_word(my_table[new_seg])
-<a name="l00281"></a>00281 && __TBB_CompareAndSwapW(&my_table[new_seg], 2, 0) == 0 )
-<a name="l00282"></a>00282 <span class="keywordflow">return</span> new_seg; <span class="comment">// The value must be processed</span>
-<a name="l00283"></a>00283 }
-<a name="l00284"></a>00284 <span class="keywordflow">return</span> 0;
-<a name="l00285"></a>00285 }
-<a name="l00286"></a>00286
-<a name="l00288"></a>00288 <span class="keywordtype">void</span> reserve(size_type buckets) {
-<a name="l00289"></a>00289 <span class="keywordflow">if</span>( !buckets-- ) <span class="keywordflow">return</span>;
-<a name="l00290"></a>00290 <span class="keywordtype">bool</span> is_initial = !my_size;
-<a name="l00291"></a>00291 <span class="keywordflow">for</span>( size_type m = my_mask; buckets > m; m = my_mask )
-<a name="l00292"></a>00292 enable_segment( segment_index_of( m+1 ), is_initial );
-<a name="l00293"></a>00293 }
-<a name="l00295"></a>00295 <span class="keywordtype">void</span> internal_swap(hash_map_base &table) {
-<a name="l00296"></a>00296 std::swap(this->my_mask, table.my_mask);
-<a name="l00297"></a>00297 std::swap(this->my_size, table.my_size);
-<a name="l00298"></a>00298 <span class="keywordflow">for</span>(size_type i = 0; i < embedded_buckets; i++)
-<a name="l00299"></a>00299 std::swap(this->my_embedded_segment[i].node_list, table.my_embedded_segment[i].node_list);
-<a name="l00300"></a>00300 <span class="keywordflow">for</span>(size_type i = embedded_block; i < pointers_per_table; i++)
-<a name="l00301"></a>00301 std::swap(this->my_table[i], table.my_table[i]);
-<a name="l00302"></a>00302 }
-<a name="l00303"></a>00303 };
-<a name="l00304"></a>00304
-<a name="l00305"></a>00305 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00306"></a>00306 <span class="keyword">class </span>hash_map_range;
-<a name="l00307"></a>00307
-<a name="l00309"></a>00309
-<a name="l00311"></a>00311 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00312"></a>00312 <span class="keyword">class </span>hash_map_iterator
-<a name="l00313"></a>00313 : <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value>
-<a name="l00314"></a>00314 {
-<a name="l00315"></a>00315 <span class="keyword">typedef</span> Container map_type;
-<a name="l00316"></a>00316 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::node node;
-<a name="l00317"></a>00317 <span class="keyword">typedef</span> hash_map_base::node_base node_base;
-<a name="l00318"></a>00318 <span class="keyword">typedef</span> hash_map_base::bucket bucket;
-<a name="l00319"></a>00319
-<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00321"></a>00321 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
-<a name="l00322"></a>00322
-<a name="l00323"></a>00323 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00324"></a>00324 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
-<a name="l00325"></a>00325
-<a name="l00326"></a>00326 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00327"></a>00327 <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
-<a name="l00328"></a>00328
-<a name="l00329"></a>00329 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00330"></a>00330 <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_iterator;
-<a name="l00331"></a>00331
-<a name="l00332"></a>00332 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00333"></a>00333 <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
-<a name="l00334"></a>00334
-<a name="l00335"></a>00335 <span class="keywordtype">void</span> advance_to_next_bucket() { <span class="comment">// TODO?: refactor to iterator_base class</span>
-<a name="l00336"></a>00336 size_t k = my_index+1;
-<a name="l00337"></a>00337 <span class="keywordflow">while</span>( my_bucket && k <= my_map->my_mask ) {
-<a name="l00338"></a>00338 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00339"></a>00339 <span class="keywordflow">if</span>( k& (k-2) ) <span class="comment">// not the beginning of a segment</span>
-<a name="l00340"></a>00340 ++my_bucket;
-<a name="l00341"></a>00341 <span class="keywordflow">else</span> my_bucket = my_map->get_bucket( k );
-<a name="l00342"></a>00342 my_node = static_cast<node*>( my_bucket->node_list );
-<a name="l00343"></a>00343 <span class="keywordflow">if</span>( hash_map_base::is_valid(my_node) ) {
-<a name="l00344"></a>00344 my_index = k; <span class="keywordflow">return</span>;
-<a name="l00345"></a>00345 }
-<a name="l00346"></a>00346 ++k;
-<a name="l00347"></a>00347 }
-<a name="l00348"></a>00348 my_bucket = 0; my_node = 0; my_index = k; <span class="comment">// the end</span>
-<a name="l00349"></a>00349 }
-<a name="l00350"></a>00350 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00351"></a>00351 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l00352"></a>00352 <span class="keyword">friend</span> <span class="keyword">class </span>interface5::concurrent_hash_map;
-<a name="l00353"></a>00353 <span class="preprocessor">#else</span>
-<a name="l00354"></a>00354 <span class="preprocessor"></span> <span class="keyword">public</span>: <span class="comment">// workaround</span>
-<a name="l00355"></a>00355 <span class="preprocessor">#endif</span>
-<a name="l00357"></a>00357 <span class="preprocessor"> const Container *my_map;</span>
-<a name="l00358"></a>00358 <span class="preprocessor"></span>
-<a name="l00360"></a>00360 size_t my_index;
-<a name="l00361"></a>00361
-<a name="l00363"></a>00363 <span class="keyword">const</span> bucket *my_bucket;
-<a name="l00364"></a>00364
-<a name="l00366"></a>00366 node *my_node;
-<a name="l00367"></a>00367
-<a name="l00368"></a>00368 hash_map_iterator( <span class="keyword">const</span> Container &map, size_t index, <span class="keyword">const</span> bucket *b, node_base *n );
-<a name="l00369"></a>00369
-<a name="l00370"></a>00370 <span class="keyword">public</span>:
-<a name="l00372"></a>00372 hash_map_iterator() {}
-<a name="l00373"></a>00373 hash_map_iterator( <span class="keyword">const</span> hash_map_iterator<Container,typename Container::value_type> &other ) :
-<a name="l00374"></a>00374 my_map(other.my_map),
-<a name="l00375"></a>00375 my_index(other.my_index),
-<a name="l00376"></a>00376 my_bucket(other.my_bucket),
-<a name="l00377"></a>00377 my_node(other.my_node)
-<a name="l00378"></a>00378 {}
-<a name="l00379"></a>00379 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00380"></a>00380 __TBB_ASSERT( hash_map_base::is_valid(my_node), <span class="stringliteral">"iterator uninitialized or at end of container?"</span> );
-<a name="l00381"></a>00381 <span class="keywordflow">return</span> my_node->item;
-<a name="l00382"></a>00382 }
-<a name="l00383"></a>00383 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00384"></a>00384 hash_map_iterator& operator++();
-<a name="l00385"></a>00385
-<a name="l00387"></a>00387 hash_map_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00388"></a>00388 hash_map_iterator old(*<span class="keyword">this</span>);
-<a name="l00389"></a>00389 operator++();
-<a name="l00390"></a>00390 <span class="keywordflow">return</span> old;
-<a name="l00391"></a>00391 }
-<a name="l00392"></a>00392 };
-<a name="l00393"></a>00393
-<a name="l00394"></a>00394 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00395"></a>00395 hash_map_iterator<Container,Value>::hash_map_iterator( <span class="keyword">const</span> Container &map, size_t index, <span class="keyword">const</span> bucket *b, node_base *n ) :
-<a name="l00396"></a>00396 my_map(&map),
-<a name="l00397"></a>00397 my_index(index),
-<a name="l00398"></a>00398 my_bucket(b),
-<a name="l00399"></a>00399 my_node( static_cast<node*>(n) )
-<a name="l00400"></a>00400 {
-<a name="l00401"></a>00401 <span class="keywordflow">if</span>( b && !hash_map_base::is_valid(n) )
-<a name="l00402"></a>00402 advance_to_next_bucket();
-<a name="l00403"></a>00403 }
-<a name="l00404"></a>00404
-<a name="l00405"></a>00405 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00406"></a>00406 hash_map_iterator<Container,Value>& hash_map_iterator<Container,Value>::operator++() {
-<a name="l00407"></a>00407 my_node = static_cast<node*>( my_node->next );
-<a name="l00408"></a>00408 <span class="keywordflow">if</span>( !my_node ) advance_to_next_bucket();
-<a name="l00409"></a>00409 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00410"></a>00410 }
-<a name="l00411"></a>00411
-<a name="l00412"></a>00412 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00413"></a>00413 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> hash_map_iterator<Container,T>& i, <span class="keyword">const</span> hash_map_iterator<Container,U>& j ) {
-<a name="l00414"></a>00414 <span class="keywordflow">return</span> i.my_node == j.my_node && i.my_map == j.my_map;
-<a name="l00415"></a>00415 }
-<a name="l00416"></a>00416
-<a name="l00417"></a>00417 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00418"></a>00418 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> hash_map_iterator<Container,T>& i, <span class="keyword">const</span> hash_map_iterator<Container,U>& j ) {
-<a name="l00419"></a>00419 <span class="keywordflow">return</span> i.my_node != j.my_node || i.my_map != j.my_map;
-<a name="l00420"></a>00420 }
-<a name="l00421"></a>00421
-<a name="l00423"></a>00423
-<a name="l00424"></a>00424 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00425"></a>00425 <span class="keyword">class </span>hash_map_range {
-<a name="l00426"></a>00426 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::map_type map_type;
-<a name="l00427"></a>00427 Iterator my_begin;
-<a name="l00428"></a>00428 Iterator my_end;
-<a name="l00429"></a>00429 <span class="keyword">mutable</span> Iterator my_midpoint;
-<a name="l00430"></a>00430 size_t my_grainsize;
-<a name="l00432"></a>00432 <span class="keywordtype">void</span> set_midpoint() <span class="keyword">const</span>;
-<a name="l00433"></a>00433 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
-<a name="l00434"></a>00434 <span class="keyword">public</span>:
-<a name="l00436"></a>00436 <span class="keyword">typedef</span> std::size_t size_type;
-<a name="l00437"></a>00437 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::value_type value_type;
-<a name="l00438"></a>00438 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::reference reference;
-<a name="l00439"></a>00439 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::difference_type difference_type;
-<a name="l00440"></a>00440 <span class="keyword">typedef</span> Iterator iterator;
-<a name="l00441"></a>00441
-<a name="l00443"></a>00443 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin==my_end;}
-<a name="l00444"></a>00444
-<a name="l00446"></a>00446 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
-<a name="l00447"></a>00447 <span class="keywordflow">return</span> my_midpoint!=my_end;
-<a name="l00448"></a>00448 }
-<a name="l00450"></a>00450 hash_map_range( hash_map_range& r, split ) :
-<a name="l00451"></a>00451 my_end(r.my_end),
-<a name="l00452"></a>00452 my_grainsize(r.my_grainsize)
-<a name="l00453"></a>00453 {
-<a name="l00454"></a>00454 r.my_end = my_begin = r.my_midpoint;
-<a name="l00455"></a>00455 __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00456"></a>00456 __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00457"></a>00457 set_midpoint();
-<a name="l00458"></a>00458 r.set_midpoint();
-<a name="l00459"></a>00459 }
-<a name="l00461"></a>00461 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00462"></a>00462 hash_map_range( hash_map_range<U>& r) :
-<a name="l00463"></a>00463 my_begin(r.my_begin),
-<a name="l00464"></a>00464 my_end(r.my_end),
-<a name="l00465"></a>00465 my_midpoint(r.my_midpoint),
-<a name="l00466"></a>00466 my_grainsize(r.my_grainsize)
-<a name="l00467"></a>00467 {}
-<a name="l00468"></a>00468 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00470"></a>00470 <span class="preprocessor"> hash_map_range( const Iterator& begin_, const Iterator& end_, size_type grainsize_ = 1 ) :</span>
-<a name="l00471"></a>00471 <span class="preprocessor"></span> my_begin(begin_),
-<a name="l00472"></a>00472 my_end(end_),
-<a name="l00473"></a>00473 my_grainsize(grainsize_)
-<a name="l00474"></a>00474 {
-<a name="l00475"></a>00475 <span class="keywordflow">if</span>(!my_end.my_index && !my_end.my_bucket) <span class="comment">// end</span>
-<a name="l00476"></a>00476 my_end.my_index = my_end.my_map->my_mask + 1;
-<a name="l00477"></a>00477 set_midpoint();
-<a name="l00478"></a>00478 __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00479"></a>00479 }
-<a name="l00480"></a>00480 <span class="preprocessor">#endif</span>
-<a name="l00482"></a>00482 <span class="preprocessor"> hash_map_range( const map_type &map, size_type grainsize_ = 1 ) :</span>
-<a name="l00483"></a>00483 <span class="preprocessor"></span> my_begin( Iterator( map, 0, map.my_embedded_segment, map.my_embedded_segment->node_list ) ),
-<a name="l00484"></a>00484 my_end( Iterator( map, map.my_mask + 1, 0, 0 ) ),
-<a name="l00485"></a>00485 my_grainsize( grainsize_ )
-<a name="l00486"></a>00486 {
-<a name="l00487"></a>00487 __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00488"></a>00488 set_midpoint();
-<a name="l00489"></a>00489 }
-<a name="l00490"></a>00490 <span class="keyword">const</span> Iterator& begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
-<a name="l00491"></a>00491 <span class="keyword">const</span> Iterator& end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
-<a name="l00493"></a>00493 size_type grainsize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
-<a name="l00494"></a>00494 };
-<a name="l00495"></a>00495
-<a name="l00496"></a>00496 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00497"></a>00497 <span class="keywordtype">void</span> hash_map_range<Iterator>::set_midpoint()<span class="keyword"> const </span>{
-<a name="l00498"></a>00498 <span class="comment">// Split by groups of nodes</span>
-<a name="l00499"></a>00499 size_t m = my_end.my_index-my_begin.my_index;
-<a name="l00500"></a>00500 <span class="keywordflow">if</span>( m > my_grainsize ) {
-<a name="l00501"></a>00501 m = my_begin.my_index + m/2u;
-<a name="l00502"></a>00502 hash_map_base::bucket *b = my_begin.my_map->get_bucket(m);
-<a name="l00503"></a>00503 my_midpoint = Iterator(*my_begin.my_map,m,b,b->node_list);
-<a name="l00504"></a>00504 } <span class="keywordflow">else</span> {
-<a name="l00505"></a>00505 my_midpoint = my_end;
-<a name="l00506"></a>00506 }
-<a name="l00507"></a>00507 __TBB_ASSERT( my_begin.my_index <= my_midpoint.my_index,
-<a name="l00508"></a>00508 <span class="stringliteral">"my_begin is after my_midpoint"</span> );
-<a name="l00509"></a>00509 __TBB_ASSERT( my_midpoint.my_index <= my_end.my_index,
-<a name="l00510"></a>00510 <span class="stringliteral">"my_midpoint is after my_end"</span> );
-<a name="l00511"></a>00511 __TBB_ASSERT( my_begin != my_midpoint || my_begin == my_end,
-<a name="l00512"></a>00512 <span class="stringliteral">"[my_begin, my_midpoint) range should not be empty"</span> );
-<a name="l00513"></a>00513 }
-<a name="l00514"></a>00514
-<a name="l00515"></a>00515 } <span class="comment">// internal</span>
-<a name="l00517"></a>00517 <span class="comment"></span>
-<a name="l00519"></a>00519
-<a name="l00548"></a>00548 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> Allocator>
-<a name="l00549"></a><a class="code" href="a00269.html">00549</a> <span class="keyword">class </span><a class="code" href="a00269.html">concurrent_hash_map</a> : <span class="keyword">protected</span> internal::hash_map_base {
-<a name="l00550"></a>00550 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00551"></a>00551 <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_iterator;
-<a name="l00552"></a>00552
-<a name="l00553"></a>00553 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00554"></a>00554 <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_range;
-<a name="l00555"></a>00555
-<a name="l00556"></a>00556 <span class="keyword">public</span>:
-<a name="l00557"></a>00557 <span class="keyword">typedef</span> Key key_type;
-<a name="l00558"></a>00558 <span class="keyword">typedef</span> T mapped_type;
-<a name="l00559"></a>00559 <span class="keyword">typedef</span> std::pair<const Key,T> value_type;
-<a name="l00560"></a>00560 <span class="keyword">typedef</span> hash_map_base::size_type size_type;
-<a name="l00561"></a>00561 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00562"></a>00562 <span class="keyword">typedef</span> value_type *pointer;
-<a name="l00563"></a>00563 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type *const_pointer;
-<a name="l00564"></a>00564 <span class="keyword">typedef</span> value_type &reference;
-<a name="l00565"></a>00565 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type &const_reference;
-<a name="l00566"></a>00566 <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,value_type> iterator;
-<a name="l00567"></a>00567 <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,const value_type> const_iterator;
-<a name="l00568"></a>00568 <span class="keyword">typedef</span> internal::hash_map_range<iterator> range_type;
-<a name="l00569"></a>00569 <span class="keyword">typedef</span> internal::hash_map_range<const_iterator> const_range_type;
-<a name="l00570"></a>00570 <span class="keyword">typedef</span> Allocator allocator_type;
-<a name="l00571"></a>00571
-<a name="l00572"></a>00572 <span class="keyword">protected</span>:
-<a name="l00573"></a>00573 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00272.html">const_accessor</a>;
-<a name="l00574"></a>00574 <span class="keyword">struct </span>node;
-<a name="l00575"></a>00575 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<node>::other node_allocator_type;
-<a name="l00576"></a>00576 node_allocator_type my_allocator;
-<a name="l00577"></a>00577 HashCompare my_hash_compare;
-<a name="l00578"></a>00578
-<a name="l00579"></a>00579 <span class="keyword">struct </span>node : <span class="keyword">public</span> node_base {
-<a name="l00580"></a>00580 value_type item;
-<a name="l00581"></a>00581 node( <span class="keyword">const</span> Key &key ) : item(key, T()) {}
-<a name="l00582"></a>00582 node( <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T &t ) : item(key, t) {}
-<a name="l00583"></a>00583 <span class="comment">// exception-safe allocation, see C++ Standard 2003, clause 5.3.4p17</span>
-<a name="l00584"></a>00584 <span class="keywordtype">void</span> *operator new( size_t <span class="comment">/*size*/</span>, node_allocator_type &a ) {
-<a name="l00585"></a>00585 <span class="keywordtype">void</span> *ptr = a.allocate(1);
-<a name="l00586"></a>00586 <span class="keywordflow">if</span>(!ptr)
-<a name="l00587"></a>00587 tbb::internal::throw_exception(tbb::internal::eid_bad_alloc);
-<a name="l00588"></a>00588 <span class="keywordflow">return</span> ptr;
-<a name="l00589"></a>00589 }
-<a name="l00590"></a>00590 <span class="comment">// match placement-new form above to be called if exception thrown in constructor</span>
-<a name="l00591"></a>00591 <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span> *ptr, node_allocator_type &a ) {<span class="keywordflow">return</span> a.deallocate(static_cast<node*>(ptr),1); }
-<a name="l00592"></a>00592 };
-<a name="l00593"></a>00593
-<a name="l00594"></a>00594 <span class="keywordtype">void</span> delete_node( node_base *n ) {
-<a name="l00595"></a>00595 my_allocator.destroy( static_cast<node*>(n) );
-<a name="l00596"></a>00596 my_allocator.deallocate( static_cast<node*>(n), 1);
-<a name="l00597"></a>00597 }
-<a name="l00598"></a>00598
-<a name="l00599"></a>00599 node *search_bucket( <span class="keyword">const</span> key_type &key, bucket *b )<span class="keyword"> const </span>{
-<a name="l00600"></a>00600 node *n = static_cast<node*>( b->node_list );
-<a name="l00601"></a>00601 <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, n->item.first) )
-<a name="l00602"></a>00602 n = static_cast<node*>( n->next );
-<a name="l00603"></a>00603 __TBB_ASSERT(n != internal::rehash_req, <span class="stringliteral">"Search can be executed only for rehashed bucket"</span>);
-<a name="l00604"></a>00604 <span class="keywordflow">return</span> n;
-<a name="l00605"></a>00605 }
-<a name="l00606"></a>00606
-<a name="l00608"></a><a class="code" href="a00271.html">00608</a> <span class="keyword">class </span><a class="code" href="a00271.html">bucket_accessor</a> : <span class="keyword">public</span> bucket::scoped_t {
-<a name="l00609"></a>00609 bucket *my_b;
-<a name="l00610"></a>00610 <span class="keyword">public</span>:
-<a name="l00611"></a>00611 <a class="code" href="a00271.html">bucket_accessor</a>( <a class="code" href="a00269.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) { <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
-<a name="l00613"></a><a class="code" href="a00271.html#d11c77f4d70a94d4fb344492bbf18007">00613</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00269.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) {
-<a name="l00614"></a>00614 my_b = base->get_bucket( h );
-<a name="l00615"></a>00615 <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
-<a name="l00616"></a>00616 <span class="keywordflow">if</span>( itt_load_word_with_acquire(my_b->node_list) == internal::rehash_req
-<a name="l00617"></a>00617 && try_acquire( my_b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) )
-<a name="l00618"></a>00618 {
-<a name="l00619"></a>00619 <span class="keywordflow">if</span>( my_b->node_list == internal::rehash_req ) base-><a class="code" href="a00269.html#4962c7da24793ccc05524cc3bbcf1efa">rehash_bucket</a>( my_b, h ); <span class="comment">//recursive rehashing</span>
-<a name="l00620"></a>00620 }
-<a name="l00621"></a>00621 <span class="keywordflow">else</span> bucket::scoped_t::acquire( my_b->mutex, writer );
-<a name="l00622"></a>00622 __TBB_ASSERT( my_b->node_list != internal::rehash_req, NULL);
-<a name="l00623"></a>00623 }
-<a name="l00625"></a><a class="code" href="a00271.html#07d958f151a0eaa92f50fd56ad6440e2">00625</a> <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> bucket::scoped_t::is_writer; }
-<a name="l00627"></a><a class="code" href="a00271.html#fa6314b861c574f86ed189b124cf5853">00627</a> bucket *operator() () { <span class="keywordflow">return</span> my_b; }
-<a name="l00628"></a>00628 };
-<a name="l00629"></a>00629
-<a name="l00630"></a>00630 <span class="comment">// TODO refactor to hash_base</span>
-<a name="l00631"></a>00631 <span class="keywordtype">void</span> rehash_bucket( bucket *b_new, <span class="keyword">const</span> hashcode_t h ) {
-<a name="l00632"></a>00632 __TBB_ASSERT( *(intptr_t*)(&b_new->mutex), <span class="stringliteral">"b_new must be locked (for write)"</span>);
-<a name="l00633"></a>00633 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
-<a name="l00634"></a>00634 __TBB_store_with_release(b_new->node_list, internal::empty_rehashed); <span class="comment">// mark rehashed</span>
-<a name="l00635"></a>00635 hashcode_t mask = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l00636"></a>00636 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00637"></a>00637 <span class="preprocessor"></span> my_info_rehashes++; <span class="comment">// invocations of rehash_bucket</span>
-<a name="l00638"></a>00638 <span class="preprocessor">#endif</span>
-<a name="l00639"></a>00639 <span class="preprocessor"></span>
-<a name="l00640"></a>00640 bucket_accessor b_old( <span class="keyword">this</span>, h & mask );
-<a name="l00641"></a>00641
-<a name="l00642"></a>00642 mask = (mask<<1) | 1; <span class="comment">// get full mask for new bucket</span>
-<a name="l00643"></a>00643 __TBB_ASSERT( (mask&(mask+1))==0 && (h & mask) == h, NULL );
-<a name="l00644"></a>00644 restart:
-<a name="l00645"></a>00645 <span class="keywordflow">for</span>( node_base **p = &b_old()->node_list, *n = __TBB_load_with_acquire(*p); is_valid(n); n = *p ) {
-<a name="l00646"></a>00646 hashcode_t c = my_hash_compare.hash( static_cast<node*>(n)->item.first );
-<a name="l00647"></a>00647 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00648"></a>00648 <span class="preprocessor"></span> hashcode_t bmask = h & (mask>>1);
-<a name="l00649"></a>00649 bmask = bmask==0? 1 : ( 1u<<(__TBB_Log2( bmask )+1 ) ) - 1; <span class="comment">// minimal mask of parent bucket</span>
-<a name="l00650"></a>00650 __TBB_ASSERT( (c & bmask) == (h & bmask), <span class="stringliteral">"hash() function changed for key in table"</span> );
-<a name="l00651"></a>00651 <span class="preprocessor">#endif</span>
-<a name="l00652"></a>00652 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (c & mask) == h ) {
-<a name="l00653"></a>00653 <span class="keywordflow">if</span>( !b_old.is_writer() )
-<a name="l00654"></a>00654 <span class="keywordflow">if</span>( !b_old.upgrade_to_writer() ) {
-<a name="l00655"></a>00655 <span class="keywordflow">goto</span> restart; <span class="comment">// node ptr can be invalid due to concurrent erase</span>
-<a name="l00656"></a>00656 }
-<a name="l00657"></a>00657 *p = n->next; <span class="comment">// exclude from b_old</span>
-<a name="l00658"></a>00658 add_to_bucket( b_new, n );
-<a name="l00659"></a>00659 } <span class="keywordflow">else</span> p = &n->next; <span class="comment">// iterate to next item</span>
-<a name="l00660"></a>00660 }
-<a name="l00661"></a>00661 }
-<a name="l00662"></a>00662
-<a name="l00663"></a>00663 <span class="keyword">public</span>:
-<a name="l00664"></a>00664
-<a name="l00665"></a>00665 <span class="keyword">class </span>accessor;
-<a name="l00667"></a><a class="code" href="a00272.html">00667</a> <span class="keyword">class </span><a class="code" href="a00272.html">const_accessor</a> : <span class="keyword">private</span> node::scoped_t <span class="comment">/*which derived from no_copy*/</span> {
-<a name="l00668"></a>00668 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00269.html">concurrent_hash_map</a><Key,T,HashCompare,Allocator>;
-<a name="l00669"></a>00669 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00270.html">accessor</a>;
-<a name="l00670"></a>00670 <span class="keyword">public</span>:
-<a name="l00672"></a><a class="code" href="a00272.html#a8e50238483ba451363dccebd981d346">00672</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
-<a name="l00673"></a>00673
-<a name="l00675"></a><a class="code" href="a00272.html#84c3080d0c6124d55c8bb4cf6055e65f">00675</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_node;}
-<a name="l00676"></a>00676
-<a name="l00678"></a><a class="code" href="a00272.html#7db006d41b49dc5f1716a913769d4698">00678</a> <span class="keywordtype">void</span> <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00679"></a>00679 <span class="keywordflow">if</span>( my_node ) {
-<a name="l00680"></a>00680 node::scoped_t::release();
-<a name="l00681"></a>00681 my_node = 0;
-<a name="l00682"></a>00682 }
-<a name="l00683"></a>00683 }
-<a name="l00684"></a>00684
-<a name="l00686"></a><a class="code" href="a00272.html#9411df8197ceb4881ec4c7368a0a7f88">00686</a> const_reference operator*()<span class="keyword"> const </span>{
-<a name="l00687"></a>00687 __TBB_ASSERT( my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
-<a name="l00688"></a>00688 <span class="keywordflow">return</span> my_node->item;
-<a name="l00689"></a>00689 }
-<a name="l00690"></a>00690
-<a name="l00692"></a><a class="code" href="a00272.html#3d03a48ecb8cd9549bd8be64b09c9b0d">00692</a> const_pointer operator->()<span class="keyword"> const </span>{
-<a name="l00693"></a>00693 <span class="keywordflow">return</span> &operator*();
-<a name="l00694"></a>00694 }
-<a name="l00695"></a>00695
-<a name="l00697"></a><a class="code" href="a00272.html#27399c613eb1aecd4660803955dda09d">00697</a> <a class="code" href="a00272.html">const_accessor</a>() : my_node(NULL) {}
-<a name="l00698"></a>00698
-<a name="l00700"></a><a class="code" href="a00272.html#928769b139d53427e7075c1f86148e4c">00700</a> ~<a class="code" href="a00272.html">const_accessor</a>() {
-<a name="l00701"></a>00701 my_node = NULL; <span class="comment">// scoped lock's release() is called in its destructor</span>
-<a name="l00702"></a>00702 }
-<a name="l00703"></a>00703 <span class="keyword">protected</span>:
-<a name="l00704"></a>00704 <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> node::scoped_t::is_writer; }
-<a name="l00705"></a>00705 node *my_node;
-<a name="l00706"></a>00706 hashcode_t my_hash;
-<a name="l00707"></a>00707 };
-<a name="l00708"></a>00708
-<a name="l00710"></a><a class="code" href="a00270.html">00710</a> <span class="keyword">class </span><a class="code" href="a00270.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00272.html">const_accessor</a> {
-<a name="l00711"></a>00711 <span class="keyword">public</span>:
-<a name="l00713"></a><a class="code" href="a00270.html#0b648be7a95a8fb2971042c15eb112c1">00713</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
-<a name="l00714"></a>00714
-<a name="l00716"></a><a class="code" href="a00270.html#170280ea807a22e742095de3e8c5ea38">00716</a> reference operator*()<span class="keyword"> const </span>{
-<a name="l00717"></a>00717 __TBB_ASSERT( this->my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
-<a name="l00718"></a>00718 <span class="keywordflow">return</span> this->my_node->item;
-<a name="l00719"></a>00719 }
-<a name="l00720"></a>00720
-<a name="l00722"></a><a class="code" href="a00270.html#a807920cdffe3ec5c5e282b4d1ff92a2">00722</a> pointer operator->()<span class="keyword"> const </span>{
-<a name="l00723"></a>00723 <span class="keywordflow">return</span> &operator*();
-<a name="l00724"></a>00724 }
-<a name="l00725"></a>00725 };
-<a name="l00726"></a>00726
-<a name="l00728"></a><a class="code" href="a00269.html#1ad413f5b666176e7669bf4c87d1ff3f">00728</a> <a class="code" href="a00269.html">concurrent_hash_map</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00729"></a>00729 : internal::hash_map_base(), my_allocator(a)
-<a name="l00730"></a>00730 {}
-<a name="l00731"></a>00731
-<a name="l00733"></a><a class="code" href="a00269.html#46b9896317662c3cfa3c876ad7592a7c">00733</a> <a class="code" href="a00269.html">concurrent_hash_map</a>(size_type n, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00734"></a>00734 : my_allocator(a)
-<a name="l00735"></a>00735 {
-<a name="l00736"></a>00736 reserve( n );
-<a name="l00737"></a>00737 }
-<a name="l00738"></a>00738
-<a name="l00740"></a><a class="code" href="a00269.html#6fb14710893308fb47aaeee55ee30dc3">00740</a> <a class="code" href="a00269.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00269.html">concurrent_hash_map</a>& table, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00741"></a>00741 : internal::hash_map_base(), my_allocator(a)
-<a name="l00742"></a>00742 {
-<a name="l00743"></a>00743 internal_copy(table);
-<a name="l00744"></a>00744 }
-<a name="l00745"></a>00745
-<a name="l00747"></a>00747 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00748"></a><a class="code" href="a00269.html#83c40f2053f208861b90390e12a36436">00748</a> <a class="code" href="a00269.html">concurrent_hash_map</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00749"></a>00749 : my_allocator(a)
-<a name="l00750"></a>00750 {
-<a name="l00751"></a>00751 reserve( std::distance(first, last) ); <span class="comment">// TODO: load_factor?</span>
-<a name="l00752"></a>00752 internal_copy(first, last);
-<a name="l00753"></a>00753 }
-<a name="l00754"></a>00754
-<a name="l00756"></a><a class="code" href="a00269.html#088d1aaccc816884a49e38f7065622c8">00756</a> <a class="code" href="a00269.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00269.html">concurrent_hash_map</a>& table ) {
-<a name="l00757"></a>00757 <span class="keywordflow">if</span>( <span class="keyword">this</span>!=&table ) {
-<a name="l00758"></a>00758 clear();
-<a name="l00759"></a>00759 internal_copy(table);
-<a name="l00760"></a>00760 }
-<a name="l00761"></a>00761 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00762"></a>00762 }
-<a name="l00763"></a>00763
-<a name="l00764"></a>00764
-<a name="l00766"></a>00766
-<a name="l00768"></a>00768 <span class="keywordtype">void</span> rehash(size_type n = 0);
-<a name="l00769"></a>00769
-<a name="l00771"></a>00771 <span class="keywordtype">void</span> clear();
-<a name="l00772"></a>00772
-<a name="l00774"></a><a class="code" href="a00269.html#2aa8e2d28d5af1284cf78d20a9c22731">00774</a> ~<a class="code" href="a00269.html">concurrent_hash_map</a>() { clear(); }
-<a name="l00775"></a>00775
-<a name="l00776"></a>00776 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00777"></a>00777 <span class="comment">// Parallel algorithm support</span>
-<a name="l00778"></a>00778 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00779"></a>00779 range_type range( size_type grainsize=1 ) {
-<a name="l00780"></a>00780 <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span>, grainsize );
-<a name="l00781"></a>00781 }
-<a name="l00782"></a>00782 const_range_type range( size_type grainsize=1 )<span class="keyword"> const </span>{
-<a name="l00783"></a>00783 <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span>, grainsize );
-<a name="l00784"></a>00784 }
-<a name="l00785"></a>00785
-<a name="l00786"></a>00786 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00787"></a>00787 <span class="comment">// STL support - not thread-safe methods</span>
-<a name="l00788"></a>00788 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00789"></a>00789 iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
-<a name="l00790"></a>00790 iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,0,0);}
-<a name="l00791"></a>00791 const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
-<a name="l00792"></a>00792 const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0,0,0);}
-<a name="l00793"></a>00793 std::pair<iterator, iterator> equal_range( <span class="keyword">const</span> Key& key ) { <span class="keywordflow">return</span> internal_equal_range(key, end()); }
-<a name="l00794"></a>00794 std::pair<const_iterator, const_iterator> equal_range( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> internal_equal_range(key, end()); }
-<a name="l00795"></a>00795
-<a name="l00797"></a><a class="code" href="a00269.html#6aa56a8b5a25e61a97fa0b54fe2b5659">00797</a> size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
-<a name="l00798"></a>00798
-<a name="l00800"></a><a class="code" href="a00269.html#61ff2e5bb44e5469366fd5295e5d0ebe">00800</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
-<a name="l00801"></a>00801
-<a name="l00803"></a><a class="code" href="a00269.html#2bce57fe9b594abe1e6d2568aea8b357">00803</a> size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(node);}
-<a name="l00804"></a>00804
-<a name="l00806"></a><a class="code" href="a00269.html#af34cb91b1d0f36a885a1a3432dd9af1">00806</a> size_type bucket_count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_mask+1; }
-<a name="l00807"></a>00807
-<a name="l00809"></a><a class="code" href="a00269.html#6cbcacb4a256a85bf89576c101373ca7">00809</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00810"></a>00810
-<a name="l00812"></a>00812 <span class="keywordtype">void</span> swap(<a class="code" href="a00269.html">concurrent_hash_map</a> &table);
-<a name="l00813"></a>00813
-<a name="l00814"></a>00814 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00815"></a>00815 <span class="comment">// concurrent map operations</span>
-<a name="l00816"></a>00816 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00817"></a>00817
-<a name="l00819"></a><a class="code" href="a00269.html#6968eb6feed2df36be421df0464297af">00819</a> size_type count( <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
-<a name="l00820"></a>00820 <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00821"></a>00821 }
-<a name="l00822"></a>00822
-<a name="l00824"></a>00824
-<a name="l00825"></a><a class="code" href="a00269.html#2afcc33dade7bb24e008d60c0df38230">00825</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00272.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
-<a name="l00826"></a>00826 result.<a class="code" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00827"></a>00827 <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00828"></a>00828 }
-<a name="l00829"></a>00829
-<a name="l00831"></a>00831
-<a name="l00832"></a><a class="code" href="a00269.html#7bc475d1968f7f0af3d736d7e8a0d7df">00832</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00270.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00833"></a>00833 result.<a class="code" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00834"></a>00834 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l00835"></a>00835 }
-<a name="l00836"></a>00836
-<a name="l00838"></a>00838
-<a name="l00839"></a><a class="code" href="a00269.html#47fe0e60151a9bd7a444db827772a4e6">00839</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00272.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00840"></a>00840 result.<a class="code" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00841"></a>00841 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00842"></a>00842 }
-<a name="l00843"></a>00843
-<a name="l00845"></a>00845
-<a name="l00846"></a><a class="code" href="a00269.html#54e0955ecd11575b4c07166838a72893">00846</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00270.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00847"></a>00847 result.<a class="code" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00848"></a>00848 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l00849"></a>00849 }
-<a name="l00850"></a>00850
-<a name="l00852"></a>00852
-<a name="l00853"></a><a class="code" href="a00269.html#091efd2d12fdad4fe9e54d9629a9dfc3">00853</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00272.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00854"></a>00854 result.<a class="code" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00855"></a>00855 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00856"></a>00856 }
-<a name="l00857"></a>00857
-<a name="l00859"></a>00859
-<a name="l00860"></a><a class="code" href="a00269.html#39183d78d6e8425917555ab542ab92de">00860</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00270.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00861"></a>00861 result.<a class="code" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00862"></a>00862 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l00863"></a>00863 }
-<a name="l00864"></a>00864
-<a name="l00866"></a>00866
-<a name="l00867"></a><a class="code" href="a00269.html#3f121a316af8135de476a30fae6d7c07">00867</a> <span class="keywordtype">bool</span> insert( <span class="keyword">const</span> value_type &value ) {
-<a name="l00868"></a>00868 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00869"></a>00869 }
-<a name="l00870"></a>00870
-<a name="l00872"></a>00872 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00873"></a><a class="code" href="a00269.html#1dd37fad87e561151ba1e242ca94bcc1">00873</a> <span class="keywordtype">void</span> insert(I first, I last) {
-<a name="l00874"></a>00874 <span class="keywordflow">for</span>(; first != last; ++first)
-<a name="l00875"></a>00875 insert( *first );
-<a name="l00876"></a>00876 }
-<a name="l00877"></a>00877
-<a name="l00879"></a>00879
-<a name="l00880"></a>00880 <span class="keywordtype">bool</span> erase( <span class="keyword">const</span> Key& key );
-<a name="l00881"></a>00881
-<a name="l00883"></a>00883
-<a name="l00884"></a><a class="code" href="a00269.html#e698ef3d70b2d1a29a7a5551784d3653">00884</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00272.html">const_accessor</a>& item_accessor ) {
-<a name="l00885"></a>00885 <span class="keywordflow">return</span> exclude( item_accessor );
-<a name="l00886"></a>00886 }
-<a name="l00887"></a>00887
-<a name="l00889"></a>00889
-<a name="l00890"></a><a class="code" href="a00269.html#5f12d150d421420965db07368666a84f">00890</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00270.html">accessor</a>& item_accessor ) {
-<a name="l00891"></a>00891 <span class="keywordflow">return</span> exclude( item_accessor );
-<a name="l00892"></a>00892 }
-<a name="l00893"></a>00893
-<a name="l00894"></a>00894 <span class="keyword">protected</span>:
-<a name="l00896"></a>00896 <span class="keywordtype">bool</span> lookup( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, const_accessor *result, <span class="keywordtype">bool</span> write );
-<a name="l00897"></a>00897
-<a name="l00899"></a>00899 <span class="keywordtype">bool</span> exclude( const_accessor &item_accessor );
-<a name="l00900"></a>00900
-<a name="l00902"></a>00902 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00903"></a>00903 std::pair<I, I> internal_equal_range( <span class="keyword">const</span> Key& key, I end ) <span class="keyword">const</span>;
-<a name="l00904"></a>00904
-<a name="l00906"></a>00906 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> <a class="code" href="a00269.html">concurrent_hash_map</a>& source );
-<a name="l00907"></a>00907
-<a name="l00908"></a>00908 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00909"></a>00909 <span class="keywordtype">void</span> internal_copy(I first, I last);
-<a name="l00910"></a>00910
-<a name="l00912"></a>00912
-<a name="l00914"></a><a class="code" href="a00269.html#2f76ed101a0ccc8875b846c2f747897e">00914</a> const_pointer internal_fast_find( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{
-<a name="l00915"></a>00915 hashcode_t h = my_hash_compare.hash( key );
-<a name="l00916"></a>00916 hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l00917"></a>00917 node *n;
-<a name="l00918"></a>00918 restart:
-<a name="l00919"></a>00919 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l00920"></a>00920 bucket *b = get_bucket( h & m );
-<a name="l00921"></a>00921 <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
-<a name="l00922"></a>00922 <span class="keywordflow">if</span>( itt_load_word_with_acquire(b->node_list) == internal::rehash_req )
-<a name="l00923"></a>00923 {
-<a name="l00924"></a>00924 bucket::scoped_t lock;
-<a name="l00925"></a>00925 <span class="keywordflow">if</span>( lock.try_acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) ) {
-<a name="l00926"></a>00926 <span class="keywordflow">if</span>( b->node_list == internal::rehash_req)
-<a name="l00927"></a>00927 const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->rehash_bucket( b, h & m ); <span class="comment">//recursive rehashing</span>
-<a name="l00928"></a>00928 }
-<a name="l00929"></a>00929 <span class="keywordflow">else</span> lock.acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00930"></a>00930 __TBB_ASSERT(b->node_list!=internal::rehash_req,NULL);
-<a name="l00931"></a>00931 }
-<a name="l00932"></a>00932 n = search_bucket( key, b );
-<a name="l00933"></a>00933 <span class="keywordflow">if</span>( n )
-<a name="l00934"></a>00934 <span class="keywordflow">return</span> &n->item;
-<a name="l00935"></a>00935 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l00936"></a>00936 <span class="keywordflow">goto</span> restart;
-<a name="l00937"></a>00937 <span class="keywordflow">return</span> 0;
-<a name="l00938"></a>00938 }
-<a name="l00939"></a>00939 };
-<a name="l00940"></a>00940
-<a name="l00941"></a>00941 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00942"></a>00942 <span class="preprocessor"></span> <span class="comment">// Suppress "conditional expression is constant" warning.</span>
-<a name="l00943"></a>00943 <span class="preprocessor"> #pragma warning( push )</span>
-<a name="l00944"></a>00944 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( disable: 4127 )</span>
-<a name="l00945"></a>00945 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00946"></a>00946 <span class="preprocessor"></span>
-<a name="l00947"></a>00947 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l00948"></a><a class="code" href="a00269.html#3f3413264a99174a224ef96f6c4ea769">00948</a> <span class="keywordtype">bool</span> <a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A>::lookup</a>( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, <a class="code" href="a00272.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
-<a name="l00949"></a>00949 __TBB_ASSERT( !result || !result-><a class="code" href="a00272.html#21856da696b0765cc3db90663160d95e">my_node</a>, NULL );
-<a name="l00950"></a>00950 <span class="keywordtype">bool</span> return_value;
-<a name="l00951"></a>00951 hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
-<a name="l00952"></a>00952 hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l00953"></a>00953 segment_index_t grow_segment = 0;
-<a name="l00954"></a>00954 node *n, *tmp_n = 0;
-<a name="l00955"></a>00955 restart:
-<a name="l00956"></a>00956 {<span class="comment">//lock scope</span>
-<a name="l00957"></a>00957 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l00958"></a>00958 return_value = <span class="keyword">false</span>;
-<a name="l00959"></a>00959 <span class="comment">// get bucket</span>
-<a name="l00960"></a>00960 <a class="code" href="a00271.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
-<a name="l00961"></a>00961
-<a name="l00962"></a>00962 <span class="comment">// find a node</span>
-<a name="l00963"></a>00963 n = search_bucket( key, b() );
-<a name="l00964"></a>00964 <span class="keywordflow">if</span>( op_insert ) {
-<a name="l00965"></a>00965 <span class="comment">// [opt] insert a key</span>
-<a name="l00966"></a>00966 <span class="keywordflow">if</span>( !n ) {
-<a name="l00967"></a>00967 <span class="keywordflow">if</span>( !tmp_n ) {
-<a name="l00968"></a>00968 <span class="keywordflow">if</span>(t) tmp_n = <span class="keyword">new</span>( my_allocator ) node(key, *t);
-<a name="l00969"></a>00969 <span class="keywordflow">else</span> tmp_n = <span class="keyword">new</span>( my_allocator ) node(key);
-<a name="l00970"></a>00970 }
-<a name="l00971"></a>00971 <span class="keywordflow">if</span>( !b.<a class="code" href="a00271.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>() && !b.upgrade_to_writer() ) { <span class="comment">// TODO: improved insertion</span>
-<a name="l00972"></a>00972 <span class="comment">// Rerun search_list, in case another thread inserted the item during the upgrade.</span>
-<a name="l00973"></a>00973 n = search_bucket( key, b() );
-<a name="l00974"></a>00974 <span class="keywordflow">if</span>( is_valid(n) ) { <span class="comment">// unfortunately, it did</span>
-<a name="l00975"></a>00975 b.downgrade_to_reader();
-<a name="l00976"></a>00976 <span class="keywordflow">goto</span> exists;
-<a name="l00977"></a>00977 }
-<a name="l00978"></a>00978 }
-<a name="l00979"></a>00979 <span class="keywordflow">if</span>( check_mask_race(h, m) )
-<a name="l00980"></a>00980 <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b().</span>
-<a name="l00981"></a>00981 <span class="comment">// insert and set flag to grow the container</span>
-<a name="l00982"></a>00982 grow_segment = insert_new_node( b(), n = tmp_n, m );
-<a name="l00983"></a>00983 tmp_n = 0;
-<a name="l00984"></a>00984 return_value = <span class="keyword">true</span>;
-<a name="l00985"></a>00985 }
-<a name="l00986"></a>00986 } <span class="keywordflow">else</span> { <span class="comment">// find or count</span>
-<a name="l00987"></a>00987 <span class="keywordflow">if</span>( !n ) {
-<a name="l00988"></a>00988 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l00989"></a>00989 <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b(). TODO: replace by continue</span>
-<a name="l00990"></a>00990 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00991"></a>00991 }
-<a name="l00992"></a>00992 return_value = <span class="keyword">true</span>;
-<a name="l00993"></a>00993 }
-<a name="l00994"></a>00994 exists:
-<a name="l00995"></a>00995 <span class="keywordflow">if</span>( !result ) <span class="keywordflow">goto</span> check_growth;
-<a name="l00996"></a>00996 <span class="comment">// TODO: the following seems as generic/regular operation</span>
-<a name="l00997"></a>00997 <span class="comment">// acquire the item</span>
-<a name="l00998"></a>00998 <span class="keywordflow">if</span>( !result->try_acquire( n->mutex, write ) ) {
-<a name="l00999"></a>00999 <span class="comment">// we are unlucky, prepare for longer wait</span>
-<a name="l01000"></a>01000 <a class="code" href="a00256.html">tbb::internal::atomic_backoff</a> trials;
-<a name="l01001"></a>01001 <span class="keywordflow">do</span> {
-<a name="l01002"></a>01002 <span class="keywordflow">if</span>( !trials.bounded_pause() ) {
-<a name="l01003"></a>01003 <span class="comment">// the wait takes really long, restart the operation</span>
-<a name="l01004"></a>01004 b.release();
-<a name="l01005"></a>01005 __TBB_ASSERT( !op_insert || !return_value, <span class="stringliteral">"Can't acquire new item in locked bucket?"</span> );
-<a name="l01006"></a>01006 __TBB_Yield();
-<a name="l01007"></a>01007 m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l01008"></a>01008 <span class="keywordflow">goto</span> restart;
-<a name="l01009"></a>01009 }
-<a name="l01010"></a>01010 } <span class="keywordflow">while</span>( !result->try_acquire( n->mutex, write ) );
-<a name="l01011"></a>01011 }
-<a name="l01012"></a>01012 }<span class="comment">//lock scope</span>
-<a name="l01013"></a>01013 result-><a class="code" href="a00272.html#21856da696b0765cc3db90663160d95e">my_node</a> = n;
-<a name="l01014"></a>01014 result-><a class="code" href="a00272.html#4936cc9432926ed38f0207828b388e24">my_hash</a> = h;
-<a name="l01015"></a>01015 check_growth:
-<a name="l01016"></a>01016 <span class="comment">// [opt] grow the container</span>
-<a name="l01017"></a>01017 <span class="keywordflow">if</span>( grow_segment ) {
-<a name="l01018"></a>01018 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l01019"></a>01019 <span class="preprocessor"></span> my_info_resizes++; <span class="comment">// concurrent ones</span>
-<a name="l01020"></a>01020 <span class="preprocessor">#endif</span>
-<a name="l01021"></a>01021 <span class="preprocessor"></span> enable_segment( grow_segment );
-<a name="l01022"></a>01022 }
-<a name="l01023"></a>01023 <span class="keywordflow">if</span>( tmp_n ) <span class="comment">// if op_insert only</span>
-<a name="l01024"></a>01024 delete_node( tmp_n );
-<a name="l01025"></a>01025 <span class="keywordflow">return</span> return_value;
-<a name="l01026"></a>01026 }
-<a name="l01027"></a>01027
-<a name="l01028"></a>01028 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01029"></a>01029 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01030"></a><a class="code" href="a00269.html#8f5373b8e1864619d1ffcf3bf3f1f13d">01030</a> std::pair<I, I> <a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_equal_range</a>( <span class="keyword">const</span> Key& key, I end_ )<span class="keyword"> const </span>{
-<a name="l01031"></a>01031 hashcode_t h = my_hash_compare.hash( key );
-<a name="l01032"></a>01032 hashcode_t m = my_mask;
-<a name="l01033"></a>01033 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l01034"></a>01034 h &= m;
-<a name="l01035"></a>01035 bucket *b = get_bucket( h );
-<a name="l01036"></a>01036 <span class="keywordflow">while</span>( b->node_list == internal::rehash_req ) {
-<a name="l01037"></a>01037 m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l01038"></a>01038 b = get_bucket( h &= m );
-<a name="l01039"></a>01039 }
-<a name="l01040"></a>01040 node *n = search_bucket( key, b );
-<a name="l01041"></a>01041 <span class="keywordflow">if</span>( !n )
-<a name="l01042"></a>01042 <span class="keywordflow">return</span> std::make_pair(end_, end_);
-<a name="l01043"></a>01043 iterator lower(*<span class="keyword">this</span>, h, b, n), upper(lower);
-<a name="l01044"></a>01044 <span class="keywordflow">return</span> std::make_pair(lower, ++upper);
-<a name="l01045"></a>01045 }
-<a name="l01046"></a>01046
-<a name="l01047"></a>01047 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01048"></a><a class="code" href="a00269.html#0c964214eb38f54603aa75fdff6d2709">01048</a> <span class="keywordtype">bool</span> <a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00272.html">const_accessor</a> &item_accessor ) {
-<a name="l01049"></a>01049 __TBB_ASSERT( item_accessor.<a class="code" href="a00272.html#21856da696b0765cc3db90663160d95e">my_node</a>, NULL );
-<a name="l01050"></a>01050 node_base *<span class="keyword">const</span> n = item_accessor.<a class="code" href="a00272.html#21856da696b0765cc3db90663160d95e">my_node</a>;
-<a name="l01051"></a>01051 hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00272.html#4936cc9432926ed38f0207828b388e24">my_hash</a>;
-<a name="l01052"></a>01052 hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l01053"></a>01053 <span class="keywordflow">do</span> {
-<a name="l01054"></a>01054 <span class="comment">// get bucket</span>
-<a name="l01055"></a>01055 <a class="code" href="a00271.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m, <span class="comment">/*writer=*/</span><span class="keyword">true</span> );
-<a name="l01056"></a>01056 node_base **p = &b()->node_list;
-<a name="l01057"></a>01057 <span class="keywordflow">while</span>( *p && *p != n )
-<a name="l01058"></a>01058 p = &(*p)->next;
-<a name="l01059"></a>01059 <span class="keywordflow">if</span>( !*p ) { <span class="comment">// someone else was first</span>
-<a name="l01060"></a>01060 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01061"></a>01061 <span class="keywordflow">continue</span>;
-<a name="l01062"></a>01062 item_accessor.<a class="code" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l01063"></a>01063 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01064"></a>01064 }
-<a name="l01065"></a>01065 __TBB_ASSERT( *p == n, NULL );
-<a name="l01066"></a>01066 *p = n->next; <span class="comment">// remove from container</span>
-<a name="l01067"></a>01067 my_size--;
-<a name="l01068"></a>01068 <span class="keywordflow">break</span>;
-<a name="l01069"></a>01069 } <span class="keywordflow">while</span>(<span class="keyword">true</span>);
-<a name="l01070"></a>01070 <span class="keywordflow">if</span>( !item_accessor.<a class="code" href="a00272.html#45ab59454c6f11fe938bbcab637cdd73">is_writer</a>() ) <span class="comment">// need to get exclusive lock</span>
-<a name="l01071"></a>01071 item_accessor.upgrade_to_writer(); <span class="comment">// return value means nothing here</span>
-<a name="l01072"></a>01072 item_accessor.<a class="code" href="a00272.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l01073"></a>01073 delete_node( n ); <span class="comment">// Only one thread can delete it</span>
-<a name="l01074"></a>01074 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01075"></a>01075 }
-<a name="l01076"></a>01076
-<a name="l01077"></a>01077 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01078"></a><a class="code" href="a00269.html#f27802b3a8d1863c29e743e9c6b4e870">01078</a> <span class="keywordtype">bool</span> <a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A>::erase</a>( <span class="keyword">const</span> Key &key ) {
-<a name="l01079"></a>01079 node_base *n;
-<a name="l01080"></a>01080 hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
-<a name="l01081"></a>01081 hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l01082"></a>01082 restart:
-<a name="l01083"></a>01083 {<span class="comment">//lock scope</span>
-<a name="l01084"></a>01084 <span class="comment">// get bucket</span>
-<a name="l01085"></a>01085 <a class="code" href="a00271.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
-<a name="l01086"></a>01086 search:
-<a name="l01087"></a>01087 node_base **p = &b()->node_list;
-<a name="l01088"></a>01088 n = *p;
-<a name="l01089"></a>01089 <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, static_cast<node*>(n)->item.first ) ) {
-<a name="l01090"></a>01090 p = &n->next;
-<a name="l01091"></a>01091 n = *p;
-<a name="l01092"></a>01092 }
-<a name="l01093"></a>01093 <span class="keywordflow">if</span>( !n ) { <span class="comment">// not found, but mask could be changed</span>
-<a name="l01094"></a>01094 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01095"></a>01095 <span class="keywordflow">goto</span> restart;
-<a name="l01096"></a>01096 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01097"></a>01097 }
-<a name="l01098"></a>01098 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !b.<a class="code" href="a00271.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>() && !b.upgrade_to_writer() ) {
-<a name="l01099"></a>01099 <span class="keywordflow">if</span>( check_mask_race( h, m ) ) <span class="comment">// contended upgrade, check mask</span>
-<a name="l01100"></a>01100 <span class="keywordflow">goto</span> restart;
-<a name="l01101"></a>01101 <span class="keywordflow">goto</span> search;
-<a name="l01102"></a>01102 }
-<a name="l01103"></a>01103 *p = n->next;
-<a name="l01104"></a>01104 my_size--;
-<a name="l01105"></a>01105 }
-<a name="l01106"></a>01106 {
-<a name="l01107"></a>01107 <span class="keyword">typename</span> node::scoped_t item_locker( n->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l01108"></a>01108 }
-<a name="l01109"></a>01109 <span class="comment">// note: there should be no threads pretending to acquire this mutex again, do not try to upgrade const_accessor!</span>
-<a name="l01110"></a>01110 delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the bucket</span>
-<a name="l01111"></a>01111 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01112"></a>01112 }
-<a name="l01113"></a>01113
-<a name="l01114"></a>01114 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01115"></a>01115 <span class="keywordtype">void</span> <a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A></a> &table) {
-<a name="l01116"></a>01116 std::swap(this->my_allocator, table.<a class="code" href="a00269.html#a72cb6e9873e5541295682179e5a7f74">my_allocator</a>);
-<a name="l01117"></a>01117 std::swap(this->my_hash_compare, table.<a class="code" href="a00269.html#53c747a3f2d2d2c85aec866e19c31c29">my_hash_compare</a>);
-<a name="l01118"></a>01118 internal_swap(table);
-<a name="l01119"></a>01119 }
-<a name="l01120"></a>01120
-<a name="l01121"></a>01121 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01122"></a><a class="code" href="a00269.html#94758113d8993cfe5afdf2d63a728869">01122</a> <span class="keywordtype">void</span> <a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A>::rehash</a>(size_type sz) {
-<a name="l01123"></a>01123 reserve( sz ); <span class="comment">// TODO: add reduction of number of buckets as well</span>
-<a name="l01124"></a>01124 hashcode_t mask = my_mask;
-<a name="l01125"></a>01125 hashcode_t b = (mask+1)>>1; <span class="comment">// size or first index of the last segment</span>
-<a name="l01126"></a>01126 __TBB_ASSERT((b&(b-1))==0, NULL); <span class="comment">// zero or power of 2</span>
-<a name="l01127"></a>01127 bucket *bp = get_bucket( b ); <span class="comment">// only the last segment should be scanned for rehashing</span>
-<a name="l01128"></a>01128 <span class="keywordflow">for</span>(; b <= mask; b++, bp++ ) {
-<a name="l01129"></a>01129 node_base *n = bp->node_list;
-<a name="l01130"></a>01130 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01131"></a>01131 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
-<a name="l01132"></a>01132 <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// rehash bucket, conditional because rehashing of a previous bucket may affect this one</span>
-<a name="l01133"></a>01133 hashcode_t h = b; bucket *b_old = bp;
-<a name="l01134"></a>01134 <span class="keywordflow">do</span> {
-<a name="l01135"></a>01135 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
-<a name="l01136"></a>01136 hashcode_t m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l01137"></a>01137 b_old = get_bucket( h &= m );
-<a name="l01138"></a>01138 } <span class="keywordflow">while</span>( b_old->node_list == internal::rehash_req );
-<a name="l01139"></a>01139 <span class="comment">// now h - is index of the root rehashed bucket b_old</span>
-<a name="l01140"></a>01140 mark_rehashed_levels( h ); <span class="comment">// mark all non-rehashed children recursively across all segments</span>
-<a name="l01141"></a>01141 <span class="keywordflow">for</span>( node_base **p = &b_old->node_list, *q = *p; is_valid(q); q = *p ) {
-<a name="l01142"></a>01142 hashcode_t c = my_hash_compare.hash( static_cast<node*>(q)->item.first );
-<a name="l01143"></a>01143 <span class="keywordflow">if</span>( (c & mask) != h ) { <span class="comment">// should be rehashed</span>
-<a name="l01144"></a>01144 *p = q->next; <span class="comment">// exclude from b_old</span>
-<a name="l01145"></a>01145 bucket *b_new = get_bucket( c & mask );
-<a name="l01146"></a>01146 __TBB_ASSERT( b_new->node_list != internal::rehash_req, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01147"></a>01147 add_to_bucket( b_new, q );
-<a name="l01148"></a>01148 } <span class="keywordflow">else</span> p = &q->next; <span class="comment">// iterate to next item</span>
-<a name="l01149"></a>01149 }
-<a name="l01150"></a>01150 }
-<a name="l01151"></a>01151 }
-<a name="l01152"></a>01152 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01153"></a>01153 <span class="preprocessor"></span> <span class="keywordtype">int</span> current_size = int(my_size), buckets = int(mask)+1, empty_buckets = 0, overpopulated_buckets = 0; <span class="comment">// usage statistics</span>
-<a name="l01154"></a>01154 <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
-<a name="l01155"></a>01155 <span class="preprocessor">#endif</span>
-<a name="l01156"></a>01156 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01157"></a>01157 <span class="preprocessor"></span> <span class="keywordflow">for</span>( b = 0; b <= mask; b++ ) {<span class="comment">// only last segment should be scanned for rehashing</span>
-<a name="l01158"></a>01158 <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
-<a name="l01159"></a>01159 <span class="keywordflow">else</span> bp = get_bucket( b );
-<a name="l01160"></a>01160 node_base *n = bp->node_list;
-<a name="l01161"></a>01161 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
-<a name="l01162"></a>01162 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01163"></a>01163 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01164"></a>01164 <span class="preprocessor"></span> <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
-<a name="l01165"></a>01165 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
-<a name="l01166"></a>01166 <span class="preprocessor">#endif</span>
-<a name="l01167"></a>01167 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l01168"></a>01168 <span class="preprocessor"></span> <span class="keywordflow">for</span>( ; is_valid(n); n = n->next ) {
-<a name="l01169"></a>01169 hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first ) & mask;
-<a name="l01170"></a>01170 __TBB_ASSERT( h == b, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01171"></a>01171 }
-<a name="l01172"></a>01172 <span class="preprocessor">#endif</span>
-<a name="l01173"></a>01173 <span class="preprocessor"></span> }
-<a name="l01174"></a>01174 <span class="preprocessor">#endif // TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01175"></a>01175 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01176"></a>01176 <span class="preprocessor"></span> <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
-<a name="l01177"></a>01177 <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
-<a name="l01178"></a>01178 <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
-<a name="l01179"></a>01179 tbb::internal::runtime_warning(
-<a name="l01180"></a>01180 <span class="stringliteral">"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d Empties: %d Overlaps: %d"</span>,
-<a name="l01181"></a>01181 <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
-<a name="l01182"></a>01182 reported = <span class="keyword">true</span>;
-<a name="l01183"></a>01183 }
-<a name="l01184"></a>01184 <span class="preprocessor">#endif</span>
-<a name="l01185"></a>01185 <span class="preprocessor"></span>}
-<a name="l01186"></a>01186
-<a name="l01187"></a>01187 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01188"></a><a class="code" href="a00269.html#220686fe17b197eedf19dd856cd02e36">01188</a> <span class="keywordtype">void</span> <a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A>::clear</a>() {
-<a name="l01189"></a>01189 hashcode_t m = my_mask;
-<a name="l01190"></a>01190 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l01191"></a>01191 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01192"></a>01192 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01193"></a>01193 <span class="preprocessor"></span> <span class="keywordtype">int</span> current_size = int(my_size), buckets = int(m)+1, empty_buckets = 0, overpopulated_buckets = 0; <span class="comment">// usage statistics</span>
-<a name="l01194"></a>01194 <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
-<a name="l01195"></a>01195 <span class="preprocessor">#endif</span>
-<a name="l01196"></a>01196 <span class="preprocessor"></span> bucket *bp = 0;
-<a name="l01197"></a>01197 <span class="comment">// check consistency</span>
-<a name="l01198"></a>01198 <span class="keywordflow">for</span>( segment_index_t b = 0; b <= m; b++ ) {
-<a name="l01199"></a>01199 <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
-<a name="l01200"></a>01200 <span class="keywordflow">else</span> bp = get_bucket( b );
-<a name="l01201"></a>01201 node_base *n = bp->node_list;
-<a name="l01202"></a>01202 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01203"></a>01203 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during clear() execution"</span> );
-<a name="l01204"></a>01204 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01205"></a>01205 <span class="preprocessor"></span> <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
-<a name="l01206"></a>01206 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n == internal::rehash_req ) buckets--;
-<a name="l01207"></a>01207 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
-<a name="l01208"></a>01208 <span class="preprocessor">#endif</span>
-<a name="l01209"></a>01209 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l01210"></a>01210 <span class="preprocessor"></span> <span class="keywordflow">for</span>(; is_valid(n); n = n->next ) {
-<a name="l01211"></a>01211 hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first );
-<a name="l01212"></a>01212 h &= m;
-<a name="l01213"></a>01213 __TBB_ASSERT( h == b || get_bucket(h)->node_list == internal::rehash_req, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01214"></a>01214 }
-<a name="l01215"></a>01215 <span class="preprocessor">#endif</span>
-<a name="l01216"></a>01216 <span class="preprocessor"></span> }
-<a name="l01217"></a>01217 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01218"></a>01218 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l01219"></a>01219 <span class="preprocessor"></span> printf( <span class="stringliteral">"items=%d buckets: capacity=%d rehashed=%d empty=%d overpopulated=%d"</span>
-<a name="l01220"></a>01220 <span class="stringliteral">" concurrent: resizes=%u rehashes=%u restarts=%u\n"</span>,
-<a name="l01221"></a>01221 current_size, <span class="keywordtype">int</span>(m+1), buckets, empty_buckets, overpopulated_buckets,
-<a name="l01222"></a>01222 <span class="keywordtype">unsigned</span>(my_info_resizes), <span class="keywordtype">unsigned</span>(my_info_rehashes), <span class="keywordtype">unsigned</span>(my_info_restarts) );
-<a name="l01223"></a>01223 my_info_resizes = 0; <span class="comment">// concurrent ones</span>
-<a name="l01224"></a>01224 my_info_restarts = 0; <span class="comment">// race collisions</span>
-<a name="l01225"></a>01225 my_info_rehashes = 0; <span class="comment">// invocations of rehash_bucket</span>
-<a name="l01226"></a>01226 <span class="preprocessor">#endif</span>
-<a name="l01227"></a>01227 <span class="preprocessor"></span> <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
-<a name="l01228"></a>01228 <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
-<a name="l01229"></a>01229 <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
-<a name="l01230"></a>01230 tbb::internal::runtime_warning(
-<a name="l01231"></a>01231 <span class="stringliteral">"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d Empties: %d Overlaps: %d"</span>,
-<a name="l01232"></a>01232 <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
-<a name="l01233"></a>01233 reported = <span class="keyword">true</span>;
-<a name="l01234"></a>01234 }
-<a name="l01235"></a>01235 <span class="preprocessor">#endif</span>
-<a name="l01236"></a>01236 <span class="preprocessor"></span><span class="preprocessor">#endif//TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01237"></a>01237 <span class="preprocessor"></span> my_size = 0;
-<a name="l01238"></a>01238 segment_index_t s = segment_index_of( m );
-<a name="l01239"></a>01239 __TBB_ASSERT( s+1 == pointers_per_table || !my_table[s+1], <span class="stringliteral">"wrong mask or concurrent grow"</span> );
-<a name="l01240"></a>01240 <a class="code" href="a00264.html">cache_aligned_allocator<bucket></a> alloc;
-<a name="l01241"></a>01241 <span class="keywordflow">do</span> {
-<a name="l01242"></a>01242 __TBB_ASSERT( is_valid( my_table[s] ), <span class="stringliteral">"wrong mask or concurrent grow"</span> );
-<a name="l01243"></a>01243 segment_ptr_t buckets_ptr = my_table[s];
-<a name="l01244"></a>01244 size_type sz = segment_size( s ? s : 1 );
-<a name="l01245"></a>01245 <span class="keywordflow">for</span>( segment_index_t i = 0; i < sz; i++ )
-<a name="l01246"></a>01246 <span class="keywordflow">for</span>( node_base *n = buckets_ptr[i].node_list; is_valid(n); n = buckets_ptr[i].node_list ) {
-<a name="l01247"></a>01247 buckets_ptr[i].node_list = n->next;
-<a name="l01248"></a>01248 delete_node( n );
-<a name="l01249"></a>01249 }
-<a name="l01250"></a>01250 <span class="keywordflow">if</span>( s >= first_block) <span class="comment">// the first segment or the next</span>
-<a name="l01251"></a>01251 alloc.<a class="code" href="a00264.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, sz );
-<a name="l01252"></a>01252 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( s == embedded_block && embedded_block != first_block )
-<a name="l01253"></a>01253 alloc.<a class="code" href="a00264.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, segment_size(first_block)-embedded_buckets );
-<a name="l01254"></a>01254 <span class="keywordflow">if</span>( s >= embedded_block ) my_table[s] = 0;
-<a name="l01255"></a>01255 } <span class="keywordflow">while</span>(s-- > 0);
-<a name="l01256"></a>01256 my_mask = embedded_buckets - 1;
-<a name="l01257"></a>01257 }
-<a name="l01258"></a>01258
-<a name="l01259"></a>01259 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01260"></a><a class="code" href="a00269.html#72c9c9e9655fcf096f5f0ed9c8ba6669">01260</a> <span class="keywordtype">void</span> <a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00269.html">concurrent_hash_map</a>& source ) {
-<a name="l01261"></a>01261 reserve( source.my_size ); <span class="comment">// TODO: load_factor?</span>
-<a name="l01262"></a>01262 hashcode_t mask = source.my_mask;
-<a name="l01263"></a>01263 <span class="keywordflow">if</span>( my_mask == mask ) { <span class="comment">// optimized version</span>
-<a name="l01264"></a>01264 bucket *dst = 0, *src = 0;
-<a name="l01265"></a>01265 <span class="keywordtype">bool</span> rehash_required = <span class="keyword">false</span>;
-<a name="l01266"></a>01266 <span class="keywordflow">for</span>( hashcode_t k = 0; k <= mask; k++ ) {
-<a name="l01267"></a>01267 <span class="keywordflow">if</span>( k & (k-2) ) ++dst,src++; <span class="comment">// not the beginning of a segment</span>
-<a name="l01268"></a>01268 <span class="keywordflow">else</span> { dst = get_bucket( k ); src = source.get_bucket( k ); }
-<a name="l01269"></a>01269 __TBB_ASSERT( dst->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
-<a name="l01270"></a>01270 node *n = static_cast<node*>( src->node_list );
-<a name="l01271"></a>01271 <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// source is not rehashed, items are in previous buckets</span>
-<a name="l01272"></a>01272 rehash_required = <span class="keyword">true</span>;
-<a name="l01273"></a>01273 dst->node_list = internal::rehash_req;
-<a name="l01274"></a>01274 } <span class="keywordflow">else</span> <span class="keywordflow">for</span>(; n; n = static_cast<node*>( n->next ) ) {
-<a name="l01275"></a>01275 add_to_bucket( dst, <span class="keyword">new</span>( my_allocator ) node(n->item.first, n->item.second) );
-<a name="l01276"></a>01276 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
-<a name="l01277"></a>01277 }
-<a name="l01278"></a>01278 }
-<a name="l01279"></a>01279 <span class="keywordflow">if</span>( rehash_required ) <a class="code" href="a00269.html#94758113d8993cfe5afdf2d63a728869">rehash</a>();
-<a name="l01280"></a>01280 } <span class="keywordflow">else</span> <a class="code" href="a00269.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>( source.<a class="code" href="a00269.html#35a8c373fc3d52099ae18f0553162491">begin</a>(), source.<a class="code" href="a00269.html#67c50bddda53b9a10318f8981e4fc4fa">end</a>() );
-<a name="l01281"></a>01281 }
-<a name="l01282"></a>01282
-<a name="l01283"></a>01283 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01284"></a>01284 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01285"></a>01285 <span class="keywordtype">void</span> <a class="code" href="a00269.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>(I first, I last) {
-<a name="l01286"></a>01286 hashcode_t m = my_mask;
-<a name="l01287"></a>01287 <span class="keywordflow">for</span>(; first != last; ++first) {
-<a name="l01288"></a>01288 hashcode_t h = my_hash_compare.hash( first->first );
-<a name="l01289"></a>01289 bucket *b = get_bucket( h & m );
-<a name="l01290"></a>01290 __TBB_ASSERT( b->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
-<a name="l01291"></a>01291 node *n = <span class="keyword">new</span>( my_allocator ) node(first->first, first->second);
-<a name="l01292"></a>01292 add_to_bucket( b, n );
-<a name="l01293"></a>01293 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
-<a name="l01294"></a>01294 }
-<a name="l01295"></a>01295 }
-<a name="l01296"></a>01296
-<a name="l01297"></a>01297 } <span class="comment">// namespace interface5</span>
-<a name="l01298"></a>01298
-<a name="l01299"></a>01299 <span class="keyword">using</span> interface5::concurrent_hash_map;
-<a name="l01300"></a>01300
-<a name="l01301"></a>01301
-<a name="l01302"></a>01302 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2>
-<a name="l01303"></a>01303 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A1> &a, <span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A2> &b) {
-<a name="l01304"></a>01304 <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01305"></a>01305 <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A1>::const_iterator i(a.begin()), i_end(a.end());
-<a name="l01306"></a>01306 <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A2>::const_iterator j, j_end(b.end());
-<a name="l01307"></a>01307 <span class="keywordflow">for</span>(; i != i_end; ++i) {
-<a name="l01308"></a>01308 j = b.equal_range(i->first).first;
-<a name="l01309"></a>01309 <span class="keywordflow">if</span>( j == j_end || !(i->second == j->second) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01310"></a>01310 }
-<a name="l01311"></a>01311 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01312"></a>01312 }
-<a name="l01313"></a>01313
-<a name="l01314"></a>01314 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2>
-<a name="l01315"></a>01315 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A1> &a, <span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A2> &b)
-<a name="l01316"></a>01316 { <span class="keywordflow">return</span> !(a == b); }
-<a name="l01317"></a>01317
-<a name="l01318"></a>01318 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01319"></a>01319 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_hash_map<Key, T, HashCompare, A> &a, concurrent_hash_map<Key, T, HashCompare, A> &b)
-<a name="l01320"></a>01320 { a.swap( b ); }
-<a name="l01321"></a>01321
-<a name="l01322"></a>01322 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l01323"></a>01323 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( pop )</span>
-<a name="l01324"></a>01324 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4127 is back</span>
-<a name="l01325"></a>01325 <span class="preprocessor"></span>
-<a name="l01326"></a>01326 } <span class="comment">// namespace tbb</span>
-<a name="l01327"></a>01327
-<a name="l01328"></a>01328 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_hash_map_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00466.html b/doc/html/a00466.html
deleted file mode 100644
index 96b7814..0000000
--- a/doc/html/a00466.html
+++ /dev/null
@@ -1,260 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_lru_cache.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>concurrent_lru_cache.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_lru_cache_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_lru_cache_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if ! TBB_PREVIEW_CONCURRENT_LRU_CACHE</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor"> #error Set TBB_PREVIEW_CONCURRENT_LRU_CACHE to include concurrent_lru_cache.h</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include <map></span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include <list></span>
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "internal/_aggregator_impl.h"</span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keyword">namespace </span>tbb{
-<a name="l00036"></a>00036 <span class="keyword">namespace </span>interface6 {
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">template</span> <<span class="keyword">typename</span> key_type, <span class="keyword">typename</span> value_type, <span class="keyword">typename</span> value_functor_type = value_type (*)(key_type) >
-<a name="l00040"></a>00040 <span class="keyword">class </span>concurrent_lru_cache : internal::no_assign{
-<a name="l00041"></a>00041 <span class="keyword">private</span>:
-<a name="l00042"></a>00042 <span class="keyword">typedef</span> concurrent_lru_cache self_type;
-<a name="l00043"></a>00043 <span class="keyword">typedef</span> value_functor_type value_function_type;
-<a name="l00044"></a>00044 <span class="keyword">typedef</span> std::size_t ref_counter_type;
-<a name="l00045"></a>00045 <span class="keyword">struct </span>map_value_type;
-<a name="l00046"></a>00046 <span class="keyword">typedef</span> std::map<key_type, map_value_type> map_storage_type;
-<a name="l00047"></a>00047 <span class="keyword">typedef</span> std::list<typename map_storage_type::iterator> lru_list_type;
-<a name="l00048"></a>00048 <span class="keyword">struct </span>map_value_type {
-<a name="l00049"></a>00049 value_type my_value;
-<a name="l00050"></a>00050 ref_counter_type my_ref_counter;
-<a name="l00051"></a>00051 <span class="keyword">typename</span> lru_list_type::iterator my_lru_list_iterator;
-<a name="l00052"></a>00052 <span class="keywordtype">bool</span> my_is_ready;
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 map_value_type (value_type <span class="keyword">const</span>& a_value, ref_counter_type a_ref_counter, <span class="keyword">typename</span> lru_list_type::iterator a_lru_list_iterator, <span class="keywordtype">bool</span> a_is_ready)
-<a name="l00055"></a>00055 : my_value(a_value), my_ref_counter(a_ref_counter), my_lru_list_iterator (a_lru_list_iterator), my_is_ready(a_is_ready)
-<a name="l00056"></a>00056 {}
-<a name="l00057"></a>00057 };
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 <span class="keyword">class </span>handle_object;
-<a name="l00060"></a>00060
-<a name="l00061"></a>00061 <span class="keyword">struct </span>aggregator_operation;
-<a name="l00062"></a>00062 <span class="keyword">typedef</span> aggregator_operation aggregated_operation_type;
-<a name="l00063"></a>00063 <span class="keyword">typedef</span> tbb::internal::aggregating_functor<self_type,aggregated_operation_type> aggregator_function_type;
-<a name="l00064"></a>00064 <span class="keyword">friend</span> <span class="keyword">class </span>tbb::internal::aggregating_functor<self_type,aggregated_operation_type>;
-<a name="l00065"></a>00065 <span class="keyword">typedef</span> tbb::internal::aggregator<aggregator_function_type, aggregated_operation_type> aggregator_type;
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">private</span>:
-<a name="l00068"></a>00068 value_function_type my_value_function;
-<a name="l00069"></a>00069 std::size_t <span class="keyword">const</span> my_number_of_lru_history_items;
-<a name="l00070"></a>00070 map_storage_type my_map_storage;
-<a name="l00071"></a>00071 lru_list_type my_lru_list;
-<a name="l00072"></a>00072 aggregator_type my_aggregator;
-<a name="l00073"></a>00073
-<a name="l00074"></a>00074 <span class="keyword">public</span>:
-<a name="l00075"></a>00075 <span class="keyword">typedef</span> handle_object handle;
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 <span class="keyword">public</span>:
-<a name="l00078"></a>00078 concurrent_lru_cache(value_function_type f, std::size_t number_of_lru_history_items)
-<a name="l00079"></a>00079 : my_value_function(f),my_number_of_lru_history_items(number_of_lru_history_items)
-<a name="l00080"></a>00080 {
-<a name="l00081"></a>00081 my_aggregator.initialize_handler(aggregator_function_type(<span class="keyword">this</span>));
-<a name="l00082"></a>00082 }
-<a name="l00083"></a>00083
-<a name="l00084"></a>00084 handle_object operator[](key_type k){
-<a name="l00085"></a>00085 retrieve_aggregator_operation op(k);
-<a name="l00086"></a>00086 my_aggregator.execute(&op);
-<a name="l00087"></a>00087 <span class="keywordflow">if</span> (op.is_new_value_needed()){
-<a name="l00088"></a>00088 op.result().second.my_value = my_value_function(k);
-<a name="l00089"></a>00089 __TBB_store_with_release(op.result().second.my_is_ready, <span class="keyword">true</span>);
-<a name="l00090"></a>00090 }<span class="keywordflow">else</span>{
-<a name="l00091"></a>00091 tbb::internal::spin_wait_while_eq(op.result().second.my_is_ready,<span class="keyword">false</span>);
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093 <span class="keywordflow">return</span> handle_object(*<span class="keyword">this</span>,op.result());
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095 <span class="keyword">private</span>:
-<a name="l00096"></a>00096 <span class="keywordtype">void</span> signal_end_of_usage(<span class="keyword">typename</span> map_storage_type::reference value_ref){
-<a name="l00097"></a>00097 signal_end_of_usage_aggregator_operation op(value_ref);
-<a name="l00098"></a>00098 my_aggregator.execute(&op);
-<a name="l00099"></a>00099 }
-<a name="l00100"></a>00100
-<a name="l00101"></a>00101 <span class="keyword">private</span>:
-<a name="l00102"></a>00102 <span class="keyword">struct </span>handle_move_t:no_assign{
-<a name="l00103"></a>00103 concurrent_lru_cache & my_cache_ref;
-<a name="l00104"></a>00104 <span class="keyword">typename</span> map_storage_type::reference my_map_record_ref;
-<a name="l00105"></a>00105 handle_move_t(concurrent_lru_cache & cache_ref, <span class="keyword">typename</span> map_storage_type::reference value_ref):my_cache_ref(cache_ref),my_map_record_ref(value_ref) {};
-<a name="l00106"></a>00106 };
-<a name="l00107"></a>00107 <span class="keyword">class </span>handle_object {
-<a name="l00108"></a>00108 concurrent_lru_cache * my_cache_pointer;
-<a name="l00109"></a>00109 <span class="keyword">typename</span> map_storage_type::reference my_map_record_ref;
-<a name="l00110"></a>00110 <span class="keyword">public</span>:
-<a name="l00111"></a>00111 handle_object(concurrent_lru_cache & cache_ref, <span class="keyword">typename</span> map_storage_type::reference value_ref):my_cache_pointer(&cache_ref), my_map_record_ref(value_ref) {}
-<a name="l00112"></a>00112 handle_object(handle_move_t m):my_cache_pointer(&m.my_cache_ref), my_map_record_ref(m.my_map_record_ref){}
-<a name="l00113"></a>00113 operator handle_move_t(){ <span class="keywordflow">return</span> move(*<span class="keyword">this</span>);}
-<a name="l00114"></a>00114 value_type& value(){
-<a name="l00115"></a>00115 __TBB_ASSERT(my_cache_pointer,<span class="stringliteral">"get value from moved from object?"</span>);
-<a name="l00116"></a>00116 <span class="keywordflow">return</span> my_map_record_ref.second.my_value;
-<a name="l00117"></a>00117 }
-<a name="l00118"></a>00118 ~handle_object(){
-<a name="l00119"></a>00119 <span class="keywordflow">if</span> (my_cache_pointer){
-<a name="l00120"></a>00120 my_cache_pointer->signal_end_of_usage(my_map_record_ref);
-<a name="l00121"></a>00121 }
-<a name="l00122"></a>00122 }
-<a name="l00123"></a>00123 <span class="keyword">private</span>:
-<a name="l00124"></a>00124 <span class="keyword">friend</span> handle_move_t move(handle_object& h){
-<a name="l00125"></a>00125 <span class="keywordflow">return</span> handle_object::move(h);
-<a name="l00126"></a>00126 }
-<a name="l00127"></a>00127 <span class="keyword">static</span> handle_move_t move(handle_object& h){
-<a name="l00128"></a>00128 __TBB_ASSERT(h.my_cache_pointer,<span class="stringliteral">"move from the same object twice ?"</span>);
-<a name="l00129"></a>00129 concurrent_lru_cache * cache_pointer = NULL;
-<a name="l00130"></a>00130 std::swap(cache_pointer,h.my_cache_pointer);
-<a name="l00131"></a>00131 <span class="keywordflow">return</span> handle_move_t(*cache_pointer,h.my_map_record_ref);
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133 <span class="keyword">private</span>:
-<a name="l00134"></a>00134 <span class="keywordtype">void</span> operator=(handle_object&);
-<a name="l00135"></a>00135 handle_object(handle_object &);
-<a name="l00136"></a>00136 };
-<a name="l00137"></a>00137 <span class="keyword">private</span>:
-<a name="l00138"></a>00138 <span class="comment">//TODO: looks like aggregator_operation is a perfect match for statically typed variant type</span>
-<a name="l00139"></a>00139 <span class="keyword">struct </span>aggregator_operation : tbb::internal::aggregated_operation<aggregator_operation>{
-<a name="l00140"></a>00140 <span class="keyword">enum</span> e_op_type {op_retive, op_signal_end_of_usage};
-<a name="l00141"></a>00141 <span class="comment">//TODO: try to use pointer to function apply_visitor here</span>
-<a name="l00142"></a>00142 <span class="comment">//TODO: try virtual functions and measure the difference</span>
-<a name="l00143"></a>00143 e_op_type my_operation_type;
-<a name="l00144"></a>00144 aggregator_operation(e_op_type operation_type): my_operation_type(operation_type) {}
-<a name="l00145"></a>00145 <span class="keywordtype">void</span> cast_and_handle(self_type& container ){
-<a name="l00146"></a>00146 <span class="keywordflow">if</span> (my_operation_type==op_retive){
-<a name="l00147"></a>00147 static_cast<retrieve_aggregator_operation*>(<span class="keyword">this</span>)->handle(container);
-<a name="l00148"></a>00148 }<span class="keywordflow">else</span>{
-<a name="l00149"></a>00149 static_cast<signal_end_of_usage_aggregator_operation*>(<span class="keyword">this</span>)->handle(container);
-<a name="l00150"></a>00150 }
-<a name="l00151"></a>00151 }
-<a name="l00152"></a>00152 };
-<a name="l00153"></a>00153 <span class="keyword">struct </span>retrieve_aggregator_operation : aggregator_operation, <span class="keyword">private</span> internal::no_assign {
-<a name="l00154"></a>00154 key_type my_key;
-<a name="l00155"></a>00155 <span class="keyword">typename</span> map_storage_type::pointer my_result_map_record_pointer;
-<a name="l00156"></a>00156 <span class="keywordtype">bool</span> my_is_new_value_needed;
-<a name="l00157"></a>00157 retrieve_aggregator_operation(key_type key):aggregator_operation(aggregator_operation::op_retive),my_key(key),my_is_new_value_needed(false){}
-<a name="l00158"></a>00158 <span class="keywordtype">void</span> handle(self_type& container ){
-<a name="l00159"></a>00159 my_result_map_record_pointer = & container.retrieve_serial(my_key,my_is_new_value_needed);
-<a name="l00160"></a>00160 }
-<a name="l00161"></a>00161 <span class="keyword">typename</span> map_storage_type::reference result(){ <span class="keywordflow">return</span> * my_result_map_record_pointer; }
-<a name="l00162"></a>00162 <span class="keywordtype">bool</span> is_new_value_needed(){<span class="keywordflow">return</span> my_is_new_value_needed;}
-<a name="l00163"></a>00163 };
-<a name="l00164"></a>00164 <span class="keyword">struct </span>signal_end_of_usage_aggregator_operation : aggregator_operation, <span class="keyword">private</span> internal::no_assign {
-<a name="l00165"></a>00165 <span class="keyword">typename</span> map_storage_type::reference my_map_record_ref;
-<a name="l00166"></a>00166 signal_end_of_usage_aggregator_operation(<span class="keyword">typename</span> map_storage_type::reference map_record_ref):aggregator_operation(aggregator_operation::op_signal_end_of_usage),my_map_record_ref(map_record_ref){}
-<a name="l00167"></a>00167 <span class="keywordtype">void</span> handle(self_type& container ){
-<a name="l00168"></a>00168 container.signal_end_of_usage_serial(my_map_record_ref);
-<a name="l00169"></a>00169 }
-<a name="l00170"></a>00170 };
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="keyword">private</span>:
-<a name="l00173"></a>00173 <span class="keywordtype">void</span> handle_operations(aggregator_operation* op_list){
-<a name="l00174"></a>00174 <span class="keywordflow">while</span>(op_list){
-<a name="l00175"></a>00175 op_list->cast_and_handle(*<span class="keyword">this</span>);
-<a name="l00176"></a>00176 aggregator_operation* tmp = op_list;
-<a name="l00177"></a>00177 op_list=op_list->next;
-<a name="l00178"></a>00178 tbb::internal::itt_store_word_with_release(tmp->status, uintptr_t(1));
-<a name="l00179"></a>00179 }
-<a name="l00180"></a>00180 }
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 <span class="keyword">private</span>:
-<a name="l00183"></a>00183 <span class="keyword">typename</span> map_storage_type::reference retrieve_serial(key_type k, <span class="keywordtype">bool</span>& is_new_value_needed){
-<a name="l00184"></a>00184 <span class="keyword">typename</span> map_storage_type::iterator it = my_map_storage.find(k);
-<a name="l00185"></a>00185 <span class="keywordflow">if</span> (it == my_map_storage.end()){
-<a name="l00186"></a>00186 it = my_map_storage.insert(it,std::make_pair(k,map_value_type(value_type(),0,my_lru_list.end(),<span class="keyword">false</span>)));
-<a name="l00187"></a>00187 is_new_value_needed = <span class="keyword">true</span>;
-<a name="l00188"></a>00188 }<span class="keywordflow">else</span> {
-<a name="l00189"></a>00189 <span class="keyword">typename</span> lru_list_type::iterator list_it = it->second.my_lru_list_iterator;
-<a name="l00190"></a>00190 <span class="keywordflow">if</span> (list_it!=my_lru_list.end()) {
-<a name="l00191"></a>00191 __TBB_ASSERT(!it->second.my_ref_counter,<span class="stringliteral">"item to be evicted should not have a live references"</span>);
-<a name="l00192"></a>00192 <span class="comment">//item is going to be used. Therefore it is not a subject for eviction</span>
-<a name="l00193"></a>00193 <span class="comment">//so - remove it from LRU history.</span>
-<a name="l00194"></a>00194 my_lru_list.erase(list_it);
-<a name="l00195"></a>00195 it->second.my_lru_list_iterator= my_lru_list.end();
-<a name="l00196"></a>00196 }
-<a name="l00197"></a>00197 }
-<a name="l00198"></a>00198 ++(it->second.my_ref_counter);
-<a name="l00199"></a>00199 <span class="keywordflow">return</span> *it;
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="keywordtype">void</span> signal_end_of_usage_serial(<span class="keyword">typename</span> map_storage_type::reference map_record_ref){
-<a name="l00203"></a>00203 <span class="keyword">typename</span> map_storage_type::iterator it = my_map_storage.find(map_record_ref.first);
-<a name="l00204"></a>00204 __TBB_ASSERT(it!=my_map_storage.end(),<span class="stringliteral">"cache should not return past-end iterators to outer world"</span>);
-<a name="l00205"></a>00205 __TBB_ASSERT(&(*it) == &map_record_ref,<span class="stringliteral">"dangling reference has been returned to outside world? data race ?"</span>);
-<a name="l00206"></a>00206 __TBB_ASSERT( my_lru_list.end()== std::find(my_lru_list.begin(),my_lru_list.end(),it),
-<a name="l00207"></a>00207 <span class="stringliteral">"object in use should not be in list of unused objects "</span>);
-<a name="l00208"></a>00208 <span class="keywordflow">if</span> (! --(it->second.my_ref_counter)){
-<a name="l00209"></a>00209 <span class="comment">//it was the last reference so put it to the LRU history</span>
-<a name="l00210"></a>00210 <span class="keywordflow">if</span> (my_lru_list.size()>=my_number_of_lru_history_items){
-<a name="l00211"></a>00211 <span class="comment">//evict items in order to get a space</span>
-<a name="l00212"></a>00212 size_t number_of_elements_to_evict = 1 + my_lru_list.size() - my_number_of_lru_history_items;
-<a name="l00213"></a>00213 <span class="keywordflow">for</span> (size_t i=0; i<number_of_elements_to_evict; ++i){
-<a name="l00214"></a>00214 <span class="keyword">typename</span> map_storage_type::iterator it_to_evict = my_lru_list.back();
-<a name="l00215"></a>00215 __TBB_ASSERT(!it_to_evict->second.my_ref_counter,<span class="stringliteral">"item to be evicted should not have a live references"</span>);
-<a name="l00216"></a>00216 my_lru_list.pop_back();
-<a name="l00217"></a>00217 my_map_storage.erase(it_to_evict);
-<a name="l00218"></a>00218 }
-<a name="l00219"></a>00219 }
-<a name="l00220"></a>00220 my_lru_list.push_front(it);
-<a name="l00221"></a>00221 it->second.my_lru_list_iterator = my_lru_list.begin();
-<a name="l00222"></a>00222 }
-<a name="l00223"></a>00223 }
-<a name="l00224"></a>00224 };
-<a name="l00225"></a>00225 } <span class="comment">// namespace interface6</span>
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 <span class="keyword">using</span> interface6::concurrent_lru_cache;
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 } <span class="comment">// namespace tbb</span>
-<a name="l00230"></a>00230 <span class="preprocessor">#endif //__TBB_concurrent_lru_cache_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00473.html b/doc/html/a00473.html
deleted file mode 100644
index f639f2c..0000000
--- a/doc/html/a00473.html
+++ /dev/null
@@ -1,327 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_priority_queue.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>concurrent_priority_queue.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_priority_queue_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_priority_queue_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "internal/_aggregator_impl.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include <vector></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include <iterator></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <functional></span>
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="keyword">namespace </span>tbb {
-<a name="l00035"></a>00035 <span class="keyword">namespace </span>interface5 {
-<a name="l00036"></a>00036
-<a name="l00037"></a>00037 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00038"></a>00038
-<a name="l00040"></a>00040 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Compare=std::less<T>, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
-<a name="l00041"></a><a class="code" href="a00273.html">00041</a> <span class="keyword">class </span><a class="code" href="a00273.html">concurrent_priority_queue</a> {
-<a name="l00042"></a>00042 <span class="keyword">public</span>:
-<a name="l00044"></a><a class="code" href="a00273.html#7c611a6b5b8f94b0e7f2afc97e31efb1">00044</a> <span class="keyword">typedef</span> T <a class="code" href="a00273.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a>;
-<a name="l00045"></a>00045
-<a name="l00047"></a><a class="code" href="a00273.html#5804b3c708ef4e50d603f918ef2b9e58">00047</a> <span class="keyword">typedef</span> T& <a class="code" href="a00273.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a>;
-<a name="l00048"></a>00048
-<a name="l00050"></a><a class="code" href="a00273.html#a4ded8601a434098605be0dcc4febc60">00050</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00273.html#a4ded8601a434098605be0dcc4febc60">const_reference</a>;
-<a name="l00051"></a>00051
-<a name="l00053"></a><a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">00053</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a>;
-<a name="l00054"></a>00054
-<a name="l00056"></a><a class="code" href="a00273.html#77399bc76b3ecd60e33f7e35a5becd87">00056</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00273.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a>;
-<a name="l00057"></a>00057
-<a name="l00059"></a><a class="code" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">00059</a> <span class="keyword">typedef</span> A <a class="code" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>;
-<a name="l00060"></a>00060
-<a name="l00062"></a><a class="code" href="a00273.html#eefa40599afe00ea393897d8f5662e65">00062</a> <span class="keyword">explicit</span> <a class="code" href="a00273.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>()) : mark(0), my_size(0), data(a)
-<a name="l00063"></a>00063 {
-<a name="l00064"></a>00064 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00065"></a>00065 }
-<a name="l00066"></a>00066
-<a name="l00068"></a><a class="code" href="a00273.html#4555b4a55415a70024c4004b51e9f385">00068</a> <span class="keyword">explicit</span> <a class="code" href="a00273.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, <span class="keyword">const</span> <a class="code" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00 [...]
-<a name="l00069"></a>00069 mark(0), my_size(0), data(a)
-<a name="l00070"></a>00070 {
-<a name="l00071"></a>00071 data.reserve(init_capacity);
-<a name="l00072"></a>00072 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00073"></a>00073 }
-<a name="l00074"></a>00074
-<a name="l00076"></a>00076 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00077"></a><a class="code" href="a00273.html#9147cb4207017c260a0c3929c12cd40f">00077</a> <a class="code" href="a00273.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>()) :
-<a name="l00078"></a>00078 data(begin, end, a)
-<a name="l00079"></a>00079 {
-<a name="l00080"></a>00080 mark = 0;
-<a name="l00081"></a>00081 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00082"></a>00082 heapify();
-<a name="l00083"></a>00083 my_size = data.size();
-<a name="l00084"></a>00084 }
-<a name="l00085"></a>00085
-<a name="l00087"></a>00087
-<a name="l00088"></a><a class="code" href="a00273.html#509419e320f200456d89dc54a65140b3">00088</a> <span class="keyword">explicit</span> <a class="code" href="a00273.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00273.html">concurrent_priority_queue</a>& src) : mark(src.mark),
-<a name="l00089"></a>00089 my_size(src.my_size), data(src.data.begin(), src.data.end(), src.data.<a class="code" href="a00273.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>())
-<a name="l00090"></a>00090 {
-<a name="l00091"></a>00091 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00092"></a>00092 heapify();
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094
-<a name="l00096"></a>00096
-<a name="l00097"></a><a class="code" href="a00273.html#c8b20e7430c5302936030bef59a562be">00097</a> <a class="code" href="a00273.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00273.html">concurrent_priority_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a) : mark(src.mark),
-<a name="l00098"></a>00098 my_size(src.my_size), data(src.data.begin(), src.data.end(), a)
-<a name="l00099"></a>00099 {
-<a name="l00100"></a>00100 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00101"></a>00101 heapify();
-<a name="l00102"></a>00102 }
-<a name="l00103"></a>00103
-<a name="l00105"></a>00105
-<a name="l00106"></a><a class="code" href="a00273.html#2ab7f7808891027ac0f0f5b3a4be51e9">00106</a> <a class="code" href="a00273.html">concurrent_priority_queue</a>& <a class="code" href="a00273.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(<span class="keyword">const</span> <a class="code" href="a00273.html">concurrent_priority_queue</a>& src) {
-<a name="l00107"></a>00107 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &src) {
-<a name="l00108"></a>00108 std::vector<value_type, allocator_type>(src.<a class="code" href="a00273.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.begin(), src.<a class="code" href="a00273.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.end(), src.<a class="code" href="a00273.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.get_allocator()).<a class="code" href="a00273.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(data);
-<a name="l00109"></a>00109 mark = src.<a class="code" href="a00273.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>;
-<a name="l00110"></a>00110 my_size = src.<a class="code" href="a00273.html#9e480a4ce8950a0729a642cdac2bec41">my_size</a>;
-<a name="l00111"></a>00111 }
-<a name="l00112"></a>00112 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00113"></a>00113 }
-<a name="l00114"></a>00114
-<a name="l00116"></a>00116
-<a name="l00118"></a><a class="code" href="a00273.html#317c508fa92df218be5d014c26c09bb7">00118</a> <span class="keywordtype">bool</span> <a class="code" href="a00273.html#317c508fa92df218be5d014c26c09bb7">empty</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="a00273.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>()==0; }
-<a name="l00119"></a>00119
-<a name="l00121"></a>00121
-<a name="l00123"></a><a class="code" href="a00273.html#8b2ae25c61338c6fd59e94fe09822ba5">00123</a> <a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="code" href="a00273.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> __TBB_load_with_acquire(my_size); }
-<a name="l00124"></a>00124
-<a name="l00126"></a>00126
-<a name="l00127"></a><a class="code" href="a00273.html#d905af7b8f6defff562f5ae9c3275763">00127</a> <span class="keywordtype">void</span> <a class="code" href="a00273.html#d905af7b8f6defff562f5ae9c3275763">push</a>(<a class="code" href="a00273.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> elem) {
-<a name="l00128"></a>00128 cpq_operation op_data(elem, PUSH_OP);
-<a name="l00129"></a>00129 my_aggregator.execute(&op_data);
-<a name="l00130"></a>00130 <span class="keywordflow">if</span> (op_data.status == FAILED) <span class="comment">// exception thrown</span>
-<a name="l00131"></a>00131 throw_exception(eid_bad_alloc);
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133
-<a name="l00135"></a>00135
-<a name="l00138"></a><a class="code" href="a00273.html#e036461a29cc40902a2bb79abf9f5146">00138</a> <span class="keywordtype">bool</span> <a class="code" href="a00273.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(<a class="code" href="a00273.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> elem) {
-<a name="l00139"></a>00139 cpq_operation op_data(POP_OP);
-<a name="l00140"></a>00140 op_data.elem = &elem;
-<a name="l00141"></a>00141 my_aggregator.execute(&op_data);
-<a name="l00142"></a>00142 <span class="keywordflow">return</span> op_data.status==SUCCEEDED;
-<a name="l00143"></a>00143 }
-<a name="l00144"></a>00144
-<a name="l00146"></a>00146
-<a name="l00149"></a><a class="code" href="a00273.html#0bdcdf7cde9fd369edca845bec34ca94">00149</a> <span class="keywordtype">void</span> <a class="code" href="a00273.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>() {
-<a name="l00150"></a>00150 data.clear();
-<a name="l00151"></a>00151 mark = 0;
-<a name="l00152"></a>00152 my_size = 0;
-<a name="l00153"></a>00153 }
-<a name="l00154"></a>00154
-<a name="l00156"></a>00156
-<a name="l00157"></a><a class="code" href="a00273.html#0ecdc6a04aa259374425d424ca2a6082">00157</a> <span class="keywordtype">void</span> <a class="code" href="a00273.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(<a class="code" href="a00273.html">concurrent_priority_queue</a>& q) {
-<a name="l00158"></a>00158 data.swap(q.<a class="code" href="a00273.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>);
-<a name="l00159"></a>00159 std::swap(mark, q.<a class="code" href="a00273.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>);
-<a name="l00160"></a>00160 std::swap(my_size, q.<a class="code" href="a00273.html#9e480a4ce8950a0729a642cdac2bec41">my_size</a>);
-<a name="l00161"></a>00161 }
-<a name="l00162"></a>00162
-<a name="l00164"></a><a class="code" href="a00273.html#d545d444fb0d16148f9b61fd89f9a337">00164</a> <a class="code" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> <a class="code" href="a00273.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.get_allocator(); }
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 <span class="keyword">private</span>:
-<a name="l00167"></a>00167 <span class="keyword">enum</span> operation_type {INVALID_OP, PUSH_OP, POP_OP};
-<a name="l00168"></a>00168 <span class="keyword">enum</span> operation_status { WAIT=0, SUCCEEDED, FAILED };
-<a name="l00169"></a>00169
-<a name="l00170"></a>00170 <span class="keyword">class </span>cpq_operation : <span class="keyword">public</span> aggregated_operation<cpq_operation> {
-<a name="l00171"></a>00171 <span class="keyword">public</span>:
-<a name="l00172"></a>00172 operation_type type;
-<a name="l00173"></a>00173 <span class="keyword">union </span>{
-<a name="l00174"></a>00174 <a class="code" href="a00273.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> *elem;
-<a name="l00175"></a>00175 <a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> sz;
-<a name="l00176"></a>00176 };
-<a name="l00177"></a>00177 cpq_operation(<a class="code" href="a00273.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> e, operation_type t) :
-<a name="l00178"></a>00178 type(t), elem(const_cast<<a class="code" href="a00273.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a>*>(&e)) {}
-<a name="l00179"></a>00179 cpq_operation(operation_type t) : type(t) {}
-<a name="l00180"></a>00180 };
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 <span class="keyword">class </span>my_functor_t {
-<a name="l00183"></a>00183 concurrent_priority_queue<T, Compare, A> *cpq;
-<a name="l00184"></a>00184 <span class="keyword">public</span>:
-<a name="l00185"></a>00185 my_functor_t() {}
-<a name="l00186"></a>00186 my_functor_t(concurrent_priority_queue<T, Compare, A> *cpq_) : cpq(cpq_) {}
-<a name="l00187"></a>00187 <span class="keywordtype">void</span> operator()(cpq_operation* op_list) {
-<a name="l00188"></a>00188 cpq->handle_operations(op_list);
-<a name="l00189"></a>00189 }
-<a name="l00190"></a>00190 };
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 aggregator< my_functor_t, cpq_operation> my_aggregator;
-<a name="l00194"></a>00194 <span class="keywordtype">char</span> padding1[NFS_MaxLineSize - <span class="keyword">sizeof</span>(aggregator< my_functor_t, cpq_operation >)];
-<a name="l00196"></a>00196 <a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> mark;
-<a name="l00197"></a>00197 __TBB_atomic <a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> my_size;
-<a name="l00198"></a>00198 Compare compare;
-<a name="l00200"></a>00200 <span class="keywordtype">char</span> padding2[NFS_MaxLineSize - (2*<span class="keyword">sizeof</span>(<a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a>)) - <span class="keyword">sizeof</span>(Compare)];
-<a name="l00202"></a>00202
-<a name="l00219"></a>00219 std::vector<value_type, allocator_type> data;
-<a name="l00220"></a>00220
-<a name="l00221"></a>00221 <span class="keywordtype">void</span> handle_operations(cpq_operation *op_list) {
-<a name="l00222"></a>00222 cpq_operation *tmp, *pop_list=NULL;
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 __TBB_ASSERT(mark == data.size(), NULL);
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 <span class="comment">// First pass processes all constant (amortized; reallocation may happen) time pushes and pops.</span>
-<a name="l00227"></a>00227 <span class="keywordflow">while</span> (op_list) {
-<a name="l00228"></a>00228 <span class="comment">// ITT note: &(op_list->status) tag is used to cover accesses to op_list</span>
-<a name="l00229"></a>00229 <span class="comment">// node. This thread is going to handle the operation, and so will acquire it</span>
-<a name="l00230"></a>00230 <span class="comment">// and perform the associated operation w/o triggering a race condition; the</span>
-<a name="l00231"></a>00231 <span class="comment">// thread that created the operation is waiting on the status field, so when</span>
-<a name="l00232"></a>00232 <span class="comment">// this thread is done with the operation, it will perform a</span>
-<a name="l00233"></a>00233 <span class="comment">// store_with_release to give control back to the waiting thread in</span>
-<a name="l00234"></a>00234 <span class="comment">// aggregator::insert_operation.</span>
-<a name="l00235"></a>00235 call_itt_notify(acquired, &(op_list->status));
-<a name="l00236"></a>00236 __TBB_ASSERT(op_list->type != INVALID_OP, NULL);
-<a name="l00237"></a>00237 tmp = op_list;
-<a name="l00238"></a>00238 op_list = itt_hide_load_word(op_list->next);
-<a name="l00239"></a>00239 <span class="keywordflow">if</span> (tmp->type == PUSH_OP) {
-<a name="l00240"></a>00240 __TBB_TRY {
-<a name="l00241"></a>00241 data.push_back(*(tmp->elem));
-<a name="l00242"></a>00242 __TBB_store_with_release(my_size, my_size+1);
-<a name="l00243"></a>00243 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00244"></a>00244 } __TBB_CATCH(...) {
-<a name="l00245"></a>00245 itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
-<a name="l00246"></a>00246 }
-<a name="l00247"></a>00247 }
-<a name="l00248"></a>00248 <span class="keywordflow">else</span> { <span class="comment">// tmp->type == POP_OP</span>
-<a name="l00249"></a>00249 __TBB_ASSERT(tmp->type == POP_OP, NULL);
-<a name="l00250"></a>00250 <span class="keywordflow">if</span> (mark < data.size() &&
-<a name="l00251"></a>00251 compare(data[0], data[data.size()-1])) {
-<a name="l00252"></a>00252 <span class="comment">// there are newly pushed elems and the last one</span>
-<a name="l00253"></a>00253 <span class="comment">// is higher than top</span>
-<a name="l00254"></a>00254 *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
-<a name="l00255"></a>00255 __TBB_store_with_release(my_size, my_size-1);
-<a name="l00256"></a>00256 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00257"></a>00257 data.pop_back();
-<a name="l00258"></a>00258 __TBB_ASSERT(mark<=data.size(), NULL);
-<a name="l00259"></a>00259 }
-<a name="l00260"></a>00260 <span class="keywordflow">else</span> { <span class="comment">// no convenient item to pop; postpone</span>
-<a name="l00261"></a>00261 itt_hide_store_word(tmp->next, pop_list);
-<a name="l00262"></a>00262 pop_list = tmp;
-<a name="l00263"></a>00263 }
-<a name="l00264"></a>00264 }
-<a name="l00265"></a>00265 }
-<a name="l00266"></a>00266
-<a name="l00267"></a>00267 <span class="comment">// second pass processes pop operations</span>
-<a name="l00268"></a>00268 <span class="keywordflow">while</span> (pop_list) {
-<a name="l00269"></a>00269 tmp = pop_list;
-<a name="l00270"></a>00270 pop_list = itt_hide_load_word(pop_list->next);
-<a name="l00271"></a>00271 __TBB_ASSERT(tmp->type == POP_OP, NULL);
-<a name="l00272"></a>00272 <span class="keywordflow">if</span> (data.empty()) {
-<a name="l00273"></a>00273 itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
-<a name="l00274"></a>00274 }
-<a name="l00275"></a>00275 <span class="keywordflow">else</span> {
-<a name="l00276"></a>00276 __TBB_ASSERT(mark<=data.size(), NULL);
-<a name="l00277"></a>00277 <span class="keywordflow">if</span> (mark < data.size() &&
-<a name="l00278"></a>00278 compare(data[0], data[data.size()-1])) {
-<a name="l00279"></a>00279 <span class="comment">// there are newly pushed elems and the last one is</span>
-<a name="l00280"></a>00280 <span class="comment">// higher than top</span>
-<a name="l00281"></a>00281 *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
-<a name="l00282"></a>00282 __TBB_store_with_release(my_size, my_size-1);
-<a name="l00283"></a>00283 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00284"></a>00284 data.pop_back();
-<a name="l00285"></a>00285 }
-<a name="l00286"></a>00286 <span class="keywordflow">else</span> { <span class="comment">// extract top and push last element down heap</span>
-<a name="l00287"></a>00287 *(tmp->elem) = data[0]; <span class="comment">// copy the data</span>
-<a name="l00288"></a>00288 __TBB_store_with_release(my_size, my_size-1);
-<a name="l00289"></a>00289 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00290"></a>00290 reheap();
-<a name="l00291"></a>00291 }
-<a name="l00292"></a>00292 }
-<a name="l00293"></a>00293 }
-<a name="l00294"></a>00294
-<a name="l00295"></a>00295 <span class="comment">// heapify any leftover pushed elements before doing the next</span>
-<a name="l00296"></a>00296 <span class="comment">// batch of operations</span>
-<a name="l00297"></a>00297 <span class="keywordflow">if</span> (mark<data.size()) heapify();
-<a name="l00298"></a>00298 __TBB_ASSERT(mark == data.size(), NULL);
-<a name="l00299"></a>00299 }
-<a name="l00300"></a>00300
-<a name="l00302"></a>00302 <span class="keywordtype">void</span> heapify() {
-<a name="l00303"></a>00303 <span class="keywordflow">if</span> (!mark && data.size()>0) mark = 1;
-<a name="l00304"></a>00304 <span class="keywordflow">for</span> (; mark<data.size(); ++mark) {
-<a name="l00305"></a>00305 <span class="comment">// for each unheapified element under size</span>
-<a name="l00306"></a>00306 <a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos = mark;
-<a name="l00307"></a>00307 <a class="code" href="a00273.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> to_place = data[mark];
-<a name="l00308"></a>00308 <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
-<a name="l00309"></a>00309 <a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> parent = (cur_pos-1)>>1;
-<a name="l00310"></a>00310 <span class="keywordflow">if</span> (!compare(data[parent], to_place)) <span class="keywordflow">break</span>;
-<a name="l00311"></a>00311 data[cur_pos] = data[parent];
-<a name="l00312"></a>00312 cur_pos = parent;
-<a name="l00313"></a>00313 } <span class="keywordflow">while</span>( cur_pos );
-<a name="l00314"></a>00314 data[cur_pos] = to_place;
-<a name="l00315"></a>00315 }
-<a name="l00316"></a>00316 }
-<a name="l00317"></a>00317
-<a name="l00319"></a>00319
-<a name="l00320"></a>00320 <span class="keywordtype">void</span> reheap() {
-<a name="l00321"></a>00321 <a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos=0, child=1;
-<a name="l00322"></a>00322
-<a name="l00323"></a>00323 <span class="keywordflow">while</span> (child < mark) {
-<a name="l00324"></a>00324 <a class="code" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> target = child;
-<a name="l00325"></a>00325 <span class="keywordflow">if</span> (child+1 < mark && compare(data[child], data[child+1]))
-<a name="l00326"></a>00326 ++target;
-<a name="l00327"></a>00327 <span class="comment">// target now has the higher priority child</span>
-<a name="l00328"></a>00328 <span class="keywordflow">if</span> (compare(data[target], data[data.size()-1])) <span class="keywordflow">break</span>;
-<a name="l00329"></a>00329 data[cur_pos] = data[target];
-<a name="l00330"></a>00330 cur_pos = target;
-<a name="l00331"></a>00331 child = (cur_pos<<1)+1;
-<a name="l00332"></a>00332 }
-<a name="l00333"></a>00333 data[cur_pos] = data[data.size()-1];
-<a name="l00334"></a>00334 data.pop_back();
-<a name="l00335"></a>00335 <span class="keywordflow">if</span> (mark > data.size()) mark = data.size();
-<a name="l00336"></a>00336 }
-<a name="l00337"></a>00337 };
-<a name="l00338"></a>00338
-<a name="l00339"></a>00339 } <span class="comment">// namespace interface5</span>
-<a name="l00340"></a>00340
-<a name="l00341"></a>00341 <span class="keyword">using</span> interface5::concurrent_priority_queue;
-<a name="l00342"></a>00342
-<a name="l00343"></a>00343 } <span class="comment">// namespace tbb</span>
-<a name="l00344"></a>00344
-<a name="l00345"></a>00345 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_priority_queue_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00476.html b/doc/html/a00476.html
deleted file mode 100644
index 1b9d6f5..0000000
--- a/doc/html/a00476.html
+++ /dev/null
@@ -1,371 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_queue.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>concurrent_queue.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_queue_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_queue_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "internal/_concurrent_queue_impl.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00029"></a>00029
-<a name="l00031"></a>00031
-<a name="l00034"></a>00034 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A = cache_aligned_allocator<T> >
-<a name="l00035"></a><a class="code" href="a00274.html">00035</a> <span class="keyword">class </span><a class="code" href="a00274.html">concurrent_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3<T> {
-<a name="l00036"></a>00036 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
-<a name="l00037"></a>00037
-<a name="l00039"></a>00039 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
-<a name="l00040"></a>00040 page_allocator_type my_allocator;
-<a name="l00041"></a>00041
-<a name="l00043"></a>00043 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) {
-<a name="l00044"></a>00044 <span class="keywordtype">void</span> *b = reinterpret_cast<void*>(my_allocator.allocate( n ));
-<a name="l00045"></a>00045 <span class="keywordflow">if</span>( !b )
-<a name="l00046"></a>00046 internal::throw_exception(internal::eid_bad_alloc);
-<a name="l00047"></a>00047 <span class="keywordflow">return</span> b;
-<a name="l00048"></a>00048 }
-<a name="l00049"></a>00049
-<a name="l00051"></a>00051 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *b, size_t n ) {
-<a name="l00052"></a>00052 my_allocator.deallocate( reinterpret_cast<char*>(b), n );
-<a name="l00053"></a>00053 }
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <span class="keyword">public</span>:
-<a name="l00057"></a><a class="code" href="a00274.html#682c3978d5cb0620000994f11c44a476">00057</a> <span class="keyword">typedef</span> T <a class="code" href="a00274.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
-<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00274.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a> <span class="keyword">typedef</span> T& <a class="code" href="a00274.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
-<a name="l00061"></a>00061
-<a name="l00063"></a><a class="code" href="a00274.html#4d48e7ff93f81636bca2c74f7da34750">00063</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00274.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
-<a name="l00064"></a>00064
-<a name="l00066"></a><a class="code" href="a00274.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00274.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
-<a name="l00067"></a>00067
-<a name="l00069"></a><a class="code" href="a00274.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00274.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
-<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00274.html#5a3956341728eaa558d8827063718cac">00072</a> <span class="keyword">typedef</span> A <a class="code" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
-<a name="l00073"></a>00073
-<a name="l00075"></a><a class="code" href="a00274.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a> <span class="keyword">explicit</span> <a class="code" href="a00274.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
-<a name="l00076"></a>00076 my_allocator( a )
-<a name="l00077"></a>00077 {
-<a name="l00078"></a>00078 }
-<a name="l00079"></a>00079
-<a name="l00081"></a>00081 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00082"></a><a class="code" href="a00274.html#25209656c84f2f9b030e2f9162713341">00082</a> <a class="code" href="a00274.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
-<a name="l00083"></a>00083 my_allocator( a )
-<a name="l00084"></a>00084 {
-<a name="l00085"></a>00085 <span class="keywordflow">for</span>( ; begin != end; ++begin )
-<a name="l00086"></a>00086 this->internal_push(&*begin);
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088
-<a name="l00090"></a><a class="code" href="a00274.html#8a6b98ea11a867db8ac868f0113ca429">00090</a> <a class="code" href="a00274.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00274.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00274.html#5a3956341728eaa558d8827063718cac" [...]
-<a name="l00091"></a>00091 internal::concurrent_queue_base_v3<T>(), my_allocator( a )
-<a name="l00092"></a>00092 {
-<a name="l00093"></a>00093 this->assign( src );
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095
-<a name="l00097"></a>00097 <a class="code" href="a00274.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
-<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00274.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00101"></a>00101 this->internal_push( &source );
-<a name="l00102"></a>00102 }
-<a name="l00103"></a>00103
-<a name="l00105"></a>00105
-<a name="l00107"></a><a class="code" href="a00274.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a> <span class="keywordtype">bool</span> <a class="code" href="a00274.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T& result ) {
-<a name="l00108"></a>00108 <span class="keywordflow">return</span> this->internal_try_pop( &result );
-<a name="l00109"></a>00109 }
-<a name="l00110"></a>00110
-<a name="l00112"></a><a class="code" href="a00274.html#eaa35a5274606779802e9a669a706260">00112</a> <a class="code" href="a00274.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00274.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_size();}
-<a name="l00113"></a>00113
-<a name="l00115"></a><a class="code" href="a00274.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a> <span class="keywordtype">bool</span> <a class="code" href="a00274.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_empty();}
-<a name="l00116"></a>00116
-<a name="l00118"></a>00118 <span class="keywordtype">void</span> <a class="code" href="a00274.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
-<a name="l00119"></a>00119
-<a name="l00121"></a><a class="code" href="a00274.html#f034f70caef445fe8abc9113ec926a8d">00121</a> <a class="code" href="a00274.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00274.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,T> iterator;
-<a name="l00124"></a>00124 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,const T> const_iterator;
-<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00127"></a>00127 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
-<a name="l00128"></a>00128 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00129"></a>00129 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
-<a name="l00130"></a>00130 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
-<a name="l00131"></a>00131 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
-<a name="l00132"></a>00132 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
-<a name="l00133"></a>00133 } ;
-<a name="l00134"></a>00134
-<a name="l00135"></a>00135 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00136"></a><a class="code" href="a00274.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00274.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
-<a name="l00137"></a>00137 <a class="code" href="a00274.html#c32e8e84c0524155133b4aae32d2a827">clear</a>();
-<a name="l00138"></a>00138 this->internal_finish_clear();
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00142"></a><a class="code" href="a00274.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html">concurrent_queue<T,A>::clear</a>() {
-<a name="l00143"></a>00143 <span class="keywordflow">while</span>( !<a class="code" href="a00274.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
-<a name="l00144"></a>00144 T value;
-<a name="l00145"></a>00145 this->internal_try_pop(&value);
-<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147 }
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00150"></a>00150
-<a name="l00152"></a>00152
-<a name="l00157"></a>00157 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00158"></a><a class="code" href="a00268.html">00158</a> <span class="keyword">class </span><a class="code" href="a00268.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
-<a name="l00159"></a>00159 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
-<a name="l00160"></a>00160
-<a name="l00162"></a>00162 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
-<a name="l00163"></a>00163 page_allocator_type my_allocator;
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_base_v3::padded_page<T> padded_page;
-<a name="l00166"></a>00166
-<a name="l00168"></a>00168 <span class="keyword">class </span>destroyer: internal::no_copy {
-<a name="l00169"></a>00169 T& my_value;
-<a name="l00170"></a>00170 <span class="keyword">public</span>:
-<a name="l00171"></a>00171 destroyer( T& value ) : my_value(value) {}
-<a name="l00172"></a>00172 ~destroyer() {my_value.~T();}
-<a name="l00173"></a>00173 };
-<a name="l00174"></a>00174
-<a name="l00175"></a>00175 T& get_ref( page& p, size_t index ) {
-<a name="l00176"></a>00176 __TBB_ASSERT( index<items_per_page, NULL );
-<a name="l00177"></a>00177 <span class="keywordflow">return</span> (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
-<a name="l00178"></a>00178 }
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_item( page& dst, size_t index, <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
-<a name="l00181"></a>00181 <span class="keyword">new</span>( &get_ref(dst,index) ) T(*static_cast<const T*>(src));
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_page_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) {
-<a name="l00185"></a>00185 <span class="keyword">new</span>( &get_ref(dst,dindex) ) T( get_ref( const_cast<page&>(src), sindex ) );
-<a name="l00186"></a>00186 }
-<a name="l00187"></a>00187
-<a name="l00188"></a>00188 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) {
-<a name="l00189"></a>00189 T& from = get_ref(src,index);
-<a name="l00190"></a>00190 destroyer d(from);
-<a name="l00191"></a>00191 *static_cast<T*>(dst) = from;
-<a name="l00192"></a>00192 }
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> page *allocate_page() {
-<a name="l00195"></a>00195 size_t n = <span class="keyword">sizeof</span>(padded_page) + (items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00196"></a>00196 page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
-<a name="l00197"></a>00197 <span class="keywordflow">if</span>( !p )
-<a name="l00198"></a>00198 internal::throw_exception(internal::eid_bad_alloc);
-<a name="l00199"></a>00199 <span class="keywordflow">return</span> p;
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) {
-<a name="l00203"></a>00203 size_t n = <span class="keyword">sizeof</span>(padded_page) + (items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00204"></a>00204 my_allocator.deallocate( reinterpret_cast<char*>(p), n );
-<a name="l00205"></a>00205 }
-<a name="l00206"></a>00206
-<a name="l00207"></a>00207 <span class="keyword">public</span>:
-<a name="l00209"></a><a class="code" href="a00268.html#98245517a931e5893f6601e66c51fc75">00209</a> <span class="keyword">typedef</span> T <a class="code" href="a00268.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
-<a name="l00210"></a>00210
-<a name="l00212"></a><a class="code" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a> <span class="keyword">typedef</span> A <a class="code" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
-<a name="l00213"></a>00213
-<a name="l00215"></a><a class="code" href="a00268.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a> <span class="keyword">typedef</span> T& <a class="code" href="a00268.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
-<a name="l00216"></a>00216
-<a name="l00218"></a><a class="code" href="a00268.html#796713d0b9ba93a4721cbe13e4474068">00218</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00268.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
-<a name="l00219"></a>00219
-<a name="l00221"></a>00221
-<a name="l00223"></a><a class="code" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
-<a name="l00224"></a>00224
-<a name="l00226"></a><a class="code" href="a00268.html#4b45c91297e69515d83d5eef85ae1f49">00226</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00268.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
-<a name="l00227"></a>00227
-<a name="l00229"></a><a class="code" href="a00268.html#e3525226732963ff0f13e89d8e6dab5b">00229</a> <span class="keyword">explicit</span> <a class="code" href="a00268.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
-<a name="l00230"></a>00230 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00231"></a>00231 {
-<a name="l00232"></a>00232 }
-<a name="l00233"></a>00233
-<a name="l00235"></a><a class="code" href="a00268.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a> <a class="code" href="a00268.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00268.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00268.html#2e2726fccf6d975dc [...]
-<a name="l00236"></a>00236 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00237"></a>00237 {
-<a name="l00238"></a>00238 assign( src );
-<a name="l00239"></a>00239 }
-<a name="l00240"></a>00240
-<a name="l00242"></a>00242 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00243"></a><a class="code" href="a00268.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a> <a class="code" href="a00268.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
-<a name="l00244"></a>00244 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00245"></a>00245 {
-<a name="l00246"></a>00246 <span class="keywordflow">for</span>( ; begin != end; ++begin )
-<a name="l00247"></a>00247 internal_push_if_not_full(&*begin);
-<a name="l00248"></a>00248 }
-<a name="l00249"></a>00249
-<a name="l00251"></a>00251 <a class="code" href="a00268.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
-<a name="l00252"></a>00252
-<a name="l00254"></a><a class="code" href="a00268.html#ceb08c743b11ba88c878e73fff8af20b">00254</a> <span class="keywordtype">void</span> <a class="code" href="a00268.html#ceb08c743b11ba88c878e73fff8af20b">push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00255"></a>00255 internal_push( &source );
-<a name="l00256"></a>00256 }
-<a name="l00257"></a>00257
-<a name="l00259"></a>00259
-<a name="l00260"></a><a class="code" href="a00268.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00268.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>( T& destination ) {
-<a name="l00261"></a>00261 internal_pop( &destination );
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263
-<a name="l00264"></a>00264 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00266"></a><a class="code" href="a00268.html#86c77a6c1317239405968f5afc7b10d3">00266</a> <span class="preprocessor"> void abort() {</span>
-<a name="l00267"></a>00267 <span class="preprocessor"></span> internal_abort();
-<a name="l00268"></a>00268 }
-<a name="l00269"></a>00269 <span class="preprocessor">#endif</span>
-<a name="l00270"></a>00270 <span class="preprocessor"></span>
-<a name="l00272"></a>00272
-<a name="l00274"></a><a class="code" href="a00268.html#2bd6232531279fb3ccbd296bea23066b">00274</a> <span class="keywordtype">bool</span> try_push( <span class="keyword">const</span> T& source ) {
-<a name="l00275"></a>00275 <span class="keywordflow">return</span> internal_push_if_not_full( &source );
-<a name="l00276"></a>00276 }
-<a name="l00277"></a>00277
-<a name="l00279"></a>00279
-<a name="l00281"></a><a class="code" href="a00268.html#0ca487019bbb00a196442aff78a1e4f7">00281</a> <span class="keywordtype">bool</span> try_pop( T& destination ) {
-<a name="l00282"></a>00282 <span class="keywordflow">return</span> internal_pop_if_present( &destination );
-<a name="l00283"></a>00283 }
-<a name="l00284"></a>00284
-<a name="l00286"></a>00286
-<a name="l00289"></a><a class="code" href="a00268.html#7dc14d1a579a4cccda9f857585e1768d">00289</a> size_type size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
-<a name="l00290"></a>00290
-<a name="l00292"></a><a class="code" href="a00268.html#f64924f2ee9225c368a270fc3c394db9">00292</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
-<a name="l00293"></a>00293
-<a name="l00295"></a><a class="code" href="a00268.html#b2888b3e4e837d7e03f2c731963a402b">00295</a> size_type capacity()<span class="keyword"> const </span>{
-<a name="l00296"></a>00296 <span class="keywordflow">return</span> my_capacity;
-<a name="l00297"></a>00297 }
-<a name="l00298"></a>00298
-<a name="l00300"></a>00300
-<a name="l00302"></a><a class="code" href="a00268.html#f3c6c934f85fd02aedbc83a16943193b">00302</a> <span class="keywordtype">void</span> set_capacity( size_type new_capacity ) {
-<a name="l00303"></a>00303 internal_set_capacity( new_capacity, <span class="keyword">sizeof</span>(T) );
-<a name="l00304"></a>00304 }
-<a name="l00305"></a>00305
-<a name="l00307"></a><a class="code" href="a00268.html#415eb87e53b1c6a266de06ecbc490d16">00307</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00308"></a>00308
-<a name="l00310"></a>00310 <span class="keywordtype">void</span> clear() ;
-<a name="l00311"></a>00311
-<a name="l00312"></a>00312 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;
-<a name="l00313"></a>00313 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;
-<a name="l00314"></a>00314
-<a name="l00315"></a>00315 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00316"></a>00316 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
-<a name="l00317"></a>00317 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00318"></a>00318 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
-<a name="l00319"></a>00319 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
-<a name="l00320"></a>00320 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
-<a name="l00321"></a>00321 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
-<a name="l00322"></a>00322
-<a name="l00323"></a>00323 };
-<a name="l00324"></a>00324
-<a name="l00325"></a>00325 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00326"></a><a class="code" href="a00268.html#acaf5b510dc0dfc7780b8c956cf773cf">00326</a> <a class="code" href="a00268.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
-<a name="l00327"></a>00327 <a class="code" href="a00268.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
-<a name="l00328"></a>00328 internal_finish_clear();
-<a name="l00329"></a>00329 }
-<a name="l00330"></a>00330
-<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00332"></a><a class="code" href="a00268.html#90b31e2954c6e4596c7900435a5f4bc1">00332</a> <span class="keywordtype">void</span> <a class="code" href="a00268.html">concurrent_bounded_queue<T,A>::clear</a>() {
-<a name="l00333"></a>00333 <span class="keywordflow">while</span>( !<a class="code" href="a00268.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
-<a name="l00334"></a>00334 T value;
-<a name="l00335"></a>00335 internal_pop_if_present(&value);
-<a name="l00336"></a>00336 }
-<a name="l00337"></a>00337 }
-<a name="l00338"></a>00338
-<a name="l00339"></a>00339 <span class="keyword">namespace </span>deprecated {
-<a name="l00340"></a>00340
-<a name="l00342"></a>00342
-<a name="l00347"></a>00347 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00348"></a><a class="code" href="a00275.html">00348</a> <span class="keyword">class </span><a class="code" href="a00275.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00268.html">concurrent_bounded_queue</a><T,A> {
-<a name="l00349"></a>00349 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00350"></a>00350 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
-<a name="l00351"></a>00351 <span class="preprocessor">#endif </span>
-<a name="l00352"></a>00352 <span class="preprocessor"></span>
-<a name="l00353"></a>00353 <span class="keyword">public</span>:
-<a name="l00355"></a><a class="code" href="a00275.html#aaf19bd7337b72f3131ece60f7315ef7">00355</a> <span class="keyword">explicit</span> <a class="code" href="a00275.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) :
-<a name="l00356"></a>00356 <a class="code" href="a00268.html">concurrent_bounded_queue</a><T,A>( a )
-<a name="l00357"></a>00357 {
-<a name="l00358"></a>00358 }
-<a name="l00359"></a>00359
-<a name="l00361"></a><a class="code" href="a00275.html#fc092b9082f233482f3513fc3bb670f7">00361</a> <a class="code" href="a00275.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00275.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) :
-<a name="l00362"></a>00362 <a class="code" href="a00268.html">concurrent_bounded_queue</a><T,A>( src, a )
-<a name="l00363"></a>00363 {
-<a name="l00364"></a>00364 }
-<a name="l00365"></a>00365
-<a name="l00367"></a>00367 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00368"></a><a class="code" href="a00275.html#9102b897776bd2d9e908e6604ff16b5f">00368</a> <a class="code" href="a00275.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( InputIterator b <span class="comment">/*begin*/</span>, InputIterator e <span class="comment">/*end*/</span>, <span class="keyword">const</span> A& a = A()) :
-<a name="l00369"></a>00369 <a class="code" href="a00268.html">concurrent_bounded_queue</a><T,A>( b, e, a )
-<a name="l00370"></a>00370 {
-<a name="l00371"></a>00371 }
-<a name="l00372"></a>00372
-<a name="l00374"></a>00374
-<a name="l00376"></a><a class="code" href="a00275.html#7c45561bafe71107d09b2bc1b8f4e681">00376</a> <span class="keywordtype">bool</span> <a class="code" href="a00275.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00377"></a>00377 <span class="keywordflow">return</span> this-><a class="code" href="a00268.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
-<a name="l00378"></a>00378 }
-<a name="l00379"></a>00379
-<a name="l00381"></a>00381
-<a name="l00385"></a><a class="code" href="a00275.html#48da3536245318af6cb5fd58bac78039">00385</a> <span class="keywordtype">bool</span> <a class="code" href="a00275.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
-<a name="l00386"></a>00386 <span class="keywordflow">return</span> this-><a class="code" href="a00268.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
-<a name="l00387"></a>00387 }
-<a name="l00388"></a>00388
-<a name="l00389"></a>00389 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00268.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
-<a name="l00390"></a>00390 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00268.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
-<a name="l00391"></a>00391 <span class="comment">//</span>
-<a name="l00392"></a>00392 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00393"></a>00393 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
-<a name="l00394"></a>00394 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00395"></a>00395 iterator begin() {<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00396"></a>00396 iterator end() {<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00397"></a>00397 const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00398"></a>00398 const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00399"></a>00399 };
-<a name="l00400"></a>00400
-<a name="l00401"></a>00401 }
-<a name="l00402"></a>00402
-<a name="l00403"></a>00403
-<a name="l00404"></a>00404 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00405"></a>00405 <span class="preprocessor"></span><span class="keyword">using</span> deprecated::concurrent_queue;
-<a name="l00406"></a>00406 <span class="preprocessor">#else</span>
-<a name="l00407"></a>00407 <span class="preprocessor"></span><span class="keyword">using</span> strict_ppl::concurrent_queue;
-<a name="l00408"></a>00408 <span class="preprocessor">#endif</span>
-<a name="l00409"></a>00409 <span class="preprocessor"></span>
-<a name="l00410"></a>00410 } <span class="comment">// namespace tbb</span>
-<a name="l00411"></a>00411
-<a name="l00412"></a>00412 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00480.html b/doc/html/a00480.html
deleted file mode 100644
index 6fb956c..0000000
--- a/doc/html/a00480.html
+++ /dev/null
@@ -1,250 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_unordered_map.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>concurrent_unordered_map.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="comment">/* Container implementations in this header are based on PPL implementations</span>
-<a name="l00022"></a>00022 <span class="comment"> provided by Microsoft. */</span>
-<a name="l00023"></a>00023
-<a name="l00024"></a>00024 <span class="preprocessor">#ifndef __TBB_concurrent_unordered_map_H</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_unordered_map_H</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "internal/_concurrent_unordered_impl.h"</span>
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb
-<a name="l00030"></a>00030 {
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="keyword">namespace </span>interface5 {
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="comment">// Template class for hash map traits</span>
-<a name="l00035"></a>00035 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Hash_compare, <span class="keyword">typename</span> Allocator, <span class="keywordtype">bool</span> Allow_multimapping>
-<a name="l00036"></a>00036 <span class="keyword">class </span>concurrent_unordered_map_traits
-<a name="l00037"></a>00037 {
-<a name="l00038"></a>00038 <span class="keyword">protected</span>:
-<a name="l00039"></a>00039 <span class="keyword">typedef</span> std::pair<const Key, T> value_type;
-<a name="l00040"></a>00040 <span class="keyword">typedef</span> Key key_type;
-<a name="l00041"></a>00041 <span class="keyword">typedef</span> Hash_compare hash_compare;
-<a name="l00042"></a>00042 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<value_type>::other allocator_type;
-<a name="l00043"></a>00043 <span class="keyword">enum</span> { allow_multimapping = Allow_multimapping };
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 concurrent_unordered_map_traits() : my_hash_compare() {}
-<a name="l00046"></a>00046 concurrent_unordered_map_traits(<span class="keyword">const</span> hash_compare& hc) : my_hash_compare(hc) {}
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keyword">class </span>value_compare : <span class="keyword">public</span> std::binary_function<value_type, value_type, bool>
-<a name="l00049"></a>00049 {
-<a name="l00050"></a>00050 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;
-<a name="l00051"></a>00051
-<a name="l00052"></a>00052 <span class="keyword">public</span>:
-<a name="l00053"></a>00053 <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> value_type& left, <span class="keyword">const</span> value_type& right)<span class="keyword"> const</span>
-<a name="l00054"></a>00054 <span class="keyword"> </span>{
-<a name="l00055"></a>00055 <span class="keywordflow">return</span> (my_hash_compare(left.first, right.first));
-<a name="l00056"></a>00056 }
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 value_compare(<span class="keyword">const</span> hash_compare& comparator) : my_hash_compare(comparator) {}
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="keyword">protected</span>:
-<a name="l00061"></a>00061 hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
-<a name="l00062"></a>00062 };
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">template</span><<span class="keyword">class</span> Type1, <span class="keyword">class</span> Type2>
-<a name="l00065"></a>00065 <span class="keyword">static</span> <span class="keyword">const</span> Key& get_key(<span class="keyword">const</span> std::pair<Type1, Type2>& value) {
-<a name="l00066"></a>00066 <span class="keywordflow">return</span> (value.first);
-<a name="l00067"></a>00067 }
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
-<a name="l00070"></a>00070 };
-<a name="l00071"></a>00071
-<a name="l00072"></a>00072 <span class="keyword">template</span> <<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Hasher = tbb::tbb_hash<Key>, <span class="keyword">typename</span> Key_equality = std::equal_to<Key>, <span class="keyword">typename</span> Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
-<a name="l00073"></a>00073 <span class="keyword">class </span>concurrent_unordered_map : <span class="keyword">public</span> internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
-<a name="l00074"></a>00074 {
-<a name="l00075"></a>00075 <span class="comment">// Base type definitions</span>
-<a name="l00076"></a>00076 <span class="keyword">typedef</span> internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
-<a name="l00077"></a>00077 <span class="keyword">typedef</span> internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> > base_type;
-<a name="l00078"></a>00078 <span class="keyword">typedef</span> concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, <span class="keyword">false</span>> traits_type;
-<a name="l00079"></a>00079 <span class="keyword">using</span> traits_type::my_hash_compare;
-<a name="l00080"></a>00080 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00082"></a>00082 <span class="preprocessor">#endif</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span> <span class="keyword">using</span> traits_type::allow_multimapping;
-<a name="l00084"></a>00084 <span class="keyword">public</span>:
-<a name="l00085"></a>00085 <span class="keyword">using</span> base_type::end;
-<a name="l00086"></a>00086 <span class="keyword">using</span> base_type::find;
-<a name="l00087"></a>00087 <span class="keyword">using</span> base_type::insert;
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="comment">// Type definitions</span>
-<a name="l00090"></a>00090 <span class="keyword">typedef</span> Key key_type;
-<a name="l00091"></a>00091 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::value_type value_type;
-<a name="l00092"></a>00092 <span class="keyword">typedef</span> T mapped_type;
-<a name="l00093"></a>00093 <span class="keyword">typedef</span> Hasher hasher;
-<a name="l00094"></a>00094 <span class="keyword">typedef</span> Key_equality key_equal;
-<a name="l00095"></a>00095 <span class="keyword">typedef</span> hash_compare key_compare;
-<a name="l00096"></a>00096
-<a name="l00097"></a>00097 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::allocator_type allocator_type;
-<a name="l00098"></a>00098 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::pointer pointer;
-<a name="l00099"></a>00099 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_pointer const_pointer;
-<a name="l00100"></a>00100 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::reference reference;
-<a name="l00101"></a>00101 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_reference const_reference;
-<a name="l00102"></a>00102
-<a name="l00103"></a>00103 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::size_type size_type;
-<a name="l00104"></a>00104 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::difference_type difference_type;
-<a name="l00105"></a>00105
-<a name="l00106"></a>00106 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator iterator;
-<a name="l00107"></a>00107 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_iterator;
-<a name="l00108"></a>00108 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator local_iterator;
-<a name="l00109"></a>00109 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_local_iterator;
-<a name="l00110"></a>00110
-<a name="l00111"></a>00111 <span class="comment">// Construction/destruction/copying</span>
-<a name="l00112"></a>00112 <span class="keyword">explicit</span> concurrent_unordered_map(size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
-<a name="l00113"></a>00113 <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00114"></a>00114 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00115"></a>00115 {
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117
-<a name="l00118"></a>00118 concurrent_unordered_map(<span class="keyword">const</span> Allocator& a) : base_type(8, key_compare(), a)
-<a name="l00119"></a>00119 {
-<a name="l00120"></a>00120 }
-<a name="l00121"></a>00121
-<a name="l00122"></a>00122 <span class="keyword">template</span> <<span class="keyword">typename</span> Iterator>
-<a name="l00123"></a>00123 concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
-<a name="l00124"></a>00124 <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00125"></a>00125 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00126"></a>00126 {
-<a name="l00127"></a>00127 <span class="keywordflow">for</span> (; first != last; ++first)
-<a name="l00128"></a>00128 base_type::insert(*first);
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130
-<a name="l00131"></a>00131 concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table) : base_type(table)
-<a name="l00132"></a>00132 {
-<a name="l00133"></a>00133 }
-<a name="l00134"></a>00134
-<a name="l00135"></a>00135 concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table, <span class="keyword">const</span> Allocator& a)
-<a name="l00136"></a>00136 : base_type(table, a)
-<a name="l00137"></a>00137 {
-<a name="l00138"></a>00138 }
-<a name="l00139"></a>00139
-<a name="l00140"></a>00140 concurrent_unordered_map& operator=(<span class="keyword">const</span> concurrent_unordered_map& table)
-<a name="l00141"></a>00141 {
-<a name="l00142"></a>00142 base_type::operator=(table);
-<a name="l00143"></a>00143 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00144"></a>00144 }
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 iterator unsafe_erase(const_iterator where)
-<a name="l00147"></a>00147 {
-<a name="l00148"></a>00148 <span class="keywordflow">return</span> base_type::unsafe_erase(where);
-<a name="l00149"></a>00149 }
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 size_type unsafe_erase(<span class="keyword">const</span> key_type& key)
-<a name="l00152"></a>00152 {
-<a name="l00153"></a>00153 <span class="keywordflow">return</span> base_type::unsafe_erase(key);
-<a name="l00154"></a>00154 }
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156 iterator unsafe_erase(const_iterator first, const_iterator last)
-<a name="l00157"></a>00157 {
-<a name="l00158"></a>00158 <span class="keywordflow">return</span> base_type::unsafe_erase(first, last);
-<a name="l00159"></a>00159 }
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 <span class="keywordtype">void</span> swap(concurrent_unordered_map& table)
-<a name="l00162"></a>00162 {
-<a name="l00163"></a>00163 base_type::swap(table);
-<a name="l00164"></a>00164 }
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 <span class="comment">// Observers</span>
-<a name="l00167"></a>00167 hasher hash_function()<span class="keyword"> const</span>
-<a name="l00168"></a>00168 <span class="keyword"> </span>{
-<a name="l00169"></a>00169 <span class="keywordflow">return</span> my_hash_compare.my_hash_object;
-<a name="l00170"></a>00170 }
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 key_equal key_eq()<span class="keyword"> const</span>
-<a name="l00173"></a>00173 <span class="keyword"> </span>{
-<a name="l00174"></a>00174 <span class="keywordflow">return</span> my_hash_compare.my_key_compare_object;
-<a name="l00175"></a>00175 }
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 mapped_type& operator[](<span class="keyword">const</span> key_type& key)
-<a name="l00178"></a>00178 {
-<a name="l00179"></a>00179 iterator where = find(key);
-<a name="l00180"></a>00180
-<a name="l00181"></a>00181 <span class="keywordflow">if</span> (where == end())
-<a name="l00182"></a>00182 {
-<a name="l00183"></a>00183 where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;
-<a name="l00184"></a>00184 }
-<a name="l00185"></a>00185
-<a name="l00186"></a>00186 <span class="keywordflow">return</span> ((*where).second);
-<a name="l00187"></a>00187 }
-<a name="l00188"></a>00188
-<a name="l00189"></a>00189 mapped_type& at(<span class="keyword">const</span> key_type& key)
-<a name="l00190"></a>00190 {
-<a name="l00191"></a>00191 iterator where = find(key);
-<a name="l00192"></a>00192
-<a name="l00193"></a>00193 <span class="keywordflow">if</span> (where == end())
-<a name="l00194"></a>00194 {
-<a name="l00195"></a>00195 tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-<a name="l00196"></a>00196 }
-<a name="l00197"></a>00197
-<a name="l00198"></a>00198 <span class="keywordflow">return</span> ((*where).second);
-<a name="l00199"></a>00199 }
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 <span class="keyword">const</span> mapped_type& at(<span class="keyword">const</span> key_type& key)<span class="keyword"> const</span>
-<a name="l00202"></a>00202 <span class="keyword"> </span>{
-<a name="l00203"></a>00203 const_iterator where = find(key);
-<a name="l00204"></a>00204
-<a name="l00205"></a>00205 <span class="keywordflow">if</span> (where == end())
-<a name="l00206"></a>00206 {
-<a name="l00207"></a>00207 tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-<a name="l00208"></a>00208 }
-<a name="l00209"></a>00209
-<a name="l00210"></a>00210 <span class="keywordflow">return</span> ((*where).second);
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212 };
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 } <span class="comment">// namespace interface5</span>
-<a name="l00215"></a>00215
-<a name="l00216"></a>00216 <span class="keyword">using</span> interface5::concurrent_unordered_map;
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 } <span class="comment">// namespace tbb</span>
-<a name="l00219"></a>00219
-<a name="l00220"></a>00220 <span class="preprocessor">#endif// __TBB_concurrent_unordered_map_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00484.html b/doc/html/a00484.html
deleted file mode 100644
index 7226c70..0000000
--- a/doc/html/a00484.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_unordered_set.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>concurrent_unordered_set.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="comment">/* Container implementations in this header are based on PPL implementations</span>
-<a name="l00022"></a>00022 <span class="comment"> provided by Microsoft. */</span>
-<a name="l00023"></a>00023
-<a name="l00024"></a>00024 <span class="preprocessor">#ifndef __TBB_concurrent_unordered_set_H</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_unordered_set_H</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "internal/_concurrent_unordered_impl.h"</span>
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb
-<a name="l00030"></a>00030 {
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="keyword">namespace </span>interface5 {
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="comment">// Template class for hash set traits</span>
-<a name="l00035"></a>00035 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> Hash_compare, <span class="keyword">typename</span> Allocator, <span class="keywordtype">bool</span> Allow_multimapping>
-<a name="l00036"></a>00036 <span class="keyword">class </span>concurrent_unordered_set_traits
-<a name="l00037"></a>00037 {
-<a name="l00038"></a>00038 <span class="keyword">protected</span>:
-<a name="l00039"></a>00039 <span class="keyword">typedef</span> Key value_type;
-<a name="l00040"></a>00040 <span class="keyword">typedef</span> Key key_type;
-<a name="l00041"></a>00041 <span class="keyword">typedef</span> Hash_compare hash_compare;
-<a name="l00042"></a>00042 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<value_type>::other allocator_type;
-<a name="l00043"></a>00043 <span class="keyword">enum</span> { allow_multimapping = Allow_multimapping };
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 concurrent_unordered_set_traits() : my_hash_compare() {}
-<a name="l00046"></a>00046 concurrent_unordered_set_traits(<span class="keyword">const</span> hash_compare& hc) : my_hash_compare(hc) {}
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keyword">typedef</span> hash_compare value_compare;
-<a name="l00049"></a>00049
-<a name="l00050"></a>00050 <span class="keyword">static</span> <span class="keyword">const</span> Key& get_key(<span class="keyword">const</span> value_type& value) {
-<a name="l00051"></a>00051 <span class="keywordflow">return</span> value;
-<a name="l00052"></a>00052 }
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
-<a name="l00055"></a>00055 };
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 <span class="keyword">template</span> <<span class="keyword">typename</span> Key, <span class="keyword">typename</span> Hasher = tbb::tbb_hash<Key>, <span class="keyword">typename</span> Key_equality = std::equal_to<Key>, <span class="keyword">typename</span> Allocator = tbb::tbb_allocator<Key> >
-<a name="l00058"></a>00058 <span class="keyword">class </span>concurrent_unordered_set : <span class="keyword">public</span> internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
-<a name="l00059"></a>00059 {
-<a name="l00060"></a>00060 <span class="comment">// Base type definitions</span>
-<a name="l00061"></a>00061 <span class="keyword">typedef</span> internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
-<a name="l00062"></a>00062 <span class="keyword">typedef</span> internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, hash_compare, Allocator, false> > base_type;
-<a name="l00063"></a>00063 <span class="keyword">typedef</span> concurrent_unordered_set_traits<Key, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, <span class="keyword">false</span>> traits_type;
-<a name="l00064"></a>00064 <span class="keyword">using</span> traits_type::my_hash_compare;
-<a name="l00065"></a>00065 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00067"></a>00067 <span class="preprocessor">#endif</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span> <span class="keyword">using</span> traits_type::allow_multimapping;
-<a name="l00069"></a>00069 <span class="keyword">public</span>:
-<a name="l00070"></a>00070 <span class="keyword">using</span> base_type::end;
-<a name="l00071"></a>00071 <span class="keyword">using</span> base_type::find;
-<a name="l00072"></a>00072 <span class="keyword">using</span> base_type::insert;
-<a name="l00073"></a>00073
-<a name="l00074"></a>00074 <span class="comment">// Type definitions</span>
-<a name="l00075"></a>00075 <span class="keyword">typedef</span> Key key_type;
-<a name="l00076"></a>00076 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::value_type value_type;
-<a name="l00077"></a>00077 <span class="keyword">typedef</span> Key mapped_type;
-<a name="l00078"></a>00078 <span class="keyword">typedef</span> Hasher hasher;
-<a name="l00079"></a>00079 <span class="keyword">typedef</span> Key_equality key_equal;
-<a name="l00080"></a>00080 <span class="keyword">typedef</span> hash_compare key_compare;
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::allocator_type allocator_type;
-<a name="l00083"></a>00083 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::pointer pointer;
-<a name="l00084"></a>00084 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_pointer const_pointer;
-<a name="l00085"></a>00085 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::reference reference;
-<a name="l00086"></a>00086 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_reference const_reference;
-<a name="l00087"></a>00087
-<a name="l00088"></a>00088 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::size_type size_type;
-<a name="l00089"></a>00089 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::difference_type difference_type;
-<a name="l00090"></a>00090
-<a name="l00091"></a>00091 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator iterator;
-<a name="l00092"></a>00092 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_iterator;
-<a name="l00093"></a>00093 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator local_iterator;
-<a name="l00094"></a>00094 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_local_iterator;
-<a name="l00095"></a>00095
-<a name="l00096"></a>00096 <span class="comment">// Construction/destruction/copying</span>
-<a name="l00097"></a>00097 <span class="keyword">explicit</span> concurrent_unordered_set(size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
-<a name="l00098"></a>00098 <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00099"></a>00099 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00100"></a>00100 {
-<a name="l00101"></a>00101 }
-<a name="l00102"></a>00102
-<a name="l00103"></a>00103 concurrent_unordered_set(<span class="keyword">const</span> Allocator& a) : base_type(8, key_compare(), a)
-<a name="l00104"></a>00104 {
-<a name="l00105"></a>00105 }
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="keyword">template</span> <<span class="keyword">typename</span> Iterator>
-<a name="l00108"></a>00108 concurrent_unordered_set(Iterator first, Iterator last, size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
-<a name="l00109"></a>00109 <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00110"></a>00110 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00111"></a>00111 {
-<a name="l00112"></a>00112 <span class="keywordflow">for</span> (; first != last; ++first)
-<a name="l00113"></a>00113 base_type::insert(*first);
-<a name="l00114"></a>00114 }
-<a name="l00115"></a>00115
-<a name="l00116"></a>00116 concurrent_unordered_set(<span class="keyword">const</span> concurrent_unordered_set& table) : base_type(table)
-<a name="l00117"></a>00117 {
-<a name="l00118"></a>00118 }
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 concurrent_unordered_set(<span class="keyword">const</span> concurrent_unordered_set& table, <span class="keyword">const</span> Allocator& a)
-<a name="l00121"></a>00121 : base_type(table, a)
-<a name="l00122"></a>00122 {
-<a name="l00123"></a>00123 }
-<a name="l00124"></a>00124
-<a name="l00125"></a>00125 concurrent_unordered_set& operator=(<span class="keyword">const</span> concurrent_unordered_set& table)
-<a name="l00126"></a>00126 {
-<a name="l00127"></a>00127 base_type::operator=(table);
-<a name="l00128"></a>00128 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130
-<a name="l00131"></a>00131 iterator unsafe_erase(const_iterator where)
-<a name="l00132"></a>00132 {
-<a name="l00133"></a>00133 <span class="keywordflow">return</span> base_type::unsafe_erase(where);
-<a name="l00134"></a>00134 }
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 size_type unsafe_erase(<span class="keyword">const</span> key_type& key)
-<a name="l00137"></a>00137 {
-<a name="l00138"></a>00138 <span class="keywordflow">return</span> base_type::unsafe_erase(key);
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 iterator unsafe_erase(const_iterator first, const_iterator last)
-<a name="l00142"></a>00142 {
-<a name="l00143"></a>00143 <span class="keywordflow">return</span> base_type::unsafe_erase(first, last);
-<a name="l00144"></a>00144 }
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <span class="keywordtype">void</span> swap(concurrent_unordered_set& table)
-<a name="l00147"></a>00147 {
-<a name="l00148"></a>00148 base_type::swap(table);
-<a name="l00149"></a>00149 }
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 <span class="comment">// Observers</span>
-<a name="l00152"></a>00152 hasher hash_function()<span class="keyword"> const</span>
-<a name="l00153"></a>00153 <span class="keyword"> </span>{
-<a name="l00154"></a>00154 <span class="keywordflow">return</span> my_hash_compare.my_hash_object;
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 key_equal key_eq()<span class="keyword"> const</span>
-<a name="l00158"></a>00158 <span class="keyword"> </span>{
-<a name="l00159"></a>00159 <span class="keywordflow">return</span> my_hash_compare.my_key_compare_object;
-<a name="l00160"></a>00160 }
-<a name="l00161"></a>00161 };
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 } <span class="comment">// namespace interface5</span>
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="keyword">using</span> interface5::concurrent_unordered_set;
-<a name="l00166"></a>00166
-<a name="l00167"></a>00167 } <span class="comment">// namespace tbb</span>
-<a name="l00168"></a>00168
-<a name="l00169"></a>00169 <span class="preprocessor">#endif// __TBB_concurrent_unordered_set_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00487.html b/doc/html/a00487.html
deleted file mode 100644
index 2c739ce..0000000
--- a/doc/html/a00487.html
+++ /dev/null
@@ -1,928 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_vector.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>concurrent_vector.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_vector_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_vector_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include <new></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span> <span class="comment">// for memset()</span>
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00036"></a>00036 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span>
-<a name="l00040"></a>00040 <span class="preprocessor">#include <algorithm></span>
-<a name="l00041"></a>00041 <span class="preprocessor">#include <iterator></span>
-<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span>
-<a name="l00047"></a>00047 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span> <span class="comment">// VS2008/VC9 seems to have an issue; limits pull in math.h</span>
-<a name="l00049"></a>00049 <span class="preprocessor"> #pragma warning( push )</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( disable: 4985 )</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#include <limits></span> <span class="comment">/* std::numeric_limits */</span>
-<a name="l00053"></a>00053 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( pop )</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00056"></a>00056 <span class="preprocessor"></span>
-<a name="l00057"></a>00057 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warnings in /Wp64 mode</span>
-<a name="l00059"></a>00059 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4267)</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span>
-<a name="l00063"></a>00063 <span class="keyword">namespace </span>tbb {
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00066"></a>00066 <span class="keyword">class </span>concurrent_vector;
-<a name="l00067"></a>00067
-<a name="l00069"></a>00069 <span class="keyword">namespace </span>internal {
-<a name="l00070"></a>00070
-<a name="l00072"></a>00072 <span class="keyword">static</span> <span class="keywordtype">void</span> *<span class="keyword">const</span> vector_allocation_error_flag = reinterpret_cast<void*>(size_t(63));
-<a name="l00073"></a>00073
-<a name="l00075"></a>00075
-<a name="l00076"></a>00076 <span class="keyword">class </span>concurrent_vector_base_v3 {
-<a name="l00077"></a>00077 <span class="keyword">protected</span>:
-<a name="l00078"></a>00078
-<a name="l00079"></a>00079 <span class="comment">// Basic types declarations</span>
-<a name="l00080"></a>00080 <span class="keyword">typedef</span> size_t segment_index_t;
-<a name="l00081"></a>00081 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00082"></a>00082
-<a name="l00083"></a>00083 <span class="comment">// Using enumerations due to Mac linking problems of static const variables</span>
-<a name="l00084"></a>00084 <span class="keyword">enum</span> {
-<a name="l00085"></a>00085 <span class="comment">// Size constants</span>
-<a name="l00086"></a>00086 default_initial_segments = 1, <span class="comment">// 2 initial items</span>
-<a name="l00088"></a>00088 <span class="comment"></span> pointers_per_short_table = 3, <span class="comment">// to fit into 8 words of entire structure</span>
-<a name="l00089"></a>00089 pointers_per_long_table = <span class="keyword">sizeof</span>(segment_index_t) * 8 <span class="comment">// one segment per bit</span>
-<a name="l00090"></a>00090 };
-<a name="l00091"></a>00091
-<a name="l00092"></a>00092 <span class="comment">// Segment pointer. Can be zero-initialized</span>
-<a name="l00093"></a>00093 <span class="keyword">struct </span>segment_t {
-<a name="l00094"></a>00094 <span class="keywordtype">void</span>* array;
-<a name="l00095"></a>00095 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span> ~segment_t() {
-<a name="l00097"></a>00097 __TBB_ASSERT( array <= internal::vector_allocation_error_flag, <span class="stringliteral">"should have been freed by clear"</span> );
-<a name="l00098"></a>00098 }
-<a name="l00099"></a>00099 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00100"></a>00100 };
-<a name="l00101"></a>00101
-<a name="l00102"></a>00102 <span class="comment">// Data fields</span>
-<a name="l00103"></a>00103
-<a name="l00105"></a>00105 <span class="keywordtype">void</span>* (*vector_allocator_ptr)(concurrent_vector_base_v3 &, size_t);
-<a name="l00106"></a>00106
-<a name="l00108"></a>00108 atomic<size_type> my_first_block;
-<a name="l00109"></a>00109
-<a name="l00111"></a>00111 atomic<size_type> my_early_size;
-<a name="l00112"></a>00112
-<a name="l00114"></a>00114 atomic<segment_t*> my_segment;
-<a name="l00115"></a>00115
-<a name="l00117"></a>00117 segment_t my_storage[pointers_per_short_table];
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="comment">// Methods</span>
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 concurrent_vector_base_v3() {
-<a name="l00122"></a>00122 my_early_size = 0;
-<a name="l00123"></a>00123 my_first_block = 0; <span class="comment">// here is not default_initial_segments</span>
-<a name="l00124"></a>00124 <span class="keywordflow">for</span>( segment_index_t i = 0; i < pointers_per_short_table; i++)
-<a name="l00125"></a>00125 my_storage[i].array = NULL;
-<a name="l00126"></a>00126 my_segment = my_storage;
-<a name="l00127"></a>00127 }
-<a name="l00128"></a>00128 __TBB_EXPORTED_METHOD ~concurrent_vector_base_v3();
-<a name="l00129"></a>00129
-<a name="l00130"></a>00130 <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
-<a name="l00131"></a>00131 <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
-<a name="l00135"></a>00135 <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
-<a name="l00136"></a>00136 }
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138 <span class="keyword">static</span> <span class="keyword">inline</span> segment_index_t segment_base_index_of( segment_index_t &index ) {
-<a name="l00139"></a>00139 segment_index_t k = segment_index_of( index );
-<a name="l00140"></a>00140 index -= segment_base(k);
-<a name="l00141"></a>00141 <span class="keywordflow">return</span> k;
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
-<a name="l00145"></a>00145 <span class="keywordflow">return</span> segment_index_t(1)<<k; <span class="comment">// fake value for k==0</span>
-<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147
-<a name="l00149"></a>00149 <span class="keyword">typedef</span> void (__TBB_EXPORTED_FUNC *internal_array_op1)(<span class="keywordtype">void</span>* begin, size_type n );
-<a name="l00150"></a>00150
-<a name="l00152"></a>00152 <span class="keyword">typedef</span> void (__TBB_EXPORTED_FUNC *internal_array_op2)(<span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
-<a name="l00153"></a>00153
-<a name="l00155"></a>00155 <span class="keyword">struct </span>internal_segments_table {
-<a name="l00156"></a>00156 segment_index_t first_block;
-<a name="l00157"></a>00157 <span class="keywordtype">void</span>* table[pointers_per_long_table];
-<a name="l00158"></a>00158 };
-<a name="l00159"></a>00159
-<a name="l00160"></a>00160 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_reserve( size_type n, size_type element_size, size_type max_size );
-<a name="l00161"></a>00161 size_type __TBB_EXPORTED_METHOD internal_capacity() <span class="keyword">const</span>;
-<a name="l00162"></a>00162 <span class="keywordtype">void</span> internal_grow( size_type start, size_type finish, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
-<a name="l00163"></a>00163 size_type __TBB_EXPORTED_METHOD internal_grow_by( size_type delta, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
-<a name="l00164"></a>00164 <span class="keywordtype">void</span>* __TBB_EXPORTED_METHOD internal_push_back( size_type element_size, size_type& index );
-<a name="l00165"></a>00165 segment_index_t __TBB_EXPORTED_METHOD internal_clear( internal_array_op1 destroy );
-<a name="l00166"></a>00166 <span class="keywordtype">void</span>* __TBB_EXPORTED_METHOD internal_compact( size_type element_size, <span class="keywordtype">void</span> *table, internal_array_op1 destroy, internal_array_op2 copy );
-<a name="l00167"></a>00167 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_copy( <span class="keyword">const</span> concurrent_vector_base_v3& src, size_type element_size, internal_array_op2 copy );
-<a name="l00168"></a>00168 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_assign( <span class="keyword">const</span> concurrent_vector_base_v3& src, size_type element_size,
-<a name="l00169"></a>00169 internal_array_op1 destroy, internal_array_op2 assign, internal_array_op2 copy );
-<a name="l00171"></a>00171 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception(size_type) <span class="keyword">const</span>;
-<a name="l00172"></a>00172 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_swap(concurrent_vector_base_v3& v);
-<a name="l00173"></a>00173
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_resize( size_type n, size_type element_size, size_type max_size, <span class="keyword">const</span> <span class="keywordtype">void</span> *src,
-<a name="l00175"></a>00175 internal_array_op1 destroy, internal_array_op2 init );
-<a name="l00176"></a>00176 size_type __TBB_EXPORTED_METHOD internal_grow_to_at_least_with_result( size_type new_size, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
-<a name="l00177"></a>00177
-<a name="l00179"></a>00179 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_grow_to_at_least( size_type new_size, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
-<a name="l00180"></a>00180 <span class="keyword">private</span>:
-<a name="l00182"></a>00182 <span class="keyword">class </span>helper;
-<a name="l00183"></a>00183 <span class="keyword">friend</span> <span class="keyword">class </span>helper;
-<a name="l00184"></a>00184 };
-<a name="l00185"></a>00185
-<a name="l00186"></a>00186 <span class="keyword">typedef</span> concurrent_vector_base_v3 concurrent_vector_base;
-<a name="l00187"></a>00187
-<a name="l00189"></a>00189
-<a name="l00191"></a>00191 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00192"></a>00192 <span class="keyword">class </span>vector_iterator
-<a name="l00193"></a>00193 {
-<a name="l00195"></a>00195 Container* my_vector;
-<a name="l00196"></a>00196
-<a name="l00198"></a>00198 size_t my_index;
-<a name="l00199"></a>00199
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="keyword">mutable</span> Value* my_item;
-<a name="l00203"></a>00203
-<a name="l00204"></a>00204 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
-<a name="l00205"></a>00205 <span class="keyword">friend</span> vector_iterator<C,T> operator+( ptrdiff_t offset, <span class="keyword">const</span> vector_iterator<C,T>& v );
-<a name="l00206"></a>00206
-<a name="l00207"></a>00207 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00208"></a>00208 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> vector_iterator<C,T>& i, <span class="keyword">const</span> vector_iterator<C,U>& j );
-<a name="l00209"></a>00209
-<a name="l00210"></a>00210 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00211"></a>00211 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const vector_iterator<C,T>& i, <span class="keyword">const</span> vector_iterator<C,U>& j );
-<a name="l00212"></a>00212
-<a name="l00213"></a>00213 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00214"></a>00214 <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> vector_iterator<C,T>& i, <span class="keyword">const</span> vector_iterator<C,U>& j );
-<a name="l00215"></a>00215
-<a name="l00216"></a>00216 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00217"></a>00217 <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
-<a name="l00218"></a>00218
-<a name="l00219"></a>00219 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00220"></a>00220 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00221"></a>00221 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00276.html">tbb::concurrent_vector</a>;
-<a name="l00222"></a>00222 <span class="preprocessor">#else</span>
-<a name="l00223"></a>00223 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00224"></a>00224 <span class="preprocessor">#endif</span>
-<a name="l00225"></a>00225 <span class="preprocessor"></span>
-<a name="l00226"></a>00226 vector_iterator( <span class="keyword">const</span> Container& vector, size_t index, <span class="keywordtype">void</span> *ptr = 0 ) :
-<a name="l00227"></a>00227 my_vector(const_cast<Container*>(&vector)),
-<a name="l00228"></a>00228 my_index(index),
-<a name="l00229"></a>00229 my_item(static_cast<Value*>(ptr))
-<a name="l00230"></a>00230 {}
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 <span class="keyword">public</span>:
-<a name="l00234"></a>00234 vector_iterator() : my_vector(NULL), my_index(~size_t(0)), my_item(NULL) {}
-<a name="l00235"></a>00235
-<a name="l00236"></a>00236 vector_iterator( <span class="keyword">const</span> vector_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00237"></a>00237 my_vector(other.my_vector),
-<a name="l00238"></a>00238 my_index(other.my_index),
-<a name="l00239"></a>00239 my_item(other.my_item)
-<a name="l00240"></a>00240 {}
-<a name="l00241"></a>00241
-<a name="l00242"></a>00242 vector_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00243"></a>00243 <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index+offset );
-<a name="l00244"></a>00244 }
-<a name="l00245"></a>00245 vector_iterator &operator+=( ptrdiff_t offset ) {
-<a name="l00246"></a>00246 my_index+=offset;
-<a name="l00247"></a>00247 my_item = NULL;
-<a name="l00248"></a>00248 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00249"></a>00249 }
-<a name="l00250"></a>00250 vector_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00251"></a>00251 <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index-offset );
-<a name="l00252"></a>00252 }
-<a name="l00253"></a>00253 vector_iterator &operator-=( ptrdiff_t offset ) {
-<a name="l00254"></a>00254 my_index-=offset;
-<a name="l00255"></a>00255 my_item = NULL;
-<a name="l00256"></a>00256 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00257"></a>00257 }
-<a name="l00258"></a>00258 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00259"></a>00259 Value* item = my_item;
-<a name="l00260"></a>00260 <span class="keywordflow">if</span>( !item ) {
-<a name="l00261"></a>00261 item = my_item = &my_vector->internal_subscript(my_index);
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263 __TBB_ASSERT( item==&my_vector->internal_subscript(my_index), <span class="stringliteral">"corrupt cache"</span> );
-<a name="l00264"></a>00264 <span class="keywordflow">return</span> *item;
-<a name="l00265"></a>00265 }
-<a name="l00266"></a>00266 Value& <a class="code" href="a00276.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>( ptrdiff_t k )<span class="keyword"> const </span>{
-<a name="l00267"></a>00267 <span class="keywordflow">return</span> my_vector->internal_subscript(my_index+k);
-<a name="l00268"></a>00268 }
-<a name="l00269"></a>00269 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00270"></a>00270
-<a name="l00272"></a>00272 vector_iterator& operator++() {
-<a name="l00273"></a>00273 size_t k = ++my_index;
-<a name="l00274"></a>00274 <span class="keywordflow">if</span>( my_item ) {
-<a name="l00275"></a>00275 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00276"></a>00276 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
-<a name="l00277"></a>00277 <span class="comment">// k is a power of two that is at least k-2</span>
-<a name="l00278"></a>00278 my_item= NULL;
-<a name="l00279"></a>00279 } <span class="keywordflow">else</span> {
-<a name="l00280"></a>00280 ++my_item;
-<a name="l00281"></a>00281 }
-<a name="l00282"></a>00282 }
-<a name="l00283"></a>00283 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00284"></a>00284 }
-<a name="l00285"></a>00285
-<a name="l00287"></a>00287 vector_iterator& operator--() {
-<a name="l00288"></a>00288 __TBB_ASSERT( my_index>0, <span class="stringliteral">"operator--() applied to iterator already at beginning of concurrent_vector"</span> );
-<a name="l00289"></a>00289 size_t k = my_index--;
-<a name="l00290"></a>00290 <span class="keywordflow">if</span>( my_item ) {
-<a name="l00291"></a>00291 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00292"></a>00292 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
-<a name="l00293"></a>00293 <span class="comment">// k is a power of two that is at least k-2 </span>
-<a name="l00294"></a>00294 my_item= NULL;
-<a name="l00295"></a>00295 } <span class="keywordflow">else</span> {
-<a name="l00296"></a>00296 --my_item;
-<a name="l00297"></a>00297 }
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00300"></a>00300 }
-<a name="l00301"></a>00301
-<a name="l00303"></a>00303 vector_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00304"></a>00304 vector_iterator result = *<span class="keyword">this</span>;
-<a name="l00305"></a>00305 operator++();
-<a name="l00306"></a>00306 <span class="keywordflow">return</span> result;
-<a name="l00307"></a>00307 }
-<a name="l00308"></a>00308
-<a name="l00310"></a>00310 vector_iterator operator--(<span class="keywordtype">int</span>) {
-<a name="l00311"></a>00311 vector_iterator result = *<span class="keyword">this</span>;
-<a name="l00312"></a>00312 operator--();
-<a name="l00313"></a>00313 <span class="keywordflow">return</span> result;
-<a name="l00314"></a>00314 }
-<a name="l00315"></a>00315
-<a name="l00316"></a>00316 <span class="comment">// STL support</span>
-<a name="l00317"></a>00317
-<a name="l00318"></a>00318 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00319"></a>00319 <span class="keyword">typedef</span> Value value_type;
-<a name="l00320"></a>00320 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00321"></a>00321 <span class="keyword">typedef</span> Value& reference;
-<a name="l00322"></a>00322 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
-<a name="l00323"></a>00323 };
-<a name="l00324"></a>00324
-<a name="l00325"></a>00325 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
-<a name="l00326"></a>00326 vector_iterator<Container,T> operator+( ptrdiff_t offset, <span class="keyword">const</span> vector_iterator<Container,T>& v ) {
-<a name="l00327"></a>00327 <span class="keywordflow">return</span> vector_iterator<Container,T>( *v.my_vector, v.my_index+offset );
-<a name="l00328"></a>00328 }
-<a name="l00329"></a>00329
-<a name="l00330"></a>00330 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00331"></a>00331 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00332"></a>00332 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_vector == j.my_vector;
-<a name="l00333"></a>00333 }
-<a name="l00334"></a>00334
-<a name="l00335"></a>00335 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00336"></a>00336 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00337"></a>00337 <span class="keywordflow">return</span> !(i==j);
-<a name="l00338"></a>00338 }
-<a name="l00339"></a>00339
-<a name="l00340"></a>00340 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00341"></a>00341 <span class="keywordtype">bool</span> operator<( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00342"></a>00342 <span class="keywordflow">return</span> i.my_index<j.my_index;
-<a name="l00343"></a>00343 }
-<a name="l00344"></a>00344
-<a name="l00345"></a>00345 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00346"></a>00346 <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00347"></a>00347 <span class="keywordflow">return</span> j<i;
-<a name="l00348"></a>00348 }
-<a name="l00349"></a>00349
-<a name="l00350"></a>00350 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00351"></a>00351 <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00352"></a>00352 <span class="keywordflow">return</span> !(i<j);
-<a name="l00353"></a>00353 }
-<a name="l00354"></a>00354
-<a name="l00355"></a>00355 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00356"></a>00356 <span class="keywordtype">bool</span> operator<=( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00357"></a>00357 <span class="keywordflow">return</span> !(j<i);
-<a name="l00358"></a>00358 }
-<a name="l00359"></a>00359
-<a name="l00360"></a>00360 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00361"></a>00361 ptrdiff_t operator-( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00362"></a>00362 <span class="keywordflow">return</span> ptrdiff_t(i.my_index)-ptrdiff_t(j.my_index);
-<a name="l00363"></a>00363 }
-<a name="l00364"></a>00364
-<a name="l00365"></a>00365 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00366"></a>00366 <span class="keyword">class </span>allocator_base {
-<a name="l00367"></a>00367 <span class="keyword">public</span>:
-<a name="l00368"></a>00368 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template
-<a name="l00369"></a>00369 rebind<T>::other allocator_type;
-<a name="l00370"></a>00370 allocator_type my_allocator;
-<a name="l00371"></a>00371
-<a name="l00372"></a>00372 allocator_base(<span class="keyword">const</span> allocator_type &a = allocator_type() ) : my_allocator(a) {}
-<a name="l00373"></a>00373 };
-<a name="l00374"></a>00374
-<a name="l00375"></a>00375 } <span class="comment">// namespace internal</span>
-<a name="l00377"></a>00377 <span class="comment"></span>
-<a name="l00379"></a>00379
-<a name="l00440"></a>00440 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00441"></a><a class="code" href="a00276.html">00441</a> <span class="keyword">class </span><a class="code" href="a00276.html">concurrent_vector</a>: <span class="keyword">protected</span> internal::allocator_base<T, A>,
-<a name="l00442"></a>00442 <span class="keyword">private</span> internal::concurrent_vector_base {
-<a name="l00443"></a>00443 <span class="keyword">private</span>:
-<a name="l00444"></a>00444 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00445"></a>00445 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00259.html">blocked_range</a><I> {
-<a name="l00446"></a>00446 <span class="keyword">public</span>:
-<a name="l00447"></a>00447 <span class="keyword">typedef</span> T value_type;
-<a name="l00448"></a>00448 <span class="keyword">typedef</span> T& reference;
-<a name="l00449"></a>00449 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00450"></a>00450 <span class="keyword">typedef</span> I iterator;
-<a name="l00451"></a>00451 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00452"></a>00452 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00259.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
-<a name="l00453"></a>00453 template<typename U>
-<a name="l00454"></a>00454 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00259.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
-<a name="l00455"></a>00455 generic_range_type( generic_range_type& r, <a class="code" href="a00335.html">split</a> ) : <a class="code" href="a00259.html">blocked_range<I></a>(r,<a class="code" href="a00335.html">split</a>()) {}
-<a name="l00456"></a>00456 };
-<a name="l00457"></a>00457
-<a name="l00458"></a>00458 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00459"></a>00459 <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
-<a name="l00460"></a>00460 <span class="keyword">public</span>:
-<a name="l00461"></a>00461 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00462"></a>00462 <span class="comment">// STL compatible types</span>
-<a name="l00463"></a>00463 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00464"></a>00464 <span class="keyword">typedef</span> internal::concurrent_vector_base_v3::size_type size_type;
-<a name="l00465"></a>00465 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_base<T, A>::allocator_type allocator_type;
-<a name="l00466"></a>00466
-<a name="l00467"></a>00467 <span class="keyword">typedef</span> T value_type;
-<a name="l00468"></a>00468 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00469"></a>00469 <span class="keyword">typedef</span> T& reference;
-<a name="l00470"></a>00470 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00471"></a>00471 <span class="keyword">typedef</span> T *pointer;
-<a name="l00472"></a>00472 <span class="keyword">typedef</span> <span class="keyword">const</span> T *const_pointer;
-<a name="l00473"></a>00473
-<a name="l00474"></a>00474 <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,T> iterator;
-<a name="l00475"></a>00475 <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,const T> const_iterator;
-<a name="l00476"></a>00476
-<a name="l00477"></a>00477 <span class="preprocessor">#if !defined(_MSC_VER) || _CPPLIB_VER>=300</span>
-<a name="l00478"></a>00478 <span class="preprocessor"></span> <span class="comment">// Assume ISO standard definition of std::reverse_iterator</span>
-<a name="l00479"></a>00479 <span class="keyword">typedef</span> std::reverse_iterator<iterator> reverse_iterator;
-<a name="l00480"></a>00480 <span class="keyword">typedef</span> std::reverse_iterator<const_iterator> const_reverse_iterator;
-<a name="l00481"></a>00481 <span class="preprocessor">#else</span>
-<a name="l00482"></a>00482 <span class="preprocessor"></span> <span class="comment">// Use non-standard std::reverse_iterator</span>
-<a name="l00483"></a>00483 <span class="keyword">typedef</span> std::reverse_iterator<iterator,T,T&,T*> reverse_iterator;
-<a name="l00484"></a>00484 <span class="keyword">typedef</span> std::reverse_iterator<const_iterator,T,const T&,const T*> const_reverse_iterator;
-<a name="l00485"></a>00485 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && (_MSC_VER<1300) */</span>
-<a name="l00486"></a>00486
-<a name="l00487"></a>00487 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00488"></a>00488 <span class="comment">// Parallel algorithm support</span>
-<a name="l00489"></a>00489 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00490"></a>00490 <span class="keyword">typedef</span> generic_range_type<iterator> range_type;
-<a name="l00491"></a>00491 <span class="keyword">typedef</span> generic_range_type<const_iterator> const_range_type;
-<a name="l00492"></a>00492
-<a name="l00493"></a>00493 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00494"></a>00494 <span class="comment">// STL compatible constructors & destructors</span>
-<a name="l00495"></a>00495 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00496"></a>00496
-<a name="l00498"></a><a class="code" href="a00276.html#2c8ca9cabfcd30ad5943324c853664b5">00498</a> <span class="keyword">explicit</span> <a class="code" href="a00276.html">concurrent_vector</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00499"></a>00499 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
-<a name="l00500"></a>00500 {
-<a name="l00501"></a>00501 vector_allocator_ptr = &internal_allocator;
-<a name="l00502"></a>00502 }
-<a name="l00503"></a>00503
-<a name="l00505"></a><a class="code" href="a00276.html#dd8a200b99a8088435a37934b58fe335">00505</a> <a class="code" href="a00276.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00276.html">concurrent_vector</a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
-<a name="l00506"></a>00506 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
-<a name="l00507"></a>00507 {
-<a name="l00508"></a>00508 vector_allocator_ptr = &internal_allocator;
-<a name="l00509"></a>00509 __TBB_TRY {
-<a name="l00510"></a>00510 internal_copy(vector, <span class="keyword">sizeof</span>(T), ©_array);
-<a name="l00511"></a>00511 } __TBB_CATCH(...) {
-<a name="l00512"></a>00512 segment_t *table = my_segment;
-<a name="l00513"></a>00513 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00514"></a>00514 __TBB_RETHROW();
-<a name="l00515"></a>00515 }
-<a name="l00516"></a>00516 }
-<a name="l00517"></a>00517
-<a name="l00519"></a>00519 <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00520"></a><a class="code" href="a00276.html#64432f13f7b29bfe4acfb5568f34f3a8">00520</a> <a class="code" href="a00276.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00276.html">concurrent_vector<T, M></a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
-<a name="l00521"></a>00521 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
-<a name="l00522"></a>00522 {
-<a name="l00523"></a>00523 vector_allocator_ptr = &internal_allocator;
-<a name="l00524"></a>00524 __TBB_TRY {
-<a name="l00525"></a>00525 internal_copy(vector.<a class="code" href="a00276.html#bb5ae659871478f1f5c68039e1273e12">internal_vector_base</a>(), <span class="keyword">sizeof</span>(T), ©_array);
-<a name="l00526"></a>00526 } __TBB_CATCH(...) {
-<a name="l00527"></a>00527 segment_t *table = my_segment;
-<a name="l00528"></a>00528 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00529"></a>00529 __TBB_RETHROW();
-<a name="l00530"></a>00530 }
-<a name="l00531"></a>00531 }
-<a name="l00532"></a>00532
-<a name="l00534"></a><a class="code" href="a00276.html#2a2e261dfe1cab3f73f7b1a94137cfca">00534</a> <span class="keyword">explicit</span> <a class="code" href="a00276.html">concurrent_vector</a>(size_type n)
-<a name="l00535"></a>00535 {
-<a name="l00536"></a>00536 vector_allocator_ptr = &internal_allocator;
-<a name="l00537"></a>00537 __TBB_TRY {
-<a name="l00538"></a>00538 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
-<a name="l00539"></a>00539 } __TBB_CATCH(...) {
-<a name="l00540"></a>00540 segment_t *table = my_segment;
-<a name="l00541"></a>00541 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00542"></a>00542 __TBB_RETHROW();
-<a name="l00543"></a>00543 }
-<a name="l00544"></a>00544 }
-<a name="l00545"></a>00545
-<a name="l00547"></a><a class="code" href="a00276.html#3883a8a908b44e249a57f454de3f55d8">00547</a> <a class="code" href="a00276.html">concurrent_vector</a>(size_type n, const_reference t, <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00548"></a>00548 : internal::allocator_base<T, A>(a)
-<a name="l00549"></a>00549 {
-<a name="l00550"></a>00550 vector_allocator_ptr = &internal_allocator;
-<a name="l00551"></a>00551 __TBB_TRY {
-<a name="l00552"></a>00552 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00553"></a>00553 } __TBB_CATCH(...) {
-<a name="l00554"></a>00554 segment_t *table = my_segment;
-<a name="l00555"></a>00555 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00556"></a>00556 __TBB_RETHROW();
-<a name="l00557"></a>00557 }
-<a name="l00558"></a>00558 }
-<a name="l00559"></a>00559
-<a name="l00561"></a>00561 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00562"></a><a class="code" href="a00276.html#4450de83c5862ea4bcd9443fd7e67419">00562</a> <a class="code" href="a00276.html">concurrent_vector</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00563"></a>00563 : internal::allocator_base<T, A>(a)
-<a name="l00564"></a>00564 {
-<a name="l00565"></a>00565 vector_allocator_ptr = &internal_allocator;
-<a name="l00566"></a>00566 __TBB_TRY {
-<a name="l00567"></a>00567 internal_assign_range(first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
-<a name="l00568"></a>00568 } __TBB_CATCH(...) {
-<a name="l00569"></a>00569 segment_t *table = my_segment;
-<a name="l00570"></a>00570 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00571"></a>00571 __TBB_RETHROW();
-<a name="l00572"></a>00572 }
-<a name="l00573"></a>00573 }
-<a name="l00574"></a>00574
-<a name="l00576"></a><a class="code" href="a00276.html#691f0f3cda3e489c37a657016e375eaf">00576</a> <a class="code" href="a00276.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00276.html">concurrent_vector</a>& vector ) {
-<a name="l00577"></a>00577 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector )
-<a name="l00578"></a>00578 internal_assign(vector, <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, ©_array);
-<a name="l00579"></a>00579 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00580"></a>00580 }
-<a name="l00581"></a>00581
-<a name="l00583"></a>00583 <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00584"></a><a class="code" href="a00276.html#19f4ab88a01b0fd056af3bba463e7bd6">00584</a> <a class="code" href="a00276.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00276.html">concurrent_vector<T, M></a>& vector ) {
-<a name="l00585"></a>00585 <span class="keywordflow">if</span>( static_cast<void*>( <span class="keyword">this</span> ) != static_cast<const void*>( &vector ) )
-<a name="l00586"></a>00586 internal_assign(vector.internal_vector_base(),
-<a name="l00587"></a>00587 <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, ©_array);
-<a name="l00588"></a>00588 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00589"></a>00589 }
-<a name="l00590"></a>00590
-<a name="l00591"></a>00591 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00592"></a>00592 <span class="comment">// Concurrent operations</span>
-<a name="l00593"></a>00593 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00595"></a>00595 <span class="comment"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00596"></a>00596 <span class="preprocessor"></span>
-<a name="l00597"></a><a class="code" href="a00276.html#30484e3959892fd5392fa93c873c31f0">00597</a> size_type grow_by( size_type delta ) {
-<a name="l00598"></a>00598 <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size;
-<a name="l00599"></a>00599 }
-<a name="l00600"></a>00600 <span class="preprocessor">#else</span>
-<a name="l00601"></a>00601 <span class="preprocessor"></span>
-<a name="l00602"></a><a class="code" href="a00276.html#c8177b1865270ea68aa1ab9148e5e35e">00602</a> iterator grow_by( size_type delta ) {
-<a name="l00603"></a>00603 <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size);
-<a name="l00604"></a>00604 }
-<a name="l00605"></a>00605 <span class="preprocessor">#endif</span>
-<a name="l00606"></a>00606 <span class="preprocessor"></span>
-<a name="l00608"></a>00608 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00609"></a>00609 <span class="preprocessor"></span>
-<a name="l00610"></a><a class="code" href="a00276.html#38274ab3f772ecba600c7daca7690102">00610</a> size_type grow_by( size_type delta, const_reference t ) {
-<a name="l00611"></a>00611 <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size;
-<a name="l00612"></a>00612 }
-<a name="l00613"></a>00613 <span class="preprocessor">#else</span>
-<a name="l00614"></a>00614 <span class="preprocessor"></span>
-<a name="l00615"></a><a class="code" href="a00276.html#473a59a4c9308b93411b898b3110d26c">00615</a> iterator grow_by( size_type delta, const_reference t ) {
-<a name="l00616"></a>00616 <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size);
-<a name="l00617"></a>00617 }
-<a name="l00618"></a>00618 <span class="preprocessor">#endif</span>
-<a name="l00619"></a>00619 <span class="preprocessor"></span>
-<a name="l00621"></a>00621 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00622"></a>00622 <span class="preprocessor"></span>
-<a name="l00624"></a><a class="code" href="a00276.html#47fe588214dd5fa06ab6e8ab78d83874">00624</a> <span class="keywordtype">void</span> grow_to_at_least( size_type n ) {
-<a name="l00625"></a>00625 <span class="keywordflow">if</span>( n ) internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
-<a name="l00626"></a>00626 };
-<a name="l00627"></a>00627 <span class="preprocessor">#else</span>
-<a name="l00628"></a>00628 <span class="preprocessor"></span>
-<a name="l00632"></a><a class="code" href="a00276.html#a7e3b67c8ccab16d0aecc80899ae799d">00632</a> iterator grow_to_at_least( size_type n ) {
-<a name="l00633"></a>00633 size_type m=0;
-<a name="l00634"></a>00634 <span class="keywordflow">if</span>( n ) {
-<a name="l00635"></a>00635 m = internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
-<a name="l00636"></a>00636 <span class="keywordflow">if</span>( m>n ) m=n;
-<a name="l00637"></a>00637 }
-<a name="l00638"></a>00638 <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, m);
-<a name="l00639"></a>00639 };
-<a name="l00640"></a>00640 <span class="preprocessor">#endif</span>
-<a name="l00641"></a>00641 <span class="preprocessor"></span>
-<a name="l00643"></a>00643 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00644"></a><a class="code" href="a00276.html#e94e038f915c0268fdf2d3d7f87d81b8">00644</a> <span class="preprocessor"></span> size_type push_back( const_reference item )
-<a name="l00645"></a>00645 <span class="preprocessor">#else</span>
-<a name="l00646"></a>00646 <span class="preprocessor"></span>
-<a name="l00647"></a>00647 iterator push_back( const_reference item )
-<a name="l00648"></a>00648 <span class="preprocessor">#endif</span>
-<a name="l00649"></a>00649 <span class="preprocessor"></span> {
-<a name="l00650"></a>00650 size_type k;
-<a name="l00651"></a>00651 <span class="keywordtype">void</span> *ptr = internal_push_back(<span class="keyword">sizeof</span>(T),k);
-<a name="l00652"></a>00652 internal_loop_guide loop(1, ptr);
-<a name="l00653"></a>00653 loop.init(&item);
-<a name="l00654"></a>00654 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00655"></a>00655 <span class="preprocessor"></span> <span class="keywordflow">return</span> k;
-<a name="l00656"></a>00656 <span class="preprocessor">#else</span>
-<a name="l00657"></a>00657 <span class="preprocessor"></span> <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, k, ptr);
-<a name="l00658"></a>00658 <span class="preprocessor">#endif</span>
-<a name="l00659"></a>00659 <span class="preprocessor"></span> }
-<a name="l00660"></a>00660
-<a name="l00662"></a>00662
-<a name="l00664"></a><a class="code" href="a00276.html#4c52f2950bb1832886bd4458eb09d7eb">00664</a> reference operator[]( size_type index ) {
-<a name="l00665"></a>00665 <span class="keywordflow">return</span> internal_subscript(index);
-<a name="l00666"></a>00666 }
-<a name="l00667"></a>00667
-<a name="l00669"></a><a class="code" href="a00276.html#c6fade5c732cc95274d1d8277ea619d1">00669</a> const_reference operator[]( size_type index )<span class="keyword"> const </span>{
-<a name="l00670"></a>00670 <span class="keywordflow">return</span> internal_subscript(index);
-<a name="l00671"></a>00671 }
-<a name="l00672"></a>00672
-<a name="l00674"></a><a class="code" href="a00276.html#0c073ca43e787c7cbf7b0e26d2221748">00674</a> reference at( size_type index ) {
-<a name="l00675"></a>00675 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
-<a name="l00676"></a>00676 }
-<a name="l00677"></a>00677
-<a name="l00679"></a><a class="code" href="a00276.html#23e14a38af748edff96a7adc3a0f1c58">00679</a> const_reference at( size_type index )<span class="keyword"> const </span>{
-<a name="l00680"></a>00680 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
-<a name="l00681"></a>00681 }
-<a name="l00682"></a>00682
-<a name="l00684"></a><a class="code" href="a00276.html#a4c6ffff3bf08b92939aa2fc516edfba">00684</a> range_type range( size_t grainsize = 1 ) {
-<a name="l00685"></a>00685 <span class="keywordflow">return</span> range_type( begin(), end(), grainsize );
-<a name="l00686"></a>00686 }
-<a name="l00687"></a>00687
-<a name="l00689"></a><a class="code" href="a00276.html#3d09ccfb581b879ae64203741035e193">00689</a> const_range_type range( size_t grainsize = 1 )<span class="keyword"> const </span>{
-<a name="l00690"></a>00690 <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize );
-<a name="l00691"></a>00691 }
-<a name="l00692"></a>00692
-<a name="l00693"></a>00693 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00694"></a>00694 <span class="comment">// Capacity</span>
-<a name="l00695"></a>00695 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00697"></a><a class="code" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">00697</a> <span class="comment"></span> size_type size()<span class="keyword"> const </span>{
-<a name="l00698"></a>00698 size_type sz = my_early_size, cp = internal_capacity();
-<a name="l00699"></a>00699 <span class="keywordflow">return</span> cp < sz ? cp : sz;
-<a name="l00700"></a>00700 }
-<a name="l00701"></a>00701
-<a name="l00703"></a><a class="code" href="a00276.html#c6426cb93cf20d3af40f3c90f1f0481a">00703</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_early_size;}
-<a name="l00704"></a>00704
-<a name="l00706"></a><a class="code" href="a00276.html#3ed6b9ae7217af5103d974045b6f5cd5">00706</a> size_type capacity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_capacity();}
-<a name="l00707"></a>00707
-<a name="l00709"></a>00709
-<a name="l00711"></a><a class="code" href="a00276.html#5a0ce05026994b010018f72cfdeb72c1">00711</a> <span class="keywordtype">void</span> reserve( size_type n ) {
-<a name="l00712"></a>00712 <span class="keywordflow">if</span>( n )
-<a name="l00713"></a>00713 internal_reserve(n, <span class="keyword">sizeof</span>(T), max_size());
-<a name="l00714"></a>00714 }
-<a name="l00715"></a>00715
-<a name="l00717"></a><a class="code" href="a00276.html#8dfb0cb0eef96d440b4dcf801807a718">00717</a> <span class="keywordtype">void</span> resize( size_type n ) {
-<a name="l00718"></a>00718 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
-<a name="l00719"></a>00719 }
-<a name="l00720"></a>00720
-<a name="l00722"></a><a class="code" href="a00276.html#98ce6b2c6d2622f0c030b46dfac3880c">00722</a> <span class="keywordtype">void</span> resize( size_type n, const_reference t ) {
-<a name="l00723"></a>00723 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00724"></a>00724 }
-<a name="l00725"></a>00725
-<a name="l00726"></a>00726 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00728"></a><a class="code" href="a00276.html#1693d1da41b1a8235871be9c6633be35">00728</a> <span class="preprocessor"> void compact() {shrink_to_fit();}</span>
-<a name="l00729"></a>00729 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
-<a name="l00730"></a>00730
-<a name="l00732"></a>00732 <span class="keywordtype">void</span> shrink_to_fit();
-<a name="l00733"></a>00733
-<a name="l00735"></a><a class="code" href="a00276.html#2c248a017f0576df3e7cd99627836fd6">00735</a> size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(T);}
-<a name="l00736"></a>00736
-<a name="l00737"></a>00737 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00738"></a>00738 <span class="comment">// STL support</span>
-<a name="l00739"></a>00739 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00740"></a>00740
-<a name="l00742"></a><a class="code" href="a00276.html#730b23a251ecb6d37f692fb22f38e029">00742</a> iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0);}
-<a name="l00744"></a><a class="code" href="a00276.html#c0b51160e5a764982ec97a455f94f2c6">00744</a> iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,size());}
-<a name="l00746"></a><a class="code" href="a00276.html#78a06182276ff758788d4c0623ae0d71">00746</a> const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00748"></a><a class="code" href="a00276.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">00748</a> const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00750"></a><a class="code" href="a00276.html#f88fcf1c920693c39bd9709db33c199f">00750</a> const_iterator cbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00752"></a><a class="code" href="a00276.html#0c15a5d0f1cf75d687dabba07da1d46b">00752</a> const_iterator cend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00754"></a><a class="code" href="a00276.html#5e220926d09236d98f04fe0721e5f9a1">00754</a> reverse_iterator rbegin() {<span class="keywordflow">return</span> reverse_iterator(end());}
-<a name="l00756"></a><a class="code" href="a00276.html#290119a4eb43cd6a9e98fa17016ba3c2">00756</a> reverse_iterator rend() {<span class="keywordflow">return</span> reverse_iterator(begin());}
-<a name="l00758"></a><a class="code" href="a00276.html#9f9c103e18d5f212703805354074ad44">00758</a> const_reverse_iterator rbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00760"></a><a class="code" href="a00276.html#d438b9b32ea3a8ffb703015b6dce055b">00760</a> const_reverse_iterator rend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00762"></a><a class="code" href="a00276.html#db78a1d28c9c966050e8a2926d834a33">00762</a> const_reverse_iterator crbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00764"></a><a class="code" href="a00276.html#fff9cece89438587997ebedf93c5e962">00764</a> const_reverse_iterator crend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00766"></a><a class="code" href="a00276.html#15181759c0bfa2ddce5d10c7550e0002">00766</a> reference front() {
-<a name="l00767"></a>00767 __TBB_ASSERT( size()>0, NULL);
-<a name="l00768"></a>00768 <span class="keywordflow">return</span> static_cast<T*>(my_segment[0].array)[0];
-<a name="l00769"></a>00769 }
-<a name="l00771"></a><a class="code" href="a00276.html#502615a858eb9fa0390ee59169065e90">00771</a> const_reference front()<span class="keyword"> const </span>{
-<a name="l00772"></a>00772 __TBB_ASSERT( size()>0, NULL);
-<a name="l00773"></a>00773 <span class="keywordflow">return</span> static_cast<const T*>(my_segment[0].array)[0];
-<a name="l00774"></a>00774 }
-<a name="l00776"></a><a class="code" href="a00276.html#41ce48d6015a1a2812d41cf620ec3476">00776</a> reference back() {
-<a name="l00777"></a>00777 __TBB_ASSERT( size()>0, NULL);
-<a name="l00778"></a>00778 <span class="keywordflow">return</span> internal_subscript( size()-1 );
-<a name="l00779"></a>00779 }
-<a name="l00781"></a><a class="code" href="a00276.html#bd518e204107d07fd08d0ec5bdfd383d">00781</a> const_reference back()<span class="keyword"> const </span>{
-<a name="l00782"></a>00782 __TBB_ASSERT( size()>0, NULL);
-<a name="l00783"></a>00783 <span class="keywordflow">return</span> internal_subscript( size()-1 );
-<a name="l00784"></a>00784 }
-<a name="l00786"></a><a class="code" href="a00276.html#2fdba8e90de6a4d2300222236d46758e">00786</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00787"></a>00787
-<a name="l00789"></a><a class="code" href="a00276.html#423e5aa15e0e3309ad86d026fd85f6f6">00789</a> <span class="keywordtype">void</span> assign(size_type n, const_reference t) {
-<a name="l00790"></a>00790 clear();
-<a name="l00791"></a>00791 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00792"></a>00792 }
-<a name="l00793"></a>00793
-<a name="l00795"></a>00795 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00796"></a><a class="code" href="a00276.html#93a06b3112cb804f42f40efb5e7387b4">00796</a> <span class="keywordtype">void</span> assign(I first, I last) {
-<a name="l00797"></a>00797 clear(); internal_assign_range( first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
-<a name="l00798"></a>00798 }
-<a name="l00799"></a>00799
-<a name="l00801"></a><a class="code" href="a00276.html#96c9c4bd968ed3edb8dd276854d2dae0">00801</a> <span class="keywordtype">void</span> swap(<a class="code" href="a00276.html">concurrent_vector</a> &vector) {
-<a name="l00802"></a>00802 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector ) {
-<a name="l00803"></a>00803 concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));
-<a name="l00804"></a>00804 std::swap(this->my_allocator, vector.my_allocator);
-<a name="l00805"></a>00805 }
-<a name="l00806"></a>00806 }
-<a name="l00807"></a>00807
-<a name="l00809"></a>00809
-<a name="l00810"></a><a class="code" href="a00276.html#26f937a359a66b6aae904c3cd9a3c444">00810</a> <span class="keywordtype">void</span> clear() {
-<a name="l00811"></a>00811 internal_clear(&destroy_array);
-<a name="l00812"></a>00812 }
-<a name="l00813"></a>00813
-<a name="l00815"></a><a class="code" href="a00276.html#da2444b28bb840d38f60d0030333a5fc">00815</a> ~<a class="code" href="a00276.html">concurrent_vector</a>() {
-<a name="l00816"></a>00816 segment_t *table = my_segment;
-<a name="l00817"></a>00817 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00818"></a>00818 <span class="comment">// base class destructor call should be then</span>
-<a name="l00819"></a>00819 }
-<a name="l00820"></a>00820
-<a name="l00821"></a>00821 <span class="keyword">const</span> internal::concurrent_vector_base_v3 &internal_vector_base()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
-<a name="l00822"></a>00822 <span class="keyword">private</span>:
-<a name="l00824"></a>00824 <span class="keyword">static</span> <span class="keywordtype">void</span> *internal_allocator(internal::concurrent_vector_base_v3 &vb, size_t k) {
-<a name="l00825"></a>00825 <span class="keywordflow">return</span> static_cast<concurrent_vector<T, A>&>(vb).my_allocator.allocate(k);
-<a name="l00826"></a>00826 }
-<a name="l00828"></a>00828 <span class="keywordtype">void</span> internal_free_segments(<span class="keywordtype">void</span> *table[], segment_index_t k, segment_index_t first_block);
-<a name="l00829"></a>00829
-<a name="l00831"></a>00831 T& internal_subscript( size_type index ) <span class="keyword">const</span>;
-<a name="l00832"></a>00832
-<a name="l00834"></a>00834 T& internal_subscript_with_exceptions( size_type index ) <span class="keyword">const</span>;
-<a name="l00835"></a>00835
-<a name="l00837"></a>00837 <span class="keywordtype">void</span> internal_assign_n(size_type n, const_pointer p) {
-<a name="l00838"></a>00838 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(p), &destroy_array, p? &initialize_array_by : &initialize_array );
-<a name="l00839"></a>00839 }
-<a name="l00840"></a>00840
-<a name="l00842"></a>00842 <span class="keyword">template</span><<span class="keywordtype">bool</span> B> <span class="keyword">class </span>is_integer_tag;
-<a name="l00843"></a>00843
-<a name="l00845"></a>00845 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00846"></a>00846 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<true> *) {
-<a name="l00847"></a>00847 internal_assign_n(static_cast<size_type>(first), &static_cast<T&>(last));
-<a name="l00848"></a>00848 }
-<a name="l00850"></a>00850 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00851"></a>00851 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<false> *) {
-<a name="l00852"></a>00852 internal_assign_iterators(first, last);
-<a name="l00853"></a>00853 }
-<a name="l00855"></a>00855 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00856"></a>00856 <span class="keywordtype">void</span> internal_assign_iterators(I first, I last);
-<a name="l00857"></a>00857
-<a name="l00859"></a>00859 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC initialize_array( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span>*, size_type n );
-<a name="l00860"></a>00860
-<a name="l00862"></a>00862 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC initialize_array_by( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
-<a name="l00863"></a>00863
-<a name="l00865"></a>00865 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC copy_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
-<a name="l00866"></a>00866
-<a name="l00868"></a>00868 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC assign_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
-<a name="l00869"></a>00869
-<a name="l00871"></a>00871 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC destroy_array( <span class="keywordtype">void</span>* begin, size_type n );
-<a name="l00872"></a>00872
-<a name="l00874"></a>00874 <span class="keyword">class </span>internal_loop_guide : internal::no_copy {
-<a name="l00875"></a>00875 <span class="keyword">public</span>:
-<a name="l00876"></a>00876 <span class="keyword">const</span> pointer array;
-<a name="l00877"></a>00877 <span class="keyword">const</span> size_type n;
-<a name="l00878"></a>00878 size_type i;
-<a name="l00879"></a>00879 internal_loop_guide(size_type ntrials, <span class="keywordtype">void</span> *ptr)
-<a name="l00880"></a>00880 : array(static_cast<pointer>(ptr)), n(ntrials), i(0) {}
-<a name="l00881"></a>00881 <span class="keywordtype">void</span> init() { <span class="keywordflow">for</span>(; i < n; ++i) <span class="keyword">new</span>( &array[i] ) T(); }
-<a name="l00882"></a>00882 <span class="keywordtype">void</span> init(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) new( &array[i] ) T(*static_cast<const T*>(src)); }
-<a name="l00883"></a>00883 <span class="keywordtype">void</span> copy(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) new( &array[i] ) T(static_cast<const T*>(src)[i]); }
-<a name="l00884"></a>00884 <span class="keywordtype">void</span> assign(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) array[i] = static_cast<const T*>(src)[i]; }
-<a name="l00885"></a>00885 <span class="keyword">template</span><<span class="keyword">class</span> I> <span class="keywordtype">void</span> iterate(I &src) { <span class="keywordflow">for</span>(; i < n; ++i, ++src) <span class="keyword">new</span>( &array[i] ) T( *src ); }
-<a name="l00886"></a>00886 ~internal_loop_guide() {
-<a name="l00887"></a>00887 <span class="keywordflow">if</span>(i < n) <span class="comment">// if exception raised, do zeroing on the rest of items</span>
-<a name="l00888"></a>00888 std::memset(array+i, 0, (n-i)*<span class="keyword">sizeof</span>(value_type));
-<a name="l00889"></a>00889 }
-<a name="l00890"></a>00890 };
-<a name="l00891"></a>00891 };
-<a name="l00892"></a>00892
-<a name="l00893"></a>00893 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00894"></a>00894 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (push)</span>
-<a name="l00895"></a>00895 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (disable: 4701) // potentially uninitialized local variable "old"</span>
-<a name="l00896"></a>00896 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00897"></a>00897 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00898"></a><a class="code" href="a00276.html#03c6f4cf66532bf4cc907ee738a9a186">00898</a> <span class="keywordtype">void</span> <a class="code" href="a00276.html">concurrent_vector<T, A>::shrink_to_fit</a>() {
-<a name="l00899"></a>00899 internal_segments_table old;
-<a name="l00900"></a>00900 __TBB_TRY {
-<a name="l00901"></a>00901 <span class="keywordflow">if</span>( internal_compact( <span class="keyword">sizeof</span>(T), &old, &destroy_array, ©_array ) )
-<a name="l00902"></a>00902 internal_free_segments( old.table, pointers_per_long_table, old.first_block ); <span class="comment">// free joined and unnecessary segments</span>
-<a name="l00903"></a>00903 } __TBB_CATCH(...) {
-<a name="l00904"></a>00904 <span class="keywordflow">if</span>( old.first_block ) <span class="comment">// free segment allocated for compacting. Only for support of exceptions in ctor of user T[ype]</span>
-<a name="l00905"></a>00905 internal_free_segments( old.table, 1, old.first_block );
-<a name="l00906"></a>00906 __TBB_RETHROW();
-<a name="l00907"></a>00907 }
-<a name="l00908"></a>00908 }
-<a name="l00909"></a>00909 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00910"></a>00910 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (pop)</span>
-<a name="l00911"></a>00911 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4701 is back</span>
-<a name="l00912"></a>00912 <span class="preprocessor"></span>
-<a name="l00913"></a>00913 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00914"></a>00914 <span class="keywordtype">void</span> <a class="code" href="a00276.html">concurrent_vector<T, A>::internal_free_segments</a>(<span class="keywordtype">void</span> *table[], segment_index_t k, segment_index_t first_block) {
-<a name="l00915"></a>00915 <span class="comment">// Free the arrays</span>
-<a name="l00916"></a>00916 <span class="keywordflow">while</span>( k > first_block ) {
-<a name="l00917"></a>00917 --k;
-<a name="l00918"></a>00918 T* array = static_cast<T*>(table[k]);
-<a name="l00919"></a>00919 table[k] = NULL;
-<a name="l00920"></a>00920 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
-<a name="l00921"></a>00921 this->my_allocator.deallocate( array, segment_size(k) );
-<a name="l00922"></a>00922 }
-<a name="l00923"></a>00923 T* array = static_cast<T*>(table[0]);
-<a name="l00924"></a>00924 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) {
-<a name="l00925"></a>00925 __TBB_ASSERT( first_block > 0, NULL );
-<a name="l00926"></a>00926 <span class="keywordflow">while</span>(k > 0) table[--k] = NULL;
-<a name="l00927"></a>00927 this->my_allocator.deallocate( array, segment_size(first_block) );
-<a name="l00928"></a>00928 }
-<a name="l00929"></a>00929 }
-<a name="l00930"></a>00930
-<a name="l00931"></a>00931 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00932"></a>00932 T& concurrent_vector<T, A>::internal_subscript( size_type index )<span class="keyword"> const </span>{
-<a name="l00933"></a>00933 __TBB_ASSERT( index < my_early_size, <span class="stringliteral">"index out of bounds"</span> );
-<a name="l00934"></a>00934 size_type j = index;
-<a name="l00935"></a>00935 segment_index_t k = segment_base_index_of( j );
-<a name="l00936"></a>00936 __TBB_ASSERT( (segment_t*)my_segment != my_storage || k < pointers_per_short_table, <span class="stringliteral">"index is being allocated"</span> );
-<a name="l00937"></a>00937 <span class="comment">// no need in __TBB_load_with_acquire since thread works in own space or gets </span>
-<a name="l00938"></a>00938 T* array = static_cast<T*>( tbb::internal::itt_hide_load_word(my_segment[k].array));
-<a name="l00939"></a>00939 __TBB_ASSERT( array != internal::vector_allocation_error_flag, <span class="stringliteral">"the instance is broken by bad allocation. Use at() instead"</span> );
-<a name="l00940"></a>00940 __TBB_ASSERT( array, <span class="stringliteral">"index is being allocated"</span> );
-<a name="l00941"></a>00941 <span class="keywordflow">return</span> array[j];
-<a name="l00942"></a>00942 }
-<a name="l00943"></a>00943
-<a name="l00944"></a>00944 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00945"></a>00945 T& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index )<span class="keyword"> const </span>{
-<a name="l00946"></a>00946 <span class="keywordflow">if</span>( index >= my_early_size )
-<a name="l00947"></a>00947 internal::throw_exception(internal::eid_out_of_range); <span class="comment">// throw std::out_of_range</span>
-<a name="l00948"></a>00948 size_type j = index;
-<a name="l00949"></a>00949 segment_index_t k = segment_base_index_of( j );
-<a name="l00950"></a>00950 <span class="keywordflow">if</span>( (segment_t*)my_segment == my_storage && k >= pointers_per_short_table )
-<a name="l00951"></a>00951 internal::throw_exception(internal::eid_segment_range_error); <span class="comment">// throw std::range_error</span>
-<a name="l00952"></a>00952 <span class="keywordtype">void</span> *array = my_segment[k].array; <span class="comment">// no need in __TBB_load_with_acquire</span>
-<a name="l00953"></a>00953 <span class="keywordflow">if</span>( array <= internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
-<a name="l00954"></a>00954 internal::throw_exception(internal::eid_index_range_error); <span class="comment">// throw std::range_error</span>
-<a name="l00955"></a>00955 <span class="keywordflow">return</span> static_cast<T*>(array)[j];
-<a name="l00956"></a>00956 }
-<a name="l00957"></a>00957
-<a name="l00958"></a>00958 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A> <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00959"></a>00959 <span class="keywordtype">void</span> concurrent_vector<T, A>::internal_assign_iterators(I first, I last) {
-<a name="l00960"></a>00960 __TBB_ASSERT(my_early_size == 0, NULL);
-<a name="l00961"></a>00961 size_type n = std::distance(first, last);
-<a name="l00962"></a>00962 <span class="keywordflow">if</span>( !n ) <span class="keywordflow">return</span>;
-<a name="l00963"></a>00963 internal_reserve(n, <span class="keyword">sizeof</span>(T), <a class="code" href="a00276.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>());
-<a name="l00964"></a>00964 my_early_size = n;
-<a name="l00965"></a>00965 segment_index_t k = 0;
-<a name="l00966"></a>00966 size_type sz = segment_size( my_first_block );
-<a name="l00967"></a>00967 <span class="keywordflow">while</span>( sz < n ) {
-<a name="l00968"></a>00968 internal_loop_guide loop(sz, my_segment[k].array);
-<a name="l00969"></a>00969 loop.iterate(first);
-<a name="l00970"></a>00970 n -= sz;
-<a name="l00971"></a>00971 <span class="keywordflow">if</span>( !k ) k = my_first_block;
-<a name="l00972"></a>00972 <span class="keywordflow">else</span> { ++k; sz <<= 1; }
-<a name="l00973"></a>00973 }
-<a name="l00974"></a>00974 internal_loop_guide loop(n, my_segment[k].array);
-<a name="l00975"></a>00975 loop.iterate(first);
-<a name="l00976"></a>00976 }
-<a name="l00977"></a>00977
-<a name="l00978"></a>00978 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00979"></a>00979 <span class="keywordtype">void</span> concurrent_vector<T, A>::initialize_array( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span> *, size_type n ) {
-<a name="l00980"></a>00980 internal_loop_guide loop(n, begin); loop.init();
-<a name="l00981"></a>00981 }
-<a name="l00982"></a>00982
-<a name="l00983"></a>00983 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00984"></a>00984 <span class="keywordtype">void</span> concurrent_vector<T, A>::initialize_array_by( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span> *src, size_type n ) {
-<a name="l00985"></a>00985 internal_loop_guide loop(n, begin); loop.init(src);
-<a name="l00986"></a>00986 }
-<a name="l00987"></a>00987
-<a name="l00988"></a>00988 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00989"></a>00989 <span class="keywordtype">void</span> concurrent_vector<T, A>::copy_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n ) {
-<a name="l00990"></a>00990 internal_loop_guide loop(n, dst); loop.copy(src);
-<a name="l00991"></a>00991 }
-<a name="l00992"></a>00992
-<a name="l00993"></a>00993 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00994"></a>00994 <span class="keywordtype">void</span> concurrent_vector<T, A>::assign_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n ) {
-<a name="l00995"></a>00995 internal_loop_guide loop(n, dst); loop.assign(src);
-<a name="l00996"></a>00996 }
-<a name="l00997"></a>00997
-<a name="l00998"></a>00998 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00999"></a>00999 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warning</span>
-<a name="l01000"></a>01000 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l01001"></a>01001 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4189)</span>
-<a name="l01002"></a>01002 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l01003"></a>01003 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l01004"></a>01004 <span class="keywordtype">void</span> concurrent_vector<T, A>::destroy_array( <span class="keywordtype">void</span>* begin, size_type n ) {
-<a name="l01005"></a>01005 T* array = static_cast<T*>(begin);
-<a name="l01006"></a>01006 <span class="keywordflow">for</span>( size_type j=n; j>0; --j )
-<a name="l01007"></a>01007 array[j-1].~T(); <span class="comment">// destructors are supposed to not throw any exceptions</span>
-<a name="l01008"></a>01008 }
-<a name="l01009"></a>01009 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l01010"></a>01010 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l01011"></a>01011 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4189 is back</span>
-<a name="l01012"></a>01012 <span class="preprocessor"></span>
-<a name="l01013"></a>01013 <span class="comment">// concurrent_vector's template functions</span>
-<a name="l01014"></a>01014 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01015"></a>01015 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b) {
-<a name="l01016"></a>01016 <span class="comment">// Simply: return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());</span>
-<a name="l01017"></a>01017 <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01018"></a>01018 <span class="keyword">typename</span> concurrent_vector<T, A1>::const_iterator i(a.begin());
-<a name="l01019"></a>01019 <span class="keyword">typename</span> concurrent_vector<T, A2>::const_iterator j(b.begin());
-<a name="l01020"></a>01020 <span class="keywordflow">for</span>(; i != a.end(); ++i, ++j)
-<a name="l01021"></a>01021 <span class="keywordflow">if</span>( !(*i == *j) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01022"></a>01022 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01023"></a>01023 }
-<a name="l01024"></a>01024
-<a name="l01025"></a>01025 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01026"></a>01026 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01027"></a>01027 { <span class="keywordflow">return</span> !(a == b); }
-<a name="l01028"></a>01028
-<a name="l01029"></a>01029 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01030"></a>01030 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<(const concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01031"></a>01031 { <span class="keywordflow">return</span> (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())); }
-<a name="l01032"></a>01032
-<a name="l01033"></a>01033 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01034"></a>01034 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01035"></a>01035 { <span class="keywordflow">return</span> b < a; }
-<a name="l01036"></a>01036
-<a name="l01037"></a>01037 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01038"></a>01038 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<=(const concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01039"></a>01039 { <span class="keywordflow">return</span> !(b < a); }
-<a name="l01040"></a>01040
-<a name="l01041"></a>01041 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01042"></a>01042 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>=(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01043"></a>01043 { <span class="keywordflow">return</span> !(a < b); }
-<a name="l01044"></a>01044
-<a name="l01045"></a>01045 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l01046"></a>01046 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_vector<T, A> &a, concurrent_vector<T, A> &b)
-<a name="l01047"></a>01047 { a.swap( b ); }
-<a name="l01048"></a>01048
-<a name="l01049"></a>01049 } <span class="comment">// namespace tbb</span>
-<a name="l01050"></a>01050
-<a name="l01051"></a>01051 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
-<a name="l01052"></a>01052 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l01053"></a>01053 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4267 is back</span>
-<a name="l01054"></a>01054 <span class="preprocessor"></span>
-<a name="l01055"></a>01055 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_vector_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00496.html b/doc/html/a00496.html
deleted file mode 100644
index 1fd5d87..0000000
--- a/doc/html/a00496.html
+++ /dev/null
@@ -1,163 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>critical_section.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>critical_section.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef _TBB_CRITICAL_SECTION_H_</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define _TBB_CRITICAL_SECTION_H_</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#else</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include <errno.h></span>
-<a name="l00029"></a>00029 <span class="preprocessor">#endif // _WIN32||WIN64</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "tbb_thread.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00036"></a>00036
-<a name="l00037"></a>00037 <span class="keyword">namespace </span>tbb {
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">namespace </span>internal {
-<a name="l00040"></a>00040 <span class="keyword">class </span>critical_section_v4 : internal::no_copy {
-<a name="l00041"></a>00041 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span> CRITICAL_SECTION my_impl;
-<a name="l00043"></a>00043 <span class="preprocessor">#else</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span> pthread_mutex_t my_impl;
-<a name="l00045"></a>00045 <span class="preprocessor">#endif</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span> tbb_thread::id my_tid;
-<a name="l00047"></a>00047 <span class="keyword">public</span>:
-<a name="l00048"></a>00048
-<a name="l00049"></a>00049 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00050"></a>00050
-<a name="l00051"></a>00051 critical_section_v4() {
-<a name="l00052"></a>00052 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span> InitializeCriticalSection(&my_impl);
-<a name="l00054"></a>00054 <span class="preprocessor">#else</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span> pthread_mutex_init(&my_impl, NULL);
-<a name="l00056"></a>00056 <span class="preprocessor">#endif</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span> internal_construct();
-<a name="l00058"></a>00058 }
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 ~critical_section_v4() {
-<a name="l00061"></a>00061 __TBB_ASSERT(my_tid == tbb_thread::id(), <span class="stringliteral">"Destroying a still-held critical section"</span>);
-<a name="l00062"></a>00062 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span> DeleteCriticalSection(&my_impl);
-<a name="l00064"></a>00064 <span class="preprocessor">#else</span>
-<a name="l00065"></a>00065 <span class="preprocessor"></span> pthread_mutex_destroy(&my_impl);
-<a name="l00066"></a>00066 <span class="preprocessor">#endif</span>
-<a name="l00067"></a>00067 <span class="preprocessor"></span> }
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <span class="keyword">class </span>scoped_lock : internal::no_copy {
-<a name="l00070"></a>00070 <span class="keyword">private</span>:
-<a name="l00071"></a>00071 critical_section_v4 &my_crit;
-<a name="l00072"></a>00072 <span class="keyword">public</span>:
-<a name="l00073"></a>00073 scoped_lock( critical_section_v4& lock_me) :my_crit(lock_me) {
-<a name="l00074"></a>00074 my_crit.lock();
-<a name="l00075"></a>00075 }
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 ~scoped_lock() {
-<a name="l00078"></a>00078 my_crit.unlock();
-<a name="l00079"></a>00079 }
-<a name="l00080"></a>00080 };
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 <span class="keywordtype">void</span> lock() {
-<a name="l00083"></a>00083 tbb_thread::id local_tid = this_tbb_thread::get_id();
-<a name="l00084"></a>00084 <span class="keywordflow">if</span>(local_tid == my_tid) throw_exception( eid_improper_lock );
-<a name="l00085"></a>00085 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00086"></a>00086 <span class="preprocessor"></span> EnterCriticalSection( &my_impl );
-<a name="l00087"></a>00087 <span class="preprocessor">#else</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span> <span class="keywordtype">int</span> rval = pthread_mutex_lock(&my_impl);
-<a name="l00089"></a>00089 __TBB_ASSERT_EX(!rval, <span class="stringliteral">"critical_section::lock: pthread_mutex_lock failed"</span>);
-<a name="l00090"></a>00090 <span class="preprocessor">#endif</span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span> __TBB_ASSERT(my_tid == tbb_thread::id(), NULL);
-<a name="l00092"></a>00092 my_tid = local_tid;
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <span class="keywordtype">bool</span> try_lock() {
-<a name="l00096"></a>00096 <span class="keywordtype">bool</span> gotlock;
-<a name="l00097"></a>00097 tbb_thread::id local_tid = this_tbb_thread::get_id();
-<a name="l00098"></a>00098 <span class="keywordflow">if</span>(local_tid == my_tid) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00099"></a>00099 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span> gotlock = TryEnterCriticalSection( &my_impl ) != 0;
-<a name="l00101"></a>00101 <span class="preprocessor">#else</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span> <span class="keywordtype">int</span> rval = pthread_mutex_trylock(&my_impl);
-<a name="l00103"></a>00103 <span class="comment">// valid returns are 0 (locked) and [EBUSY]</span>
-<a name="l00104"></a>00104 __TBB_ASSERT(rval == 0 || rval == EBUSY, <span class="stringliteral">"critical_section::trylock: pthread_mutex_trylock failed"</span>);
-<a name="l00105"></a>00105 gotlock = rval == 0;
-<a name="l00106"></a>00106 <span class="preprocessor">#endif</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span> <span class="keywordflow">if</span>(gotlock) {
-<a name="l00108"></a>00108 my_tid = local_tid;
-<a name="l00109"></a>00109 }
-<a name="l00110"></a>00110 <span class="keywordflow">return</span> gotlock;
-<a name="l00111"></a>00111 }
-<a name="l00112"></a>00112
-<a name="l00113"></a>00113 <span class="keywordtype">void</span> unlock() {
-<a name="l00114"></a>00114 __TBB_ASSERT(this_tbb_thread::get_id() == my_tid, <span class="stringliteral">"thread unlocking critical_section is not thread that locked it"</span>);
-<a name="l00115"></a>00115 my_tid = tbb_thread::id();
-<a name="l00116"></a>00116 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span> LeaveCriticalSection( &my_impl );
-<a name="l00118"></a>00118 <span class="preprocessor">#else</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span> <span class="keywordtype">int</span> rval = pthread_mutex_unlock(&my_impl);
-<a name="l00120"></a>00120 __TBB_ASSERT_EX(!rval, <span class="stringliteral">"critical_section::unlock: pthread_mutex_unlock failed"</span>);
-<a name="l00121"></a>00121 <span class="preprocessor">#endif</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span> }
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00125"></a>00125 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00126"></a>00126 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00127"></a>00127 }; <span class="comment">// critical_section_v4</span>
-<a name="l00128"></a>00128 } <span class="comment">// namespace internal</span>
-<a name="l00129"></a>00129 <span class="keyword">typedef</span> internal::critical_section_v4 critical_section;
-<a name="l00130"></a>00130
-<a name="l00131"></a>00131 __TBB_DEFINE_PROFILING_SET_NAME(critical_section)
-<a name="l00132"></a>00132 } <span class="comment">// namespace tbb</span>
-<a name="l00133"></a>00133 <span class="preprocessor">#endif // _TBB_CRITICAL_SECTION_H_</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00499.html b/doc/html/a00499.html
deleted file mode 100644
index a5f13ac..0000000
--- a/doc/html/a00499.html
+++ /dev/null
@@ -1,964 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>enumerable_thread_specific.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>enumerable_thread_specific.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_enumerable_thread_specific_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_enumerable_thread_specific_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "concurrent_vector.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_thread.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include <string.h></span> <span class="comment">// for memcpy</span>
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#else</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00035"></a>00035 <span class="preprocessor">#endif</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span>
-<a name="l00037"></a>00037 <span class="keyword">namespace </span>tbb {
-<a name="l00038"></a>00038
-<a name="l00040"></a><a class="code" href="a00414.html#a8622ae61b7e7737dac26542e181178e">00040</a> <span class="keyword">enum</span> <a class="code" href="a00414.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { ets_key_per_instance, ets_no_key };
-<a name="l00041"></a>00041
-<a name="l00042"></a>00042 <span class="keyword">namespace </span>interface6 {
-<a name="l00043"></a>00043
-<a name="l00045"></a>00045 <span class="keyword">namespace </span>internal {
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00048"></a>00048 <span class="keyword">class </span>ets_base: tbb::internal::no_copy {
-<a name="l00049"></a>00049 <span class="keyword">protected</span>:
-<a name="l00050"></a>00050 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD key_type;
-<a name="l00052"></a>00052 <span class="preprocessor">#else</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_t key_type;
-<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_PROTECTED_NESTED_CLASS_BROKEN</span>
-<a name="l00056"></a>00056 <span class="preprocessor"></span> <span class="keyword">public</span>:
-<a name="l00057"></a>00057 <span class="preprocessor">#endif</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span> <span class="keyword">struct </span>slot;
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="keyword">struct </span>array {
-<a name="l00061"></a>00061 array* next;
-<a name="l00062"></a>00062 size_t lg_size;
-<a name="l00063"></a>00063 slot& at( size_t k ) {
-<a name="l00064"></a>00064 <span class="keywordflow">return</span> ((slot*)(<span class="keywordtype">void</span>*)(<span class="keyword">this</span>+1))[k];
-<a name="l00065"></a>00065 }
-<a name="l00066"></a>00066 size_t size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (size_t)1<<lg_size;}
-<a name="l00067"></a>00067 size_t mask()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size()-1;}
-<a name="l00068"></a>00068 size_t start( size_t h )<span class="keyword"> const </span>{
-<a name="l00069"></a>00069 <span class="keywordflow">return</span> h>>(8*<span class="keyword">sizeof</span>(size_t)-lg_size);
-<a name="l00070"></a>00070 }
-<a name="l00071"></a>00071 };
-<a name="l00072"></a>00072 <span class="keyword">struct </span>slot {
-<a name="l00073"></a>00073 key_type key;
-<a name="l00074"></a>00074 <span class="keywordtype">void</span>* ptr;
-<a name="l00075"></a>00075 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !key;}
-<a name="l00076"></a>00076 <span class="keywordtype">bool</span> match( key_type k )<span class="keyword"> const </span>{<span class="keywordflow">return</span> key==k;}
-<a name="l00077"></a>00077 <span class="keywordtype">bool</span> claim( key_type k ) {
-<a name="l00078"></a>00078 __TBB_ASSERT(<span class="keyword">sizeof</span>(<a class="code" href="a00254.html">tbb::atomic<key_type></a>)==<span class="keyword">sizeof</span>(key_type), NULL);
-<a name="l00079"></a>00079 <span class="keywordflow">return</span> tbb::internal::punned_cast<tbb::atomic<key_type>*>(&key)->compare_and_swap(k,0)==0;
-<a name="l00080"></a>00080 }
-<a name="l00081"></a>00081 };
-<a name="l00082"></a>00082 <span class="preprocessor">#if __TBB_PROTECTED_NESTED_CLASS_BROKEN</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span> <span class="keyword">protected</span>:
-<a name="l00084"></a>00084 <span class="preprocessor">#endif</span>
-<a name="l00085"></a>00085 <span class="preprocessor"></span>
-<a name="l00086"></a>00086 <span class="keyword">static</span> key_type key_of_current_thread() {
-<a name="l00087"></a>00087 tbb::tbb_thread::id <span class="keywordtype">id</span> = tbb::this_tbb_thread::get_id();
-<a name="l00088"></a>00088 key_type k;
-<a name="l00089"></a>00089 memcpy( &k, &<span class="keywordtype">id</span>, <span class="keyword">sizeof</span>(k) );
-<a name="l00090"></a>00090 <span class="keywordflow">return</span> k;
-<a name="l00091"></a>00091 }
-<a name="l00092"></a>00092
-<a name="l00094"></a>00094
-<a name="l00096"></a>00096 atomic<array*> my_root;
-<a name="l00097"></a>00097 atomic<size_t> my_count;
-<a name="l00098"></a>00098 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
-<a name="l00099"></a>00099 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0; <span class="comment">// _size in bytes</span>
-<a name="l00100"></a>00100 <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// _size in bytes</span>
-<a name="l00101"></a>00101 array* allocate( size_t lg_size ) {
-<a name="l00102"></a>00102 size_t n = 1<<lg_size;
-<a name="l00103"></a>00103 array* a = static_cast<array*>(create_array( <span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot) ));
-<a name="l00104"></a>00104 a->lg_size = lg_size;
-<a name="l00105"></a>00105 std::memset( a+1, 0, n*<span class="keyword">sizeof</span>(slot) );
-<a name="l00106"></a>00106 <span class="keywordflow">return</span> a;
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108 <span class="keywordtype">void</span> free(array* a) {
-<a name="l00109"></a>00109 size_t n = 1<<(a->lg_size);
-<a name="l00110"></a>00110 free_array( (<span class="keywordtype">void</span> *)a, size_t(<span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot)) );
-<a name="l00111"></a>00111 }
-<a name="l00112"></a>00112 <span class="keyword">static</span> size_t hash( key_type k ) {
-<a name="l00113"></a>00113 <span class="comment">// Multiplicative hashing. Client should use *upper* bits.</span>
-<a name="l00114"></a>00114 <span class="comment">// casts required for Mac gcc4.* compiler</span>
-<a name="l00115"></a>00115 <span class="keywordflow">return</span> uintptr_t(k)*tbb::internal::size_t_select(0x9E3779B9,0x9E3779B97F4A7C15ULL);
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117
-<a name="l00118"></a>00118 ets_base() {my_root=NULL; my_count=0;}
-<a name="l00119"></a>00119 <span class="keyword">virtual</span> ~ets_base(); <span class="comment">// g++ complains if this is not virtual...</span>
-<a name="l00120"></a>00120 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists );
-<a name="l00121"></a>00121 <span class="keywordtype">void</span> table_clear();
-<a name="l00122"></a>00122 slot& table_find( key_type k ) {
-<a name="l00123"></a>00123 size_t h = hash(k);
-<a name="l00124"></a>00124 array* r = my_root;
-<a name="l00125"></a>00125 size_t mask = r->mask();
-<a name="l00126"></a>00126 <span class="keywordflow">for</span>(size_t i = r->start(h);;i=(i+1)&mask) {
-<a name="l00127"></a>00127 slot& s = r->at(i);
-<a name="l00128"></a>00128 <span class="keywordflow">if</span>( s.empty() || s.match(k) )
-<a name="l00129"></a>00129 <span class="keywordflow">return</span> s;
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131 }
-<a name="l00132"></a>00132 <span class="keywordtype">void</span> table_reserve_for_copy( <span class="keyword">const</span> ets_base& other ) {
-<a name="l00133"></a>00133 __TBB_ASSERT(!my_root,NULL);
-<a name="l00134"></a>00134 __TBB_ASSERT(!my_count,NULL);
-<a name="l00135"></a>00135 <span class="keywordflow">if</span>( other.my_root ) {
-<a name="l00136"></a>00136 array* a = allocate(other.my_root->lg_size);
-<a name="l00137"></a>00137 a->next = NULL;
-<a name="l00138"></a>00138 my_root = a;
-<a name="l00139"></a>00139 my_count = other.my_count;
-<a name="l00140"></a>00140 }
-<a name="l00141"></a>00141 }
-<a name="l00142"></a>00142 };
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00145"></a>00145 ets_base<ETS_key_type>::~ets_base() {
-<a name="l00146"></a>00146 __TBB_ASSERT(!my_root, NULL);
-<a name="l00147"></a>00147 }
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00150"></a>00150 <span class="keywordtype">void</span> ets_base<ETS_key_type>::table_clear() {
-<a name="l00151"></a>00151 <span class="keywordflow">while</span>( array* r = my_root ) {
-<a name="l00152"></a>00152 my_root = r->next;
-<a name="l00153"></a>00153 free(r);
-<a name="l00154"></a>00154 }
-<a name="l00155"></a>00155 my_count = 0;
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00159"></a>00159 <span class="keywordtype">void</span>* ets_base<ETS_key_type>::table_lookup( <span class="keywordtype">bool</span>& exists ) {
-<a name="l00160"></a>00160 <span class="keyword">const</span> key_type k = key_of_current_thread();
-<a name="l00161"></a>00161
-<a name="l00162"></a>00162 __TBB_ASSERT(k!=0,NULL);
-<a name="l00163"></a>00163 <span class="keywordtype">void</span>* found;
-<a name="l00164"></a>00164 size_t h = hash(k);
-<a name="l00165"></a>00165 <span class="keywordflow">for</span>( array* r=my_root; r; r=r->next ) {
-<a name="l00166"></a>00166 size_t mask=r->mask();
-<a name="l00167"></a>00167 <span class="keywordflow">for</span>(size_t i = r->start(h); ;i=(i+1)&mask) {
-<a name="l00168"></a>00168 slot& s = r->at(i);
-<a name="l00169"></a>00169 <span class="keywordflow">if</span>( s.empty() ) <span class="keywordflow">break</span>;
-<a name="l00170"></a>00170 <span class="keywordflow">if</span>( s.match(k) ) {
-<a name="l00171"></a>00171 <span class="keywordflow">if</span>( r==my_root ) {
-<a name="l00172"></a>00172 <span class="comment">// Success at top level</span>
-<a name="l00173"></a>00173 exists = <span class="keyword">true</span>;
-<a name="l00174"></a>00174 <span class="keywordflow">return</span> s.ptr;
-<a name="l00175"></a>00175 } <span class="keywordflow">else</span> {
-<a name="l00176"></a>00176 <span class="comment">// Success at some other level. Need to insert at top level.</span>
-<a name="l00177"></a>00177 exists = <span class="keyword">true</span>;
-<a name="l00178"></a>00178 found = s.ptr;
-<a name="l00179"></a>00179 <span class="keywordflow">goto</span> insert;
-<a name="l00180"></a>00180 }
-<a name="l00181"></a>00181 }
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183 }
-<a name="l00184"></a>00184 <span class="comment">// Key does not yet exist</span>
-<a name="l00185"></a>00185 exists = <span class="keyword">false</span>;
-<a name="l00186"></a>00186 found = create_local();
-<a name="l00187"></a>00187 {
-<a name="l00188"></a>00188 size_t c = ++my_count;
-<a name="l00189"></a>00189 array* r = my_root;
-<a name="l00190"></a>00190 <span class="keywordflow">if</span>( !r || c>r->size()/2 ) {
-<a name="l00191"></a>00191 size_t s = r ? r->lg_size : 2;
-<a name="l00192"></a>00192 <span class="keywordflow">while</span>( c>size_t(1)<<(s-1) ) ++s;
-<a name="l00193"></a>00193 array* a = allocate(s);
-<a name="l00194"></a>00194 <span class="keywordflow">for</span>(;;) {
-<a name="l00195"></a>00195 a->next = my_root;
-<a name="l00196"></a>00196 array* new_r = my_root.compare_and_swap(a,r);
-<a name="l00197"></a>00197 <span class="keywordflow">if</span>( new_r==r ) <span class="keywordflow">break</span>;
-<a name="l00198"></a>00198 <span class="keywordflow">if</span>( new_r->lg_size>=s ) {
-<a name="l00199"></a>00199 <span class="comment">// Another thread inserted an equal or bigger array, so our array is superfluous.</span>
-<a name="l00200"></a>00200 free(a);
-<a name="l00201"></a>00201 <span class="keywordflow">break</span>;
-<a name="l00202"></a>00202 }
-<a name="l00203"></a>00203 r = new_r;
-<a name="l00204"></a>00204 }
-<a name="l00205"></a>00205 }
-<a name="l00206"></a>00206 }
-<a name="l00207"></a>00207 insert:
-<a name="l00208"></a>00208 <span class="comment">// Guaranteed to be room for it, and it is not present, so search for empty slot and grab it.</span>
-<a name="l00209"></a>00209 array* ir = my_root;
-<a name="l00210"></a>00210 size_t mask = ir->mask();
-<a name="l00211"></a>00211 <span class="keywordflow">for</span>(size_t i = ir->start(h);;i=(i+1)&mask) {
-<a name="l00212"></a>00212 slot& s = ir->at(i);
-<a name="l00213"></a>00213 <span class="keywordflow">if</span>( s.empty() ) {
-<a name="l00214"></a>00214 <span class="keywordflow">if</span>( s.claim(k) ) {
-<a name="l00215"></a>00215 s.ptr = found;
-<a name="l00216"></a>00216 <span class="keywordflow">return</span> found;
-<a name="l00217"></a>00217 }
-<a name="l00218"></a>00218 }
-<a name="l00219"></a>00219 }
-<a name="l00220"></a>00220 }
-<a name="l00221"></a>00221
-<a name="l00223"></a>00223 <span class="keyword">template</span> <>
-<a name="l00224"></a>00224 <span class="keyword">class </span>ets_base<ets_key_per_instance>: <span class="keyword">protected</span> ets_base<ets_no_key> {
-<a name="l00225"></a>00225 <span class="keyword">typedef</span> ets_base<ets_no_key> super;
-<a name="l00226"></a>00226 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD tls_key_t;
-<a name="l00228"></a>00228 <span class="keywordtype">void</span> create_key() { my_key = TlsAlloc(); }
-<a name="l00229"></a>00229 <span class="keywordtype">void</span> destroy_key() { TlsFree(my_key); }
-<a name="l00230"></a>00230 <span class="keywordtype">void</span> set_tls(<span class="keywordtype">void</span> * value) { TlsSetValue(my_key, (LPVOID)value); }
-<a name="l00231"></a>00231 <span class="keywordtype">void</span>* get_tls() { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)TlsGetValue(my_key); }
-<a name="l00232"></a>00232 <span class="preprocessor">#else</span>
-<a name="l00233"></a>00233 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_key_t tls_key_t;
-<a name="l00234"></a>00234 <span class="keywordtype">void</span> create_key() { pthread_key_create(&my_key, NULL); }
-<a name="l00235"></a>00235 <span class="keywordtype">void</span> destroy_key() { pthread_key_delete(my_key); }
-<a name="l00236"></a>00236 <span class="keywordtype">void</span> set_tls( <span class="keywordtype">void</span> * value )<span class="keyword"> const </span>{ pthread_setspecific(my_key, value); }
-<a name="l00237"></a>00237 <span class="keywordtype">void</span>* get_tls()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pthread_getspecific(my_key); }
-<a name="l00238"></a>00238 <span class="preprocessor">#endif</span>
-<a name="l00239"></a>00239 <span class="preprocessor"></span> tls_key_t my_key;
-<a name="l00240"></a>00240 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
-<a name="l00241"></a>00241 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0; <span class="comment">// _size in bytes</span>
-<a name="l00242"></a>00242 <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// size in bytes</span>
-<a name="l00243"></a>00243 <span class="keyword">public</span>:
-<a name="l00244"></a>00244 ets_base() {create_key();}
-<a name="l00245"></a>00245 ~ets_base() {destroy_key();}
-<a name="l00246"></a>00246 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists ) {
-<a name="l00247"></a>00247 <span class="keywordtype">void</span>* found = get_tls();
-<a name="l00248"></a>00248 <span class="keywordflow">if</span>( found ) {
-<a name="l00249"></a>00249 exists=<span class="keyword">true</span>;
-<a name="l00250"></a>00250 } <span class="keywordflow">else</span> {
-<a name="l00251"></a>00251 found = super::table_lookup(exists);
-<a name="l00252"></a>00252 set_tls(found);
-<a name="l00253"></a>00253 }
-<a name="l00254"></a>00254 <span class="keywordflow">return</span> found;
-<a name="l00255"></a>00255 }
-<a name="l00256"></a>00256 <span class="keywordtype">void</span> table_clear() {
-<a name="l00257"></a>00257 destroy_key();
-<a name="l00258"></a>00258 create_key();
-<a name="l00259"></a>00259 super::table_clear();
-<a name="l00260"></a>00260 }
-<a name="l00261"></a>00261 };
-<a name="l00262"></a>00262
-<a name="l00264"></a>00264 <span class="keyword">template</span>< <span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value >
-<a name="l00265"></a>00265 <span class="keyword">class </span>enumerable_thread_specific_iterator
-<a name="l00266"></a>00266 #if defined(_WIN64) && defined(_MSC_VER)
-<a name="l00267"></a>00267 <span class="comment">// Ensure that Microsoft's internal template function _Val_type works correctly.</span>
-<a name="l00268"></a>00268 : public std::iterator<std::random_access_iterator_tag,Value>
-<a name="l00269"></a>00269 #endif <span class="comment">/* defined(_WIN64) && defined(_MSC_VER) */</span>
-<a name="l00270"></a>00270 {
-<a name="l00272"></a>00272
-<a name="l00273"></a>00273 Container *my_container;
-<a name="l00274"></a>00274 <span class="keyword">typename</span> Container::size_type my_index;
-<a name="l00275"></a>00275 <span class="keyword">mutable</span> Value *my_value;
-<a name="l00276"></a>00276
-<a name="l00277"></a>00277 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
-<a name="l00278"></a>00278 <span class="keyword">friend</span> enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,
-<a name="l00279"></a>00279 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& v );
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00282"></a>00282 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i,
-<a name="l00283"></a>00283 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00284"></a>00284
-<a name="l00285"></a>00285 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00286"></a>00286 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<C,T>& i,
-<a name="l00287"></a>00287 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00288"></a>00288
-<a name="l00289"></a>00289 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00290"></a>00290 <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i, <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00291"></a>00291
-<a name="l00292"></a>00292 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00293"></a>00293 <span class="keyword">friend</span> <span class="keyword">class </span>enumerable_thread_specific_iterator;
-<a name="l00294"></a>00294
-<a name="l00295"></a>00295 <span class="keyword">public</span>:
-<a name="l00296"></a>00296
-<a name="l00297"></a>00297 enumerable_thread_specific_iterator( <span class="keyword">const</span> Container &container, <span class="keyword">typename</span> Container::size_type index ) :
-<a name="l00298"></a>00298 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
-<a name="l00299"></a>00299
-<a name="l00301"></a>00301 enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
-<a name="l00302"></a>00302
-<a name="l00303"></a>00303 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00304"></a>00304 enumerable_thread_specific_iterator( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container, U>& other ) :
-<a name="l00305"></a>00305 my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
-<a name="l00306"></a>00306
-<a name="l00307"></a>00307 enumerable_thread_specific_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00308"></a>00308 <span class="keywordflow">return</span> enumerable_thread_specific_iterator(*my_container, my_index + offset);
-<a name="l00309"></a>00309 }
-<a name="l00310"></a>00310
-<a name="l00311"></a>00311 enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
-<a name="l00312"></a>00312 my_index += offset;
-<a name="l00313"></a>00313 my_value = NULL;
-<a name="l00314"></a>00314 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00315"></a>00315 }
-<a name="l00316"></a>00316
-<a name="l00317"></a>00317 enumerable_thread_specific_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00318"></a>00318 <span class="keywordflow">return</span> enumerable_thread_specific_iterator( *my_container, my_index-offset );
-<a name="l00319"></a>00319 }
-<a name="l00320"></a>00320
-<a name="l00321"></a>00321 enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
-<a name="l00322"></a>00322 my_index -= offset;
-<a name="l00323"></a>00323 my_value = NULL;
-<a name="l00324"></a>00324 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00325"></a>00325 }
-<a name="l00326"></a>00326
-<a name="l00327"></a>00327 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00328"></a>00328 Value* value = my_value;
-<a name="l00329"></a>00329 <span class="keywordflow">if</span>( !value ) {
-<a name="l00330"></a>00330 value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
-<a name="l00331"></a>00331 }
-<a name="l00332"></a>00332 __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), <span class="stringliteral">"corrupt cache"</span> );
-<a name="l00333"></a>00333 <span class="keywordflow">return</span> *value;
-<a name="l00334"></a>00334 }
-<a name="l00335"></a>00335
-<a name="l00336"></a>00336 Value& operator[]( ptrdiff_t k )<span class="keyword"> const </span>{
-<a name="l00337"></a>00337 <span class="keywordflow">return</span> (*my_container)[my_index + k].value;
-<a name="l00338"></a>00338 }
-<a name="l00339"></a>00339
-<a name="l00340"></a>00340 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00341"></a>00341
-<a name="l00342"></a>00342 enumerable_thread_specific_iterator& operator++() {
-<a name="l00343"></a>00343 ++my_index;
-<a name="l00344"></a>00344 my_value = NULL;
-<a name="l00345"></a>00345 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00346"></a>00346 }
-<a name="l00347"></a>00347
-<a name="l00348"></a>00348 enumerable_thread_specific_iterator& operator--() {
-<a name="l00349"></a>00349 --my_index;
-<a name="l00350"></a>00350 my_value = NULL;
-<a name="l00351"></a>00351 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00352"></a>00352 }
-<a name="l00353"></a>00353
-<a name="l00355"></a>00355 enumerable_thread_specific_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00356"></a>00356 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00357"></a>00357 ++my_index;
-<a name="l00358"></a>00358 my_value = NULL;
-<a name="l00359"></a>00359 <span class="keywordflow">return</span> result;
-<a name="l00360"></a>00360 }
-<a name="l00361"></a>00361
-<a name="l00363"></a>00363 enumerable_thread_specific_iterator operator--(<span class="keywordtype">int</span>) {
-<a name="l00364"></a>00364 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00365"></a>00365 --my_index;
-<a name="l00366"></a>00366 my_value = NULL;
-<a name="l00367"></a>00367 <span class="keywordflow">return</span> result;
-<a name="l00368"></a>00368 }
-<a name="l00369"></a>00369
-<a name="l00370"></a>00370 <span class="comment">// STL support</span>
-<a name="l00371"></a>00371 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00372"></a>00372 <span class="keyword">typedef</span> Value value_type;
-<a name="l00373"></a>00373 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00374"></a>00374 <span class="keyword">typedef</span> Value& reference;
-<a name="l00375"></a>00375 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
-<a name="l00376"></a>00376 };
-<a name="l00377"></a>00377
-<a name="l00378"></a>00378 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
-<a name="l00379"></a>00379 enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,
-<a name="l00380"></a>00380 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& v ) {
-<a name="l00381"></a>00381 <span class="keywordflow">return</span> enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
-<a name="l00382"></a>00382 }
-<a name="l00383"></a>00383
-<a name="l00384"></a>00384 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00385"></a>00385 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00386"></a>00386 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00387"></a>00387 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_container == j.my_container;
-<a name="l00388"></a>00388 }
-<a name="l00389"></a>00389
-<a name="l00390"></a>00390 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00391"></a>00391 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00392"></a>00392 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00393"></a>00393 <span class="keywordflow">return</span> !(i==j);
-<a name="l00394"></a>00394 }
-<a name="l00395"></a>00395
-<a name="l00396"></a>00396 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00397"></a>00397 <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00398"></a>00398 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00399"></a>00399 <span class="keywordflow">return</span> i.my_index<j.my_index;
-<a name="l00400"></a>00400 }
-<a name="l00401"></a>00401
-<a name="l00402"></a>00402 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00403"></a>00403 <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00404"></a>00404 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00405"></a>00405 <span class="keywordflow">return</span> j<i;
-<a name="l00406"></a>00406 }
-<a name="l00407"></a>00407
-<a name="l00408"></a>00408 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00409"></a>00409 <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00410"></a>00410 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00411"></a>00411 <span class="keywordflow">return</span> !(i<j);
-<a name="l00412"></a>00412 }
-<a name="l00413"></a>00413
-<a name="l00414"></a>00414 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00415"></a>00415 <span class="keywordtype">bool</span> operator<=( const enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00416"></a>00416 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00417"></a>00417 <span class="keywordflow">return</span> !(j<i);
-<a name="l00418"></a>00418 }
-<a name="l00419"></a>00419
-<a name="l00420"></a>00420 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00421"></a>00421 ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00422"></a>00422 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00423"></a>00423 <span class="keywordflow">return</span> i.my_index-j.my_index;
-<a name="l00424"></a>00424 }
-<a name="l00425"></a>00425
-<a name="l00426"></a>00426 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> Value >
-<a name="l00427"></a>00427 <span class="keyword">class </span>segmented_iterator
-<a name="l00428"></a>00428 #if defined(_WIN64) && defined(_MSC_VER)
-<a name="l00429"></a>00429 : public std::iterator<std::input_iterator_tag, Value>
-<a name="l00430"></a>00430 #endif
-<a name="l00431"></a>00431 {
-<a name="l00432"></a>00432 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00433"></a>00433 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
-<a name="l00434"></a>00434
-<a name="l00435"></a>00435 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00436"></a>00436 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
-<a name="l00437"></a>00437
-<a name="l00438"></a>00438 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00439"></a>00439 <span class="keyword">friend</span> <span class="keyword">class </span>segmented_iterator;
-<a name="l00440"></a>00440
-<a name="l00441"></a>00441 <span class="keyword">public</span>:
-<a name="l00442"></a>00442
-<a name="l00443"></a>00443 segmented_iterator() {my_segcont = NULL;}
-<a name="l00444"></a>00444
-<a name="l00445"></a>00445 segmented_iterator( <span class="keyword">const</span> SegmentedContainer& _segmented_container ) :
-<a name="l00446"></a>00446 my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
-<a name="l00447"></a>00447 outer_iter(my_segcont->end()) { }
-<a name="l00448"></a>00448
-<a name="l00449"></a>00449 ~segmented_iterator() {}
-<a name="l00450"></a>00450
-<a name="l00451"></a>00451 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::iterator outer_iterator;
-<a name="l00452"></a>00452 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::value_type InnerContainer;
-<a name="l00453"></a>00453 <span class="keyword">typedef</span> <span class="keyword">typename</span> InnerContainer::iterator inner_iterator;
-<a name="l00454"></a>00454
-<a name="l00455"></a>00455 <span class="comment">// STL support</span>
-<a name="l00456"></a>00456 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00457"></a>00457 <span class="keyword">typedef</span> Value value_type;
-<a name="l00458"></a>00458 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::size_type size_type;
-<a name="l00459"></a>00459 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00460"></a>00460 <span class="keyword">typedef</span> Value& reference;
-<a name="l00461"></a>00461 <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;
-<a name="l00462"></a>00462
-<a name="l00463"></a>00463 <span class="comment">// Copy Constructor</span>
-<a name="l00464"></a>00464 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00465"></a>00465 segmented_iterator(<span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) :
-<a name="l00466"></a>00466 my_segcont(other.my_segcont),
-<a name="l00467"></a>00467 outer_iter(other.outer_iter),
-<a name="l00468"></a>00468 <span class="comment">// can we assign a default-constructed iterator to inner if we're at the end?</span>
-<a name="l00469"></a>00469 inner_iter(other.inner_iter)
-<a name="l00470"></a>00470 {}
-<a name="l00471"></a>00471
-<a name="l00472"></a>00472 <span class="comment">// assignment</span>
-<a name="l00473"></a>00473 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00474"></a>00474 segmented_iterator& operator=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) {
-<a name="l00475"></a>00475 <span class="keywordflow">if</span>(<span class="keyword">this</span> != &other) {
-<a name="l00476"></a>00476 my_segcont = other.my_segcont;
-<a name="l00477"></a>00477 outer_iter = other.outer_iter;
-<a name="l00478"></a>00478 <span class="keywordflow">if</span>(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
-<a name="l00479"></a>00479 }
-<a name="l00480"></a>00480 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00481"></a>00481 }
-<a name="l00482"></a>00482
-<a name="l00483"></a>00483 <span class="comment">// allow assignment of outer iterator to segmented iterator. Once it is</span>
-<a name="l00484"></a>00484 <span class="comment">// assigned, move forward until a non-empty inner container is found or</span>
-<a name="l00485"></a>00485 <span class="comment">// the end of the outer container is reached.</span>
-<a name="l00486"></a>00486 segmented_iterator& operator=(<span class="keyword">const</span> outer_iterator& new_outer_iter) {
-<a name="l00487"></a>00487 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00488"></a>00488 <span class="comment">// check that this iterator points to something inside the segmented container</span>
-<a name="l00489"></a>00489 <span class="keywordflow">for</span>(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
-<a name="l00490"></a>00490 <span class="keywordflow">if</span>( !outer_iter->empty() ) {
-<a name="l00491"></a>00491 inner_iter = outer_iter->begin();
-<a name="l00492"></a>00492 <span class="keywordflow">break</span>;
-<a name="l00493"></a>00493 }
-<a name="l00494"></a>00494 }
-<a name="l00495"></a>00495 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00496"></a>00496 }
-<a name="l00497"></a>00497
-<a name="l00498"></a>00498 <span class="comment">// pre-increment</span>
-<a name="l00499"></a>00499 segmented_iterator& operator++() {
-<a name="l00500"></a>00500 advance_me();
-<a name="l00501"></a>00501 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00502"></a>00502 }
-<a name="l00503"></a>00503
-<a name="l00504"></a>00504 <span class="comment">// post-increment</span>
-<a name="l00505"></a>00505 segmented_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00506"></a>00506 segmented_iterator tmp = *<span class="keyword">this</span>;
-<a name="l00507"></a>00507 operator++();
-<a name="l00508"></a>00508 <span class="keywordflow">return</span> tmp;
-<a name="l00509"></a>00509 }
-<a name="l00510"></a>00510
-<a name="l00511"></a>00511 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00512"></a>00512 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00513"></a>00513 <span class="keywordflow">return</span> (outer_iter == other_outer &&
-<a name="l00514"></a>00514 (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
-<a name="l00515"></a>00515 }
-<a name="l00516"></a>00516
-<a name="l00517"></a>00517 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00518"></a>00518 <span class="keywordflow">return</span> !operator==(other_outer);
-<a name="l00519"></a>00519
-<a name="l00520"></a>00520 }
-<a name="l00521"></a>00521
-<a name="l00522"></a>00522 <span class="comment">// (i)* RHS</span>
-<a name="l00523"></a>00523 reference operator*()<span class="keyword"> const </span>{
-<a name="l00524"></a>00524 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00525"></a>00525 __TBB_ASSERT(outer_iter != my_segcont->end(), <span class="stringliteral">"Dereferencing a pointer at end of container"</span>);
-<a name="l00526"></a>00526 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// should never happen</span>
-<a name="l00527"></a>00527 <span class="keywordflow">return</span> *inner_iter;
-<a name="l00528"></a>00528 }
-<a name="l00529"></a>00529
-<a name="l00530"></a>00530 <span class="comment">// i-></span>
-<a name="l00531"></a>00531 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &operator*();}
-<a name="l00532"></a>00532
-<a name="l00533"></a>00533 <span class="keyword">private</span>:
-<a name="l00534"></a>00534 SegmentedContainer* my_segcont;
-<a name="l00535"></a>00535 outer_iterator outer_iter;
-<a name="l00536"></a>00536 inner_iterator inner_iter;
-<a name="l00537"></a>00537
-<a name="l00538"></a>00538 <span class="keywordtype">void</span> advance_me() {
-<a name="l00539"></a>00539 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00540"></a>00540 __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); <span class="comment">// not true if there are no inner containers</span>
-<a name="l00541"></a>00541 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// not true if the inner containers are all empty.</span>
-<a name="l00542"></a>00542 ++inner_iter;
-<a name="l00543"></a>00543 <span class="keywordflow">while</span>(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
-<a name="l00544"></a>00544 inner_iter = outer_iter->begin();
-<a name="l00545"></a>00545 }
-<a name="l00546"></a>00546 }
-<a name="l00547"></a>00547 }; <span class="comment">// segmented_iterator</span>
-<a name="l00548"></a>00548
-<a name="l00549"></a>00549 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00550"></a>00550 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
-<a name="l00551"></a>00551 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00552"></a>00552 <span class="keywordflow">if</span>(i.my_segcont != j.my_segcont) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00553"></a>00553 <span class="keywordflow">if</span>(i.my_segcont == NULL) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00554"></a>00554 <span class="keywordflow">if</span>(i.outer_iter != j.outer_iter) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00555"></a>00555 <span class="keywordflow">if</span>(i.outer_iter == i.my_segcont->end()) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00556"></a>00556 <span class="keywordflow">return</span> i.inner_iter == j.inner_iter;
-<a name="l00557"></a>00557 }
-<a name="l00558"></a>00558
-<a name="l00559"></a>00559 <span class="comment">// !=</span>
-<a name="l00560"></a>00560 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00561"></a>00561 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
-<a name="l00562"></a>00562 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00563"></a>00563 <span class="keywordflow">return</span> !(i==j);
-<a name="l00564"></a>00564 }
-<a name="l00565"></a>00565
-<a name="l00566"></a>00566 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00567"></a>00567 <span class="keyword">struct </span>destruct_only: tbb::internal::no_copy {
-<a name="l00568"></a>00568 <a class="code" href="a00253.html">tbb::aligned_space<T,1></a> value;
-<a name="l00569"></a>00569 ~destruct_only() {value.begin()[0].~T();}
-<a name="l00570"></a>00570 };
-<a name="l00571"></a>00571
-<a name="l00572"></a>00572 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00573"></a>00573 <span class="keyword">struct </span>construct_by_default: tbb::internal::no_assign {
-<a name="l00574"></a>00574 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T();} <span class="comment">// C++ note: the () in T() ensure zero initialization.</span>
-<a name="l00575"></a>00575 construct_by_default( <span class="keywordtype">int</span> ) {}
-<a name="l00576"></a>00576 };
-<a name="l00577"></a>00577
-<a name="l00578"></a>00578 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00579"></a>00579 <span class="keyword">struct </span>construct_by_exemplar: tbb::internal::no_assign {
-<a name="l00580"></a>00580 <span class="keyword">const</span> T exemplar;
-<a name="l00581"></a>00581 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T(exemplar);}
-<a name="l00582"></a>00582 construct_by_exemplar( <span class="keyword">const</span> T& t ) : exemplar(t) {}
-<a name="l00583"></a>00583 };
-<a name="l00584"></a>00584
-<a name="l00585"></a>00585 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Finit>
-<a name="l00586"></a>00586 <span class="keyword">struct </span>construct_by_finit: tbb::internal::no_assign {
-<a name="l00587"></a>00587 Finit f;
-<a name="l00588"></a>00588 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {<span class="keyword">new</span>(where) T(f());}
-<a name="l00589"></a>00589 construct_by_finit( <span class="keyword">const</span> Finit& f_ ) : f(f_) {}
-<a name="l00590"></a>00590 };
-<a name="l00591"></a>00591
-<a name="l00592"></a>00592 <span class="comment">// storage for initialization function pointer</span>
-<a name="l00593"></a>00593 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00594"></a>00594 <span class="keyword">class </span>callback_base {
-<a name="l00595"></a>00595 <span class="keyword">public</span>:
-<a name="l00596"></a>00596 <span class="comment">// Clone *this</span>
-<a name="l00597"></a>00597 <span class="keyword">virtual</span> callback_base* clone() = 0;
-<a name="l00598"></a>00598 <span class="comment">// Destruct and free *this</span>
-<a name="l00599"></a>00599 <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy() = 0;
-<a name="l00600"></a>00600 <span class="comment">// Need virtual destructor to satisfy GCC compiler warning</span>
-<a name="l00601"></a>00601 <span class="keyword">virtual</span> ~callback_base() { }
-<a name="l00602"></a>00602 <span class="comment">// Construct T at where</span>
-<a name="l00603"></a>00603 <span class="keyword">virtual</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) = 0;
-<a name="l00604"></a>00604 };
-<a name="l00605"></a>00605
-<a name="l00606"></a>00606 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Constructor>
-<a name="l00607"></a>00607 <span class="keyword">class </span>callback_leaf: <span class="keyword">public</span> callback_base<T>, Constructor {
-<a name="l00608"></a>00608 <span class="keyword">template</span><<span class="keyword">typename</span> X> callback_leaf( <span class="keyword">const</span> X& x ) : Constructor(x) {}
-<a name="l00609"></a>00609
-<a name="l00610"></a>00610 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00343.html">tbb::tbb_allocator<callback_leaf></a> my_allocator_type;
-<a name="l00611"></a>00611
-<a name="l00612"></a>00612 <span class="comment">/*override*/</span> callback_base<T>* clone() {
-<a name="l00613"></a>00613 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
-<a name="l00614"></a>00614 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(*<span class="keyword">this</span>);
-<a name="l00615"></a>00615 }
-<a name="l00616"></a>00616
-<a name="l00617"></a>00617 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> destroy() {
-<a name="l00618"></a>00618 my_allocator_type().destroy(<span class="keyword">this</span>);
-<a name="l00619"></a>00619 my_allocator_type().deallocate(<span class="keyword">this</span>,1);
-<a name="l00620"></a>00620 }
-<a name="l00621"></a>00621
-<a name="l00622"></a>00622 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {
-<a name="l00623"></a>00623 Constructor::construct(where);
-<a name="l00624"></a>00624 }
-<a name="l00625"></a>00625 <span class="keyword">public</span>:
-<a name="l00626"></a>00626 <span class="keyword">template</span><<span class="keyword">typename</span> X>
-<a name="l00627"></a>00627 <span class="keyword">static</span> callback_base<T>* make( <span class="keyword">const</span> X& x ) {
-<a name="l00628"></a>00628 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
-<a name="l00629"></a>00629 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(x);
-<a name="l00630"></a>00630 }
-<a name="l00631"></a>00631 };
-<a name="l00632"></a>00632
-<a name="l00634"></a>00634
-<a name="l00639"></a>00639 <span class="keyword">template</span><<span class="keyword">typename</span> U, size_t ModularSize>
-<a name="l00640"></a>00640 <span class="keyword">struct </span>ets_element {
-<a name="l00641"></a>00641 <span class="keywordtype">char</span> value[ModularSize==0 ? <span class="keyword">sizeof</span>(U) : <span class="keyword">sizeof</span>(U)+(tbb::internal::NFS_MaxLineSize-ModularSize)];
-<a name="l00642"></a>00642 <span class="keywordtype">void</span> unconstruct() {
-<a name="l00643"></a>00643 tbb::internal::punned_cast<U*>(&value)->~U();
-<a name="l00644"></a>00644 }
-<a name="l00645"></a>00645 };
-<a name="l00646"></a>00646
-<a name="l00647"></a>00647 } <span class="comment">// namespace internal</span>
-<a name="l00649"></a>00649 <span class="comment"></span>
-<a name="l00651"></a>00651
-<a name="l00670"></a>00670 <span class="keyword">template</span> <<span class="keyword">typename</span> T,
-<a name="l00671"></a>00671 <span class="keyword">typename</span> Allocator=cache_aligned_allocator<T>,
-<a name="l00672"></a><a class="code" href="a00281.html">00672</a> <a class="code" href="a00414.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> ETS_key_type=ets_no_key >
-<a name="l00673"></a>00673 <span class="keyword">class </span><a class="code" href="a00281.html">enumerable_thread_specific</a>: internal::ets_base<ETS_key_type> {
-<a name="l00674"></a>00674
-<a name="l00675"></a>00675 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A, ets_key_usage_type C> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00281.html">enumerable_thread_specific</a>;
-<a name="l00676"></a>00676
-<a name="l00677"></a>00677 <span class="keyword">typedef</span> internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
-<a name="l00678"></a>00678
-<a name="l00680"></a>00680 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00681"></a>00681 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00259.html">blocked_range</a><I> {
-<a name="l00682"></a>00682 <span class="keyword">public</span>:
-<a name="l00683"></a>00683 <span class="keyword">typedef</span> T value_type;
-<a name="l00684"></a>00684 <span class="keyword">typedef</span> T& reference;
-<a name="l00685"></a>00685 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00686"></a>00686 <span class="keyword">typedef</span> I iterator;
-<a name="l00687"></a>00687 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00688"></a>00688 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00259.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
-<a name="l00689"></a>00689 template<typename U>
-<a name="l00690"></a>00690 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00259.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
-<a name="l00691"></a>00691 generic_range_type( generic_range_type& r, <a class="code" href="a00335.html">split</a> ) : <a class="code" href="a00259.html">blocked_range<I></a>(r,<a class="code" href="a00335.html">split</a>()) {}
-<a name="l00692"></a>00692 };
-<a name="l00693"></a>00693
-<a name="l00694"></a>00694 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< padded_element >::other padded_allocator_type;
-<a name="l00695"></a>00695 <span class="keyword">typedef</span> <a class="code" href="a00276.html">tbb::concurrent_vector< padded_element, padded_allocator_type ></a> <a class="code" href="a00276.html">internal_collection_type</a>;
-<a name="l00696"></a>00696
-<a name="l00697"></a>00697 internal::callback_base<T> *my_construct_callback;
-<a name="l00698"></a>00698
-<a name="l00699"></a>00699 internal_collection_type my_locals;
-<a name="l00700"></a>00700
-<a name="l00701"></a>00701 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_local() {
-<a name="l00702"></a>00702 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00703"></a>00703 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00276.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
-<a name="l00704"></a>00704 <span class="preprocessor">#else</span>
-<a name="l00705"></a>00705 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00276.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
-<a name="l00706"></a>00706 <span class="preprocessor">#endif</span>
-<a name="l00707"></a>00707 <span class="preprocessor"></span> my_construct_callback->construct(lref);
-<a name="l00708"></a>00708 <span class="keywordflow">return</span> lref;
-<a name="l00709"></a>00709 }
-<a name="l00710"></a>00710
-<a name="l00711"></a>00711 <span class="keywordtype">void</span> unconstruct_locals() {
-<a name="l00712"></a>00712 <span class="keywordflow">for</span>(<span class="keyword">typename</span> internal_collection_type::iterator cvi = my_locals.<a class="code" href="a00276.html#730b23a251ecb6d37f692fb22f38e029">begin</a>(); cvi != my_locals.<a class="code" href="a00276.html#c0b51160e5a764982ec97a455f94f2c6">end</a>(); ++cvi) {
-<a name="l00713"></a>00713 cvi->unconstruct();
-<a name="l00714"></a>00714 }
-<a name="l00715"></a>00715 }
-<a name="l00716"></a>00716
-<a name="l00717"></a>00717 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< uintptr_t >::other array_allocator_type;
-<a name="l00718"></a>00718
-<a name="l00719"></a>00719 <span class="comment">// _size is in bytes</span>
-<a name="l00720"></a>00720 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_array(size_t _size) {
-<a name="l00721"></a>00721 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
-<a name="l00722"></a>00722 <span class="keywordflow">return</span> array_allocator_type().allocate(nelements);
-<a name="l00723"></a>00723 }
-<a name="l00724"></a>00724
-<a name="l00725"></a>00725 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> free_array( <span class="keywordtype">void</span>* _ptr, size_t _size) {
-<a name="l00726"></a>00726 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
-<a name="l00727"></a>00727 array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
-<a name="l00728"></a>00728 }
-<a name="l00729"></a>00729
-<a name="l00730"></a>00730 <span class="keyword">public</span>:
-<a name="l00731"></a>00731
-<a name="l00733"></a>00733 <span class="keyword">typedef</span> Allocator allocator_type;
-<a name="l00734"></a>00734 <span class="keyword">typedef</span> T value_type;
-<a name="l00735"></a>00735 <span class="keyword">typedef</span> T& reference;
-<a name="l00736"></a>00736 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00737"></a>00737 <span class="keyword">typedef</span> T* pointer;
-<a name="l00738"></a>00738 <span class="keyword">typedef</span> <span class="keyword">const</span> T* const_pointer;
-<a name="l00739"></a>00739 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type size_type;
-<a name="l00740"></a>00740 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::difference_type difference_type;
-<a name="l00741"></a>00741
-<a name="l00742"></a>00742 <span class="comment">// Iterator types</span>
-<a name="l00743"></a>00743 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
-<a name="l00744"></a>00744 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type > const_iterator;
-<a name="l00745"></a>00745
-<a name="l00746"></a>00746 <span class="comment">// Parallel range types</span>
-<a name="l00747"></a>00747 <span class="keyword">typedef</span> generic_range_type< iterator > range_type;
-<a name="l00748"></a>00748 <span class="keyword">typedef</span> generic_range_type< const_iterator > const_range_type;
-<a name="l00749"></a>00749
-<a name="l00751"></a>00751 <a class="code" href="a00281.html">enumerable_thread_specific</a>() :
-<a name="l00752"></a>00752 my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(<span class="comment">/*dummy argument*/</span>0) )
-<a name="l00753"></a>00753 {}
-<a name="l00754"></a>00754
-<a name="l00756"></a><a class="code" href="a00281.html#8d4b456ff9d7b289c73254eccc11db45">00756</a> <span class="keyword">template</span> <<span class="keyword">typename</span> Finit>
-<a name="l00757"></a>00757 <a class="code" href="a00281.html">enumerable_thread_specific</a>( Finit finit ) :
-<a name="l00758"></a>00758 my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) )
-<a name="l00759"></a>00759 {}
-<a name="l00760"></a>00760
-<a name="l00762"></a>00762 <a class="code" href="a00281.html">enumerable_thread_specific</a>(<span class="keyword">const</span> T& exemplar) :
-<a name="l00763"></a>00763 my_construct_callback( internal::callback_leaf<T,internal::construct_by_exemplar<T> >::make( exemplar ) )
-<a name="l00764"></a>00764 {}
-<a name="l00765"></a>00765
-<a name="l00767"></a>00767 ~<a class="code" href="a00281.html">enumerable_thread_specific</a>() {
-<a name="l00768"></a>00768 my_construct_callback->destroy();
-<a name="l00769"></a>00769 this->clear(); <span class="comment">// deallocation before the derived class is finished destructing</span>
-<a name="l00770"></a>00770 <span class="comment">// So free(array *) is still accessible</span>
-<a name="l00771"></a>00771 }
-<a name="l00772"></a>00772
-<a name="l00774"></a>00774 reference local() {
-<a name="l00775"></a>00775 <span class="keywordtype">bool</span> exists;
-<a name="l00776"></a>00776 <span class="keywordflow">return</span> local(exists);
-<a name="l00777"></a>00777 }
-<a name="l00778"></a>00778
-<a name="l00780"></a>00780 reference local(<span class="keywordtype">bool</span>& exists) {
-<a name="l00781"></a>00781 <span class="keywordtype">void</span>* ptr = this->table_lookup(exists);
-<a name="l00782"></a>00782 <span class="keywordflow">return</span> *(T*)ptr;
-<a name="l00783"></a>00783 }
-<a name="l00784"></a>00784
-<a name="l00786"></a>00786 size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>(); }
-<a name="l00787"></a>00787
-<a name="l00789"></a>00789 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00276.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>(); }
-<a name="l00790"></a>00790
-<a name="l00792"></a>00792 iterator begin() { <span class="keywordflow">return</span> iterator( my_locals, 0 ); }
-<a name="l00794"></a>00794 iterator end() { <span class="keywordflow">return</span> iterator(my_locals, my_locals.<a class="code" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() ); }
-<a name="l00795"></a>00795
-<a name="l00797"></a>00797 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, 0); }
-<a name="l00798"></a>00798
-<a name="l00800"></a>00800 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, my_locals.<a class="code" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()); }
-<a name="l00801"></a>00801
-<a name="l00803"></a>00803 range_type range( size_t grainsize=1 ) { <span class="keywordflow">return</span> range_type( begin(), end(), grainsize ); }
-<a name="l00804"></a>00804
-<a name="l00806"></a>00806 const_range_type range( size_t grainsize=1 )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize ); }
-<a name="l00807"></a>00807
-<a name="l00809"></a>00809 <span class="keywordtype">void</span> clear() {
-<a name="l00810"></a>00810 unconstruct_locals();
-<a name="l00811"></a>00811 my_locals.<a class="code" href="a00276.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>();
-<a name="l00812"></a>00812 this->table_clear();
-<a name="l00813"></a>00813 <span class="comment">// callback is not destroyed</span>
-<a name="l00814"></a>00814 <span class="comment">// exemplar is not destroyed</span>
-<a name="l00815"></a>00815 }
-<a name="l00816"></a>00816
-<a name="l00817"></a>00817 <span class="keyword">private</span>:
-<a name="l00818"></a>00818
-<a name="l00819"></a>00819 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00820"></a>00820 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other);
-<a name="l00821"></a>00821
-<a name="l00822"></a>00822 <span class="keyword">public</span>:
-<a name="l00823"></a>00823
-<a name="l00824"></a>00824 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00825"></a>00825 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
-<a name="l00826"></a>00826 {
-<a name="l00827"></a>00827 internal_copy(other);
-<a name="l00828"></a>00828 }
-<a name="l00829"></a>00829
-<a name="l00830"></a>00830 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
-<a name="l00831"></a>00831 {
-<a name="l00832"></a>00832 internal_copy(other);
-<a name="l00833"></a>00833 }
-<a name="l00834"></a>00834
-<a name="l00835"></a>00835 <span class="keyword">private</span>:
-<a name="l00836"></a>00836
-<a name="l00837"></a>00837 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00838"></a>00838 enumerable_thread_specific &
-<a name="l00839"></a>00839 internal_assign(<span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
-<a name="l00840"></a>00840 <span class="keywordflow">if</span>(static_cast<void *>( <span class="keyword">this</span> ) != static_cast<const void *>( &other )) {
-<a name="l00841"></a>00841 this->clear();
-<a name="l00842"></a>00842 my_construct_callback->destroy();
-<a name="l00843"></a>00843 my_construct_callback = 0;
-<a name="l00844"></a>00844 internal_copy( other );
-<a name="l00845"></a>00845 }
-<a name="l00846"></a>00846 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00847"></a>00847 }
-<a name="l00848"></a>00848
-<a name="l00849"></a>00849 <span class="keyword">public</span>:
-<a name="l00850"></a>00850
-<a name="l00851"></a>00851 <span class="comment">// assignment</span>
-<a name="l00852"></a>00852 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific& other) {
-<a name="l00853"></a>00853 <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00854"></a>00854 }
-<a name="l00855"></a>00855
-<a name="l00856"></a>00856 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00857"></a>00857 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other)
-<a name="l00858"></a>00858 {
-<a name="l00859"></a>00859 <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00860"></a>00860 }
-<a name="l00861"></a>00861
-<a name="l00862"></a>00862 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
-<a name="l00863"></a>00863 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00864"></a>00864 T combine(combine_func_t f_combine) {
-<a name="l00865"></a>00865 <span class="keywordflow">if</span>(begin() == end()) {
-<a name="l00866"></a>00866 internal::destruct_only<T> location;
-<a name="l00867"></a>00867 my_construct_callback->construct(location.value.begin());
-<a name="l00868"></a>00868 <span class="keywordflow">return</span> *location.value.begin();
-<a name="l00869"></a>00869 }
-<a name="l00870"></a>00870 const_iterator ci = begin();
-<a name="l00871"></a>00871 T my_result = *ci;
-<a name="l00872"></a>00872 <span class="keywordflow">while</span>(++ci != end())
-<a name="l00873"></a>00873 my_result = f_combine( my_result, *ci );
-<a name="l00874"></a>00874 <span class="keywordflow">return</span> my_result;
-<a name="l00875"></a>00875 }
-<a name="l00876"></a>00876
-<a name="l00877"></a>00877 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
-<a name="l00878"></a>00878 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00879"></a>00879 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) {
-<a name="l00880"></a>00880 <span class="keywordflow">for</span>(const_iterator ci = begin(); ci != end(); ++ci) {
-<a name="l00881"></a>00881 f_combine( *ci );
-<a name="l00882"></a>00882 }
-<a name="l00883"></a>00883 }
-<a name="l00884"></a>00884
-<a name="l00885"></a>00885 }; <span class="comment">// enumerable_thread_specific</span>
-<a name="l00886"></a>00886
-<a name="l00887"></a>00887 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator, ets_key_usage_type ETS_key_type>
-<a name="l00888"></a>00888 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00889"></a>00889 <span class="keywordtype">void</span> enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
-<a name="l00890"></a>00890 <span class="comment">// Initialize my_construct_callback first, so that it is valid even if rest of this routine throws an exception.</span>
-<a name="l00891"></a>00891 my_construct_callback = other.my_construct_callback->clone();
-<a name="l00892"></a>00892
-<a name="l00893"></a>00893 <span class="keyword">typedef</span> internal::ets_base<ets_no_key> base;
-<a name="l00894"></a>00894 __TBB_ASSERT(my_locals.<a class="code" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()==0,NULL);
-<a name="l00895"></a>00895 this->table_reserve_for_copy( other );
-<a name="l00896"></a>00896 <span class="keywordflow">for</span>( base::array* r=other.my_root; r; r=r->next ) {
-<a name="l00897"></a>00897 <span class="keywordflow">for</span>( size_t i=0; i<r-><a class="code" href="a00259.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>(); ++i ) {
-<a name="l00898"></a>00898 base::slot& s1 = r->at(i);
-<a name="l00899"></a>00899 <span class="keywordflow">if</span>( !s1.empty() ) {
-<a name="l00900"></a>00900 base::slot& s2 = this->table_find(s1.key);
-<a name="l00901"></a>00901 <span class="keywordflow">if</span>( s2.empty() ) {
-<a name="l00902"></a>00902 #<span class="keywordflow">if</span> TBB_DEPRECATED
-<a name="l00903"></a>00903 <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00276.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
-<a name="l00904"></a>00904 <span class="preprocessor">#else</span>
-<a name="l00905"></a>00905 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00276.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
-<a name="l00906"></a>00906 <span class="preprocessor">#endif</span>
-<a name="l00907"></a>00907 <span class="preprocessor"></span> s2.ptr = <span class="keyword">new</span>(lref) T(*(U*)s1.ptr);
-<a name="l00908"></a>00908 s2.key = s1.key;
-<a name="l00909"></a>00909 } <span class="keywordflow">else</span> {
-<a name="l00910"></a>00910 <span class="comment">// Skip the duplicate</span>
-<a name="l00911"></a>00911 }
-<a name="l00912"></a>00912 }
-<a name="l00913"></a>00913 }
-<a name="l00914"></a>00914 }
-<a name="l00915"></a>00915 }
-<a name="l00916"></a>00916
-<a name="l00917"></a>00917 <span class="keyword">template</span>< <span class="keyword">typename</span> Container >
-<a name="l00918"></a>00918 <span class="keyword">class </span>flattened2d {
-<a name="l00919"></a>00919
-<a name="l00920"></a>00920 <span class="comment">// This intermediate typedef is to address issues with VC7.1 compilers</span>
-<a name="l00921"></a>00921 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::value_type conval_type;
-<a name="l00922"></a>00922
-<a name="l00923"></a>00923 <span class="keyword">public</span>:
-<a name="l00924"></a>00924
-<a name="l00926"></a>00926 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::size_type size_type;
-<a name="l00927"></a>00927 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::difference_type difference_type;
-<a name="l00928"></a>00928 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::allocator_type allocator_type;
-<a name="l00929"></a>00929 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::value_type value_type;
-<a name="l00930"></a>00930 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::reference reference;
-<a name="l00931"></a>00931 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_reference const_reference;
-<a name="l00932"></a>00932 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::pointer pointer;
-<a name="l00933"></a>00933 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_pointer const_pointer;
-<a name="l00934"></a>00934
-<a name="l00935"></a>00935 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, value_type> iterator;
-<a name="l00936"></a>00936 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, const value_type> const_iterator;
-<a name="l00937"></a>00937
-<a name="l00938"></a>00938 flattened2d( <span class="keyword">const</span> Container &c, <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">typename</span> Container::const_iterator e ) :
-<a name="l00939"></a>00939 my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
-<a name="l00940"></a>00940
-<a name="l00941"></a>00941 flattened2d( <span class="keyword">const</span> Container &c ) :
-<a name="l00942"></a>00942 my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
-<a name="l00943"></a>00943
-<a name="l00944"></a>00944 iterator begin() { <span class="keywordflow">return</span> iterator(*my_container) = my_begin; }
-<a name="l00945"></a>00945 iterator end() { <span class="keywordflow">return</span> iterator(*my_container) = my_end; }
-<a name="l00946"></a>00946 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_begin; }
-<a name="l00947"></a>00947 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_end; }
-<a name="l00948"></a>00948
-<a name="l00949"></a>00949 size_type size()<span class="keyword"> const </span>{
-<a name="l00950"></a>00950 size_type tot_size = 0;
-<a name="l00951"></a>00951 <span class="keywordflow">for</span>(<span class="keyword">typename</span> Container::const_iterator i = my_begin; i != my_end; ++i) {
-<a name="l00952"></a>00952 tot_size += i->size();
-<a name="l00953"></a>00953 }
-<a name="l00954"></a>00954 <span class="keywordflow">return</span> tot_size;
-<a name="l00955"></a>00955 }
-<a name="l00956"></a>00956
-<a name="l00957"></a>00957 <span class="keyword">private</span>:
-<a name="l00958"></a>00958
-<a name="l00959"></a>00959 Container *my_container;
-<a name="l00960"></a>00960 <span class="keyword">typename</span> Container::const_iterator my_begin;
-<a name="l00961"></a>00961 <span class="keyword">typename</span> Container::const_iterator my_end;
-<a name="l00962"></a>00962
-<a name="l00963"></a>00963 };
-<a name="l00964"></a>00964
-<a name="l00965"></a>00965 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
-<a name="l00966"></a>00966 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator e) {
-<a name="l00967"></a>00967 <span class="keywordflow">return</span> flattened2d<Container>(c, b, e);
-<a name="l00968"></a>00968 }
-<a name="l00969"></a>00969
-<a name="l00970"></a>00970 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
-<a name="l00971"></a>00971 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c) {
-<a name="l00972"></a>00972 <span class="keywordflow">return</span> flattened2d<Container>(c);
-<a name="l00973"></a>00973 }
-<a name="l00974"></a>00974
-<a name="l00975"></a>00975 } <span class="comment">// interface6</span>
-<a name="l00976"></a>00976
-<a name="l00977"></a>00977 <span class="keyword">namespace </span>internal {
-<a name="l00978"></a>00978 <span class="keyword">using</span> interface6::internal::segmented_iterator;
-<a name="l00979"></a>00979 }
-<a name="l00980"></a>00980
-<a name="l00981"></a>00981 <span class="keyword">using</span> interface6::enumerable_thread_specific;
-<a name="l00982"></a>00982 <span class="keyword">using</span> interface6::flattened2d;
-<a name="l00983"></a>00983 <span class="keyword">using</span> interface6::flatten2d;
-<a name="l00984"></a>00984
-<a name="l00985"></a>00985 } <span class="comment">// namespace tbb</span>
-<a name="l00986"></a>00986
-<a name="l00987"></a>00987 <span class="preprocessor">#endif</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00511.html b/doc/html/a00511.html
deleted file mode 100644
index a918e30..0000000
--- a/doc/html/a00511.html
+++ /dev/null
@@ -1,1655 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>flow_graph.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>flow_graph.h</h1><a href="a00372.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_flow_graph_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_flow_graph_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "spin_mutex.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "null_mutex.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "null_rw_mutex.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "task.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "concurrent_vector.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "internal/_aggregator_impl.h"</span>
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="comment">// use the VC10 or gcc version of tuple if it is available.</span>
-<a name="l00035"></a>00035 <span class="preprocessor">#if TBB_IMPLEMENT_CPP0X && (!defined(_MSC_VER) || _MSC_VER < 1600)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#define TBB_PREVIEW_TUPLE 1</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#include "compat/tuple"</span>
-<a name="l00038"></a>00038 <span class="preprocessor">#else</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#include <tuple></span>
-<a name="l00040"></a>00040 <span class="preprocessor">#endif</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00042"></a>00042 <span class="preprocessor">#include<list></span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include<queue></span>
-<a name="l00044"></a>00044
-<a name="l00055"></a>00055 <span class="keyword">namespace </span>tbb {
-<a name="l00056"></a>00056 <span class="keyword">namespace </span>flow {
-<a name="l00057"></a>00057
-<a name="l00059"></a>00059 <span class="keyword">enum</span> concurrency { unlimited = 0, serial = 1 };
-<a name="l00060"></a>00060
-<a name="l00061"></a>00061 <span class="keyword">namespace </span>interface6 {
-<a name="l00062"></a>00062
-<a name="l00064"></a><a class="code" href="a00277.html">00064</a> <span class="keyword">class </span><a class="code" href="a00277.html">continue_msg</a> {};
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00327.html">sender</a>;
-<a name="l00067"></a>00067 <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00321.html">receiver</a>;
-<a name="l00068"></a>00068 <span class="keyword">class </span><a class="code" href="a00279.html">continue_receiver</a>;
-<a name="l00069"></a>00069
-<a name="l00071"></a>00071 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l00072"></a><a class="code" href="a00327.html">00072</a> <span class="keyword">class </span><a class="code" href="a00327.html">sender</a> {
-<a name="l00073"></a>00073 <span class="keyword">public</span>:
-<a name="l00075"></a><a class="code" href="a00327.html#127af99916cc085cd9dbc09c53299928">00075</a> <span class="keyword">typedef</span> T <a class="code" href="a00327.html#127af99916cc085cd9dbc09c53299928">output_type</a>;
-<a name="l00076"></a>00076
-<a name="l00078"></a><a class="code" href="a00327.html#d690e8a54e358968f0ee4fdf9ee73068">00078</a> <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver<T></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l00079"></a>00079
-<a name="l00080"></a>00080 <span class="keyword">virtual</span> ~<a class="code" href="a00327.html">sender</a>() {}
-<a name="l00081"></a>00081
-<a name="l00083"></a>00083 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00327.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>( <a class="code" href="a00327.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> &r ) = 0;
-<a name="l00084"></a>00084
-<a name="l00086"></a>00086 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00327.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>( <a class="code" href="a00327.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> &r ) = 0;
-<a name="l00087"></a>00087
-<a name="l00089"></a><a class="code" href="a00327.html#922fb56b0aad090b90a98b7d56b76a59">00089</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00327.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00090"></a>00090
-<a name="l00092"></a><a class="code" href="a00327.html#02c05b472271db1b68a48ea2618fa72f">00092</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00327.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00093"></a>00093
-<a name="l00095"></a><a class="code" href="a00327.html#27036b06d6a91e97007e14f400529199">00095</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00327.html#27036b06d6a91e97007e14f400529199">try_release</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00096"></a>00096
-<a name="l00098"></a><a class="code" href="a00327.html#7b840f50da117a0d6848707c1857ea2e">00098</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00327.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00099"></a>00099 };
-<a name="l00100"></a>00100
-<a name="l00102"></a>00102 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l00103"></a><a class="code" href="a00321.html">00103</a> <span class="keyword">class </span><a class="code" href="a00321.html">receiver</a> {
-<a name="l00104"></a>00104 <span class="keyword">public</span>:
-<a name="l00106"></a><a class="code" href="a00321.html#0d0524c99313dedea1e04464bbf2f7ef">00106</a> <span class="keyword">typedef</span> T <a class="code" href="a00277.html">input_type</a>;
-<a name="l00107"></a>00107
-<a name="l00109"></a><a class="code" href="a00321.html#7fa8cff811e7c1589b805a4bb4c7a74f">00109</a> <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender<T></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l00110"></a>00110
-<a name="l00112"></a><a class="code" href="a00321.html#b00699b235435f7b65b663d5063624a1">00112</a> <span class="keyword">virtual</span> <a class="code" href="a00321.html#b00699b235435f7b65b663d5063624a1">~receiver</a>() {}
-<a name="l00113"></a>00113
-<a name="l00115"></a>00115 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00321.html#c6d5d0cb8ebe5771be91933609fe31b8">try_put</a>( <span class="keyword">const</span> T& t ) = 0;
-<a name="l00116"></a>00116
-<a name="l00118"></a><a class="code" href="a00321.html#30e3316466efe3a713c23062b6e806f3">00118</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00321.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>( <a class="code" href="a00327.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00119"></a>00119
-<a name="l00121"></a><a class="code" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">00121</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>( <a class="code" href="a00327.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00122"></a>00122 };
-<a name="l00123"></a>00123
-<a name="l00125"></a>00125
-<a name="l00126"></a><a class="code" href="a00279.html">00126</a> <span class="keyword">class </span><a class="code" href="a00279.html">continue_receiver</a> : <span class="keyword">public</span> <a class="code" href="a00321.html">receiver</a>< continue_msg > {
-<a name="l00127"></a>00127 <span class="keyword">public</span>:
-<a name="l00128"></a>00128
-<a name="l00130"></a><a class="code" href="a00279.html#3c43c166af832d9187035985841e0a7f">00130</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">continue_msg</a> <a class="code" href="a00277.html">input_type</a>;
-<a name="l00131"></a>00131
-<a name="l00133"></a><a class="code" href="a00279.html#f9c58b3e9c46afd2518d0fd8957a5a2f">00133</a> <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< continue_msg ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l00134"></a>00134
-<a name="l00136"></a><a class="code" href="a00279.html#177db82d548a1f8471371331890b91a8">00136</a> <a class="code" href="a00279.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>( <span class="keywordtype">int</span> number_of_predecessors = 0 ) {
-<a name="l00137"></a>00137 my_predecessor_count = my_initial_predecessor_count = number_of_predecessors;
-<a name="l00138"></a>00138 my_current_count = 0;
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00142"></a><a class="code" href="a00279.html#a0b292ed7fa6556b2a735f6d1e82dc74">00142</a> <a class="code" href="a00279.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>( <span class="keyword">const</span> <a class="code" href="a00279.html">continue_receiver</a>& src ) : <a class="code" href="a00321.html">receiver</a><<a class="code" href="a00277.html">continue_msg</a>>() {
-<a name="l00143"></a>00143 my_predecessor_count = my_initial_predecessor_count = src.<a class="code" href="a00279.html#8a0d4c3084fd13902c2d38f31c1dc232">my_initial_predecessor_count</a>;
-<a name="l00144"></a>00144 my_current_count = 0;
-<a name="l00145"></a>00145 }
-<a name="l00146"></a>00146
-<a name="l00148"></a><a class="code" href="a00279.html#1e14828fa079b9835ff7267df5ee45d7">00148</a> <span class="keyword">virtual</span> <a class="code" href="a00279.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a>() { }
-<a name="l00149"></a>00149
-<a name="l00151"></a><a class="code" href="a00279.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">00151</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00279.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a>( <a class="code" href="a00327.html">predecessor_type</a> & ) {
-<a name="l00152"></a>00152 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l00153"></a>00153 ++my_predecessor_count;
-<a name="l00154"></a>00154 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156
-<a name="l00158"></a>00158
-<a name="l00161"></a><a class="code" href="a00279.html#cb691b18416d4742265aed84d496ebbd">00161</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00279.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a>( <a class="code" href="a00327.html">predecessor_type</a> & ) {
-<a name="l00162"></a>00162 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l00163"></a>00163 --my_predecessor_count;
-<a name="l00164"></a>00164 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00165"></a>00165 }
-<a name="l00166"></a>00166
-<a name="l00168"></a>00168
-<a name="l00170"></a><a class="code" href="a00279.html#3969c70fb89c0a982f142ae9eb5facae">00170</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00279.html#3969c70fb89c0a982f142ae9eb5facae">try_put</a>( <span class="keyword">const</span> <a class="code" href="a00277.html">input_type</a> & ) {
-<a name="l00171"></a>00171 {
-<a name="l00172"></a>00172 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l00173"></a>00173 <span class="keywordflow">if</span> ( ++my_current_count < my_predecessor_count )
-<a name="l00174"></a>00174 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00175"></a>00175 <span class="keywordflow">else</span>
-<a name="l00176"></a>00176 my_current_count = 0;
-<a name="l00177"></a>00177 }
-<a name="l00178"></a>00178 <a class="code" href="a00279.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a>();
-<a name="l00179"></a>00179 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00180"></a>00180 }
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 <span class="keyword">protected</span>:
-<a name="l00183"></a>00183 <a class="code" href="a00331.html">spin_mutex</a> my_mutex;
-<a name="l00184"></a>00184 <span class="keywordtype">int</span> my_predecessor_count;
-<a name="l00185"></a>00185 <span class="keywordtype">int</span> my_current_count;
-<a name="l00186"></a>00186 <span class="keywordtype">int</span> my_initial_predecessor_count;
-<a name="l00187"></a>00187
-<a name="l00189"></a>00189
-<a name="l00191"></a>00191 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00279.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a>() = 0;
-<a name="l00192"></a>00192 };
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="preprocessor">#include "internal/_flow_graph_impl.h"</span>
-<a name="l00195"></a>00195 <span class="keyword">using namespace </span>internal::graph_policy_namespace;
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 <span class="keyword">class </span><a class="code" href="a00288.html">graph</a>;
-<a name="l00198"></a>00198 <span class="keyword">class </span><a class="code" href="a00289.html">graph_node</a>;
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 <span class="keyword">template</span> <<span class="keyword">typename</span> GraphContainerType, <span class="keyword">typename</span> GraphNodeType>
-<a name="l00201"></a>00201 <span class="keyword">class </span>graph_iterator {
-<a name="l00202"></a>00202 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00288.html">graph</a>;
-<a name="l00203"></a>00203 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00289.html">graph_node</a>;
-<a name="l00204"></a>00204 <span class="keyword">public</span>:
-<a name="l00205"></a>00205 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00206"></a>00206 <span class="keyword">typedef</span> GraphNodeType value_type;
-<a name="l00207"></a>00207 <span class="keyword">typedef</span> GraphNodeType* pointer;
-<a name="l00208"></a>00208 <span class="keyword">typedef</span> GraphNodeType& reference;
-<a name="l00209"></a>00209 <span class="keyword">typedef</span> <span class="keyword">const</span> GraphNodeType& const_reference;
-<a name="l00210"></a>00210 <span class="keyword">typedef</span> std::forward_iterator_tag iterator_category;
-<a name="l00211"></a>00211
-<a name="l00213"></a>00213 graph_iterator() : my_graph(NULL), current_node(NULL) {}
-<a name="l00214"></a>00214
-<a name="l00216"></a>00216 graph_iterator(<span class="keyword">const</span> graph_iterator& other) :
-<a name="l00217"></a>00217 my_graph(other.my_graph), current_node(other.current_node)
-<a name="l00218"></a>00218 {}
-<a name="l00219"></a>00219
-<a name="l00221"></a>00221 graph_iterator& operator=(<span class="keyword">const</span> graph_iterator& other) {
-<a name="l00222"></a>00222 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &other) {
-<a name="l00223"></a>00223 my_graph = other.my_graph;
-<a name="l00224"></a>00224 current_node = other.current_node;
-<a name="l00225"></a>00225 }
-<a name="l00226"></a>00226 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00227"></a>00227 }
-<a name="l00228"></a>00228
-<a name="l00230"></a>00230 reference operator*() <span class="keyword">const</span>;
-<a name="l00231"></a>00231
-<a name="l00233"></a>00233 pointer operator->() <span class="keyword">const</span>;
-<a name="l00234"></a>00234
-<a name="l00236"></a>00236 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> graph_iterator& other)<span class="keyword"> const </span>{
-<a name="l00237"></a>00237 <span class="keywordflow">return</span> ((my_graph == other.my_graph) && (current_node == other.current_node));
-<a name="l00238"></a>00238 }
-<a name="l00239"></a>00239
-<a name="l00241"></a>00241 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> graph_iterator& other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !(operator==(other)); }
-<a name="l00242"></a>00242
-<a name="l00244"></a>00244 graph_iterator& operator++() {
-<a name="l00245"></a>00245 internal_forward();
-<a name="l00246"></a>00246 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00247"></a>00247 }
-<a name="l00248"></a>00248
-<a name="l00250"></a>00250 graph_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00251"></a>00251 graph_iterator result = *<span class="keyword">this</span>;
-<a name="l00252"></a>00252 operator++();
-<a name="l00253"></a>00253 <span class="keywordflow">return</span> result;
-<a name="l00254"></a>00254 }
-<a name="l00255"></a>00255
-<a name="l00256"></a>00256 <span class="keyword">private</span>:
-<a name="l00257"></a>00257 <span class="comment">// the graph over which we are iterating</span>
-<a name="l00258"></a>00258 GraphContainerType *my_graph;
-<a name="l00259"></a>00259 <span class="comment">// pointer into my_graph's my_nodes list</span>
-<a name="l00260"></a>00260 pointer current_node;
-<a name="l00261"></a>00261
-<a name="l00263"></a>00263 graph_iterator(GraphContainerType *g, <span class="keywordtype">bool</span> begin);
-<a name="l00264"></a>00264 <span class="keywordtype">void</span> internal_forward();
-<a name="l00265"></a>00265 };
-<a name="l00266"></a>00266
-<a name="l00268"></a>00268
-<a name="l00269"></a><a class="code" href="a00288.html">00269</a> <span class="keyword">class </span><a class="code" href="a00288.html">graph</a> : tbb::internal::no_copy {
-<a name="l00270"></a>00270 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00289.html">graph_node</a>;
-<a name="l00271"></a>00271
-<a name="l00272"></a>00272 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00273"></a>00273 <span class="keyword">class </span>run_task : <span class="keyword">public</span> <a class="code" href="a00337.html">task</a> {
-<a name="l00274"></a>00274 <span class="keyword">public</span>:
-<a name="l00275"></a>00275 run_task( Body& body ) : my_body(body) {}
-<a name="l00276"></a>00276 <a class="code" href="a00337.html">task</a> *execute() {
-<a name="l00277"></a>00277 my_body();
-<a name="l00278"></a>00278 <span class="keywordflow">return</span> NULL;
-<a name="l00279"></a>00279 }
-<a name="l00280"></a>00280 <span class="keyword">private</span>:
-<a name="l00281"></a>00281 Body my_body;
-<a name="l00282"></a>00282 };
-<a name="l00283"></a>00283
-<a name="l00284"></a>00284 <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
-<a name="l00285"></a>00285 <span class="keyword">class </span>run_and_put_task : <span class="keyword">public</span> <a class="code" href="a00337.html">task</a> {
-<a name="l00286"></a>00286 <span class="keyword">public</span>:
-<a name="l00287"></a>00287 run_and_put_task( Receiver &r, Body& body ) : my_receiver(r), my_body(body) {}
-<a name="l00288"></a>00288 <a class="code" href="a00337.html">task</a> *execute() {
-<a name="l00289"></a>00289 my_receiver.try_put( my_body() );
-<a name="l00290"></a>00290 <span class="keywordflow">return</span> NULL;
-<a name="l00291"></a>00291 }
-<a name="l00292"></a>00292 <span class="keyword">private</span>:
-<a name="l00293"></a>00293 Receiver &my_receiver;
-<a name="l00294"></a>00294 Body my_body;
-<a name="l00295"></a>00295 };
-<a name="l00296"></a>00296
-<a name="l00297"></a>00297 <span class="keyword">public</span>:
-<a name="l00299"></a><a class="code" href="a00288.html#4ab3d4b5208ece28c4c3ced647e26e12">00299</a> <span class="keyword">explicit</span> <a class="code" href="a00288.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>() : my_nodes(NULL), my_nodes_last(NULL)
-<a name="l00300"></a>00300 {
-<a name="l00301"></a>00301 own_context = <span class="keyword">true</span>;
-<a name="l00302"></a>00302 cancelled = <span class="keyword">false</span>;
-<a name="l00303"></a>00303 caught_exception = <span class="keyword">false</span>;
-<a name="l00304"></a>00304 my_context = <span class="keyword">new</span> <a class="code" href="a00339.html">task_group_context</a>();
-<a name="l00305"></a>00305 my_root_task = ( <span class="keyword">new</span> ( <a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(*my_context) ) <a class="code" href="a00280.html">empty_task</a> );
-<a name="l00306"></a>00306 my_root_task-><a class="code" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
-<a name="l00307"></a>00307 }
-<a name="l00308"></a>00308
-<a name="l00310"></a><a class="code" href="a00288.html#104d4f3775f596b43177c29e6b7b7656">00310</a> <span class="keyword">explicit</span> <a class="code" href="a00288.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>(<a class="code" href="a00339.html">task_group_context</a>& use_this_context) :
-<a name="l00311"></a>00311 my_context(&use_this_context), my_nodes(NULL), my_nodes_last(NULL)
-<a name="l00312"></a>00312 {
-<a name="l00313"></a>00313 own_context = <span class="keyword">false</span>;
-<a name="l00314"></a>00314 my_root_task = ( <span class="keyword">new</span> ( <a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(*my_context) ) <a class="code" href="a00280.html">empty_task</a> );
-<a name="l00315"></a>00315 my_root_task-><a class="code" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
-<a name="l00316"></a>00316 }
-<a name="l00317"></a>00317
-<a name="l00319"></a>00319
-<a name="l00320"></a><a class="code" href="a00288.html#8a7d424c0616a1c37a908ead182e2fe5">00320</a> <a class="code" href="a00288.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a>() {
-<a name="l00321"></a>00321 <a class="code" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>();
-<a name="l00322"></a>00322 my_root_task-><a class="code" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(0);
-<a name="l00323"></a>00323 <a class="code" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>( *my_root_task );
-<a name="l00324"></a>00324 <span class="keywordflow">if</span> (own_context) <span class="keyword">delete</span> my_context;
-<a name="l00325"></a>00325 }
-<a name="l00326"></a>00326
-<a name="l00328"></a>00328
-<a name="l00330"></a><a class="code" href="a00288.html#a993b789d1e488e0c3929135beae560e">00330</a> <span class="keywordtype">void</span> <a class="code" href="a00288.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a>() {
-<a name="l00331"></a>00331 <span class="keywordflow">if</span> (my_root_task)
-<a name="l00332"></a>00332 my_root_task-><a class="code" href="a00337.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>();
-<a name="l00333"></a>00333 }
-<a name="l00334"></a>00334
-<a name="l00336"></a>00336
-<a name="l00338"></a><a class="code" href="a00288.html#29b85506870f13a884a21655aec2a65d">00338</a> <span class="keywordtype">void</span> <a class="code" href="a00288.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a>() {
-<a name="l00339"></a>00339 <span class="keywordflow">if</span> (my_root_task)
-<a name="l00340"></a>00340 my_root_task-><a class="code" href="a00337.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>();
-<a name="l00341"></a>00341 }
-<a name="l00342"></a>00342
-<a name="l00344"></a>00344
-<a name="l00346"></a>00346 <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
-<a name="l00347"></a><a class="code" href="a00288.html#50a7938df01b6148ab2c0696835f002e">00347</a> <span class="keywordtype">void</span> <a class="code" href="a00288.html#50a7938df01b6148ab2c0696835f002e">run</a>( Receiver &r, Body body ) {
-<a name="l00348"></a>00348 <a class="code" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l00349"></a>00349 run_and_put_task< Receiver, Body >( r, body ) );
-<a name="l00350"></a>00350 }
-<a name="l00351"></a>00351
-<a name="l00353"></a>00353
-<a name="l00355"></a>00355 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00356"></a><a class="code" href="a00288.html#c1145b00e063793a7e7bf994d202c7a0">00356</a> <span class="keywordtype">void</span> <a class="code" href="a00288.html#50a7938df01b6148ab2c0696835f002e">run</a>( Body body ) {
-<a name="l00357"></a>00357 <a class="code" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l00358"></a>00358 run_task< Body >( body ) );
-<a name="l00359"></a>00359 }
-<a name="l00360"></a>00360
-<a name="l00362"></a>00362
-<a name="l00363"></a><a class="code" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">00363</a> <span class="keywordtype">void</span> <a class="code" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>() {
-<a name="l00364"></a>00364 cancelled = <span class="keyword">false</span>;
-<a name="l00365"></a>00365 caught_exception = <span class="keyword">false</span>;
-<a name="l00366"></a>00366 <span class="keywordflow">if</span> (my_root_task) {
-<a name="l00367"></a>00367 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00368"></a>00368 <span class="preprocessor"></span> <span class="keywordflow">try</span> {
-<a name="l00369"></a>00369 <span class="preprocessor">#endif</span>
-<a name="l00370"></a>00370 <span class="preprocessor"></span> my_root_task-><a class="code" href="a00337.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>();
-<a name="l00371"></a>00371 cancelled = my_context->is_group_execution_cancelled();
-<a name="l00372"></a>00372 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00373"></a>00373 <span class="preprocessor"></span> }
-<a name="l00374"></a>00374 <span class="keywordflow">catch</span>(...) {
-<a name="l00375"></a>00375 my_root_task-><a class="code" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
-<a name="l00376"></a>00376 my_context->reset();
-<a name="l00377"></a>00377 caught_exception = <span class="keyword">true</span>;
-<a name="l00378"></a>00378 cancelled = <span class="keyword">true</span>;
-<a name="l00379"></a>00379 <span class="keywordflow">throw</span>;
-<a name="l00380"></a>00380 }
-<a name="l00381"></a>00381 <span class="preprocessor">#endif</span>
-<a name="l00382"></a>00382 <span class="preprocessor"></span> my_root_task-><a class="code" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
-<a name="l00383"></a>00383 }
-<a name="l00384"></a>00384 }
-<a name="l00385"></a>00385
-<a name="l00387"></a><a class="code" href="a00288.html#7f4e3ae90811a5d8b597146b5b586d10">00387</a> <a class="code" href="a00337.html">task</a> * <a class="code" href="a00288.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a>() {
-<a name="l00388"></a>00388 <span class="keywordflow">return</span> my_root_task;
-<a name="l00389"></a>00389 }
-<a name="l00390"></a>00390
-<a name="l00391"></a>00391 <span class="comment">// ITERATORS</span>
-<a name="l00392"></a>00392 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> N>
-<a name="l00393"></a>00393 <span class="keyword">friend</span> <span class="keyword">class </span>graph_iterator;
-<a name="l00394"></a>00394
-<a name="l00395"></a>00395 <span class="comment">// Graph iterator typedefs</span>
-<a name="l00396"></a>00396 <span class="keyword">typedef</span> graph_iterator<graph,graph_node> iterator;
-<a name="l00397"></a>00397 <span class="keyword">typedef</span> graph_iterator<const graph,const graph_node> const_iterator;
-<a name="l00398"></a>00398
-<a name="l00399"></a>00399 <span class="comment">// Graph iterator constructors</span>
-<a name="l00401"></a><a class="code" href="a00288.html#b028cb585ec21e5de523d0075d0fa880">00401</a> <span class="comment"></span> iterator <a class="code" href="a00288.html#b028cb585ec21e5de523d0075d0fa880">begin</a>() { <span class="keywordflow">return</span> iterator(<span class="keyword">this</span>, <span class="keyword">true</span>); }
-<a name="l00403"></a><a class="code" href="a00288.html#a167c62511ddacaa152daa64ab2d6aac">00403</a> iterator <a class="code" href="a00288.html#a167c62511ddacaa152daa64ab2d6aac">end</a>() { <span class="keywordflow">return</span> iterator(<span class="keyword">this</span>, <span class="keyword">false</span>); }
-<a name="l00405"></a><a class="code" href="a00288.html#f63c3b7d03098b57fc16b71c57b303e5">00405</a> const_iterator <a class="code" href="a00288.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>); }
-<a name="l00407"></a><a class="code" href="a00288.html#907bd06606818c36f52420fe8d469d35">00407</a> const_iterator <a class="code" href="a00288.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>); }
-<a name="l00409"></a><a class="code" href="a00288.html#e183dfc3f89dc8f57c06ba165fb89f66">00409</a> const_iterator <a class="code" href="a00288.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>); }
-<a name="l00411"></a><a class="code" href="a00288.html#4866156e6a31d0399b61c6eb82ee81fd">00411</a> const_iterator <a class="code" href="a00288.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>); }
-<a name="l00412"></a>00412
-<a name="l00414"></a><a class="code" href="a00288.html#227ea140dc2c68f79a4e5a34a8367b58">00414</a> <span class="keywordtype">bool</span> <a class="code" href="a00288.html#227ea140dc2c68f79a4e5a34a8367b58">is_cancelled</a>() { <span class="keywordflow">return</span> cancelled; }
-<a name="l00415"></a>00415 <span class="keywordtype">bool</span> exception_thrown() { <span class="keywordflow">return</span> caught_exception; }
-<a name="l00416"></a>00416
-<a name="l00417"></a>00417 <span class="keyword">private</span>:
-<a name="l00418"></a>00418 <a class="code" href="a00337.html">task</a> *my_root_task;
-<a name="l00419"></a>00419 <a class="code" href="a00339.html">task_group_context</a> *my_context;
-<a name="l00420"></a>00420 <span class="keywordtype">bool</span> own_context;
-<a name="l00421"></a>00421 <span class="keywordtype">bool</span> cancelled;
-<a name="l00422"></a>00422 <span class="keywordtype">bool</span> caught_exception;
-<a name="l00423"></a>00423
-<a name="l00424"></a>00424 <a class="code" href="a00289.html">graph_node</a> *my_nodes, *my_nodes_last;
-<a name="l00425"></a>00425
-<a name="l00426"></a>00426 <a class="code" href="a00331.html">spin_mutex</a> nodelist_mutex;
-<a name="l00427"></a>00427 <span class="keywordtype">void</span> register_node(<a class="code" href="a00289.html">graph_node</a> *n);
-<a name="l00428"></a>00428 <span class="keywordtype">void</span> remove_node(<a class="code" href="a00289.html">graph_node</a> *n);
-<a name="l00429"></a>00429
-<a name="l00430"></a>00430 };
-<a name="l00431"></a>00431
-<a name="l00432"></a>00432 <span class="keyword">template</span> <<span class="keyword">typename</span> C, <span class="keyword">typename</span> N>
-<a name="l00433"></a>00433 graph_iterator<C,N>::graph_iterator(C *g, <span class="keywordtype">bool</span> begin) : my_graph(g), current_node(NULL)
-<a name="l00434"></a>00434 {
-<a name="l00435"></a>00435 <span class="keywordflow">if</span> (begin) current_node = my_graph->my_nodes;
-<a name="l00436"></a>00436 <span class="comment">//else it is an end iterator by default</span>
-<a name="l00437"></a>00437 }
-<a name="l00438"></a>00438
-<a name="l00439"></a>00439 <span class="keyword">template</span> <<span class="keyword">typename</span> C, <span class="keyword">typename</span> N>
-<a name="l00440"></a>00440 <span class="keyword">typename</span> graph_iterator<C,N>::reference graph_iterator<C,N>::operator*()<span class="keyword"> const </span>{
-<a name="l00441"></a>00441 __TBB_ASSERT(current_node, <span class="stringliteral">"graph_iterator at end"</span>);
-<a name="l00442"></a>00442 <span class="keywordflow">return</span> *operator->();
-<a name="l00443"></a>00443 }
-<a name="l00444"></a>00444
-<a name="l00445"></a>00445 <span class="keyword">template</span> <<span class="keyword">typename</span> C, <span class="keyword">typename</span> N>
-<a name="l00446"></a>00446 <span class="keyword">typename</span> graph_iterator<C,N>::pointer graph_iterator<C,N>::operator->()<span class="keyword"> const </span>{
-<a name="l00447"></a>00447 <span class="keywordflow">return</span> current_node;
-<a name="l00448"></a>00448 }
-<a name="l00449"></a>00449
-<a name="l00450"></a>00450
-<a name="l00451"></a>00451 <span class="keyword">template</span> <<span class="keyword">typename</span> C, <span class="keyword">typename</span> N>
-<a name="l00452"></a>00452 <span class="keywordtype">void</span> graph_iterator<C,N>::internal_forward() {
-<a name="l00453"></a>00453 <span class="keywordflow">if</span> (current_node) current_node = current_node->next;
-<a name="l00454"></a>00454 }
-<a name="l00455"></a>00455
-<a name="l00457"></a><a class="code" href="a00289.html">00457</a> <span class="keyword">class </span><a class="code" href="a00289.html">graph_node</a> : tbb::internal::no_assign {
-<a name="l00458"></a>00458 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00288.html">graph</a>;
-<a name="l00459"></a>00459 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> N>
-<a name="l00460"></a>00460 <span class="keyword">friend</span> <span class="keyword">class </span>graph_iterator;
-<a name="l00461"></a>00461 <span class="keyword">protected</span>:
-<a name="l00462"></a>00462 <a class="code" href="a00288.html">graph</a>& my_graph;
-<a name="l00463"></a>00463 <a class="code" href="a00289.html">graph_node</a> *next, *prev;
-<a name="l00464"></a>00464 <span class="keyword">public</span>:
-<a name="l00465"></a>00465 <a class="code" href="a00289.html">graph_node</a>(<a class="code" href="a00288.html">graph</a>& g) : my_graph(g) {
-<a name="l00466"></a>00466 my_graph.<a class="code" href="a00288.html#0eca5c8a44b050262cbab2f985d8ac94">register_node</a>(<span class="keyword">this</span>);
-<a name="l00467"></a>00467 }
-<a name="l00468"></a>00468 <span class="keyword">virtual</span> ~<a class="code" href="a00289.html">graph_node</a>() {
-<a name="l00469"></a>00469 my_graph.<a class="code" href="a00288.html#143cf6eb0c555eb100ed8cbad198a207">remove_node</a>(<span class="keyword">this</span>);
-<a name="l00470"></a>00470 }
-<a name="l00471"></a>00471 };
-<a name="l00472"></a>00472
-<a name="l00473"></a>00473 <span class="keyword">inline</span> <span class="keywordtype">void</span> graph::register_node(<a class="code" href="a00289.html">graph_node</a> *n) {
-<a name="l00474"></a>00474 n-><a class="code" href="a00289.html#d1ce68896f6d366dcc3fad19f6fd55d1">next</a> = NULL;
-<a name="l00475"></a>00475 {
-<a name="l00476"></a>00476 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(nodelist_mutex);
-<a name="l00477"></a>00477 n-><a class="code" href="a00289.html#28049e438b241b0d6051767bbeacc0b9">prev</a> = my_nodes_last;
-<a name="l00478"></a>00478 <span class="keywordflow">if</span> (my_nodes_last) my_nodes_last-><a class="code" href="a00289.html#d1ce68896f6d366dcc3fad19f6fd55d1">next</a> = n;
-<a name="l00479"></a>00479 my_nodes_last = n;
-<a name="l00480"></a>00480 <span class="keywordflow">if</span> (!my_nodes) my_nodes = n;
-<a name="l00481"></a>00481 }
-<a name="l00482"></a>00482 }
-<a name="l00483"></a>00483
-<a name="l00484"></a>00484 <span class="keyword">inline</span> <span class="keywordtype">void</span> graph::remove_node(graph_node *n) {
-<a name="l00485"></a>00485 {
-<a name="l00486"></a>00486 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(nodelist_mutex);
-<a name="l00487"></a>00487 __TBB_ASSERT(my_nodes && my_nodes_last, <span class="stringliteral">"graph::remove_node: Error: no registered nodes"</span>);
-<a name="l00488"></a>00488 <span class="keywordflow">if</span> (n->prev) n->prev->next = n->next;
-<a name="l00489"></a>00489 <span class="keywordflow">if</span> (n->next) n->next->prev = n->prev;
-<a name="l00490"></a>00490 <span class="keywordflow">if</span> (my_nodes_last == n) my_nodes_last = n->prev;
-<a name="l00491"></a>00491 <span class="keywordflow">if</span> (my_nodes == n) my_nodes = n->next;
-<a name="l00492"></a>00492 }
-<a name="l00493"></a>00493 n->prev = n->next = NULL;
-<a name="l00494"></a>00494 }
-<a name="l00495"></a>00495
-<a name="l00496"></a>00496 <span class="preprocessor">#include "internal/_flow_graph_node_impl.h"</span>
-<a name="l00497"></a>00497
-<a name="l00499"></a>00499 <span class="keyword">template</span> < <span class="keyword">typename</span> Output >
-<a name="l00500"></a><a class="code" href="a00330.html">00500</a> <span class="keyword">class </span><a class="code" href="a00330.html">source_node</a> : <span class="keyword">public</span> <a class="code" href="a00289.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00327.html">sender</a>< Output > {
-<a name="l00501"></a>00501 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l00502"></a>00502 <span class="keyword">public</span>:
-<a name="l00504"></a><a class="code" href="a00330.html#407533487cc3f6032c1072cba19c609c">00504</a> <span class="keyword">typedef</span> Output <a class="code" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a>;
-<a name="l00505"></a>00505
-<a name="l00507"></a><a class="code" href="a00330.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">00507</a> <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< Output ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l00508"></a>00508
-<a name="l00510"></a>00510 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00511"></a><a class="code" href="a00330.html#503c3b395c629296bf5cccd96d6388c1">00511</a> <a class="code" href="a00330.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>( <a class="code" href="a00288.html">graph</a> &g, Body body, <span class="keywordtype">bool</span> is_active = <span class="keyword">true</span> )
-<a name="l00512"></a>00512 : <a class="code" href="a00289.html">graph_node</a>(g), my_root_task(g.root_task()), my_active(is_active), init_my_active(is_active),
-<a name="l00513"></a>00513 my_body( new internal::source_body_leaf< <a class="code" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a>, Body>(body) ),
-<a name="l00514"></a>00514 my_reserved(false), my_has_cached_item(false)
-<a name="l00515"></a>00515 {
-<a name="l00516"></a>00516 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l00517"></a>00517 }
-<a name="l00518"></a>00518
-<a name="l00520"></a><a class="code" href="a00330.html#adaac111fbcace95804219a5f2929304">00520</a> <a class="code" href="a00330.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>( <span class="keyword">const</span> <a class="code" href="a00330.html">source_node</a>& src ) :
-<a name="l00521"></a>00521 <a class="code" href="a00289.html">graph_node</a>(src.my_graph), <a class="code" href="a00327.html">sender</a><Output>(),
-<a name="l00522"></a>00522 my_root_task( src.my_root_task), my_active(src.init_my_active),
-<a name="l00523"></a>00523 init_my_active(src.init_my_active), my_body( src.my_body->clone() ),
-<a name="l00524"></a>00524 my_reserved(false), my_has_cached_item(false)
-<a name="l00525"></a>00525 {
-<a name="l00526"></a>00526 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l00527"></a>00527 }
-<a name="l00528"></a>00528
-<a name="l00530"></a><a class="code" href="a00330.html#61700b0865fc17188b0abe26bbde65b6">00530</a> <a class="code" href="a00330.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a>() { <span class="keyword">delete</span> my_body; }
-<a name="l00531"></a>00531
-<a name="l00533"></a><a class="code" href="a00330.html#22960d499df9f1569a9d8a544e35afe3">00533</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00330.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a>( <a class="code" href="a00321.html">receiver<output_type></a> &r ) {
-<a name="l00534"></a>00534 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l00535"></a>00535 my_successors.register_successor(r);
-<a name="l00536"></a>00536 <span class="keywordflow">if</span> ( my_active )
-<a name="l00537"></a>00537 spawn_put();
-<a name="l00538"></a>00538 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00539"></a>00539 }
-<a name="l00540"></a>00540
-<a name="l00542"></a><a class="code" href="a00330.html#222484bf295f39df36415a29e508e5c9">00542</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00330.html#222484bf295f39df36415a29e508e5c9">remove_successor</a>( <a class="code" href="a00321.html">receiver<output_type></a> &r ) {
-<a name="l00543"></a>00543 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l00544"></a>00544 my_successors.remove_successor(r);
-<a name="l00545"></a>00545 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00546"></a>00546 }
-<a name="l00547"></a>00547
-<a name="l00549"></a><a class="code" href="a00330.html#41073ad4d3510ed5a8b6bda9c0f58636">00549</a> <span class="comment">/*override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00330.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a>( <a class="code" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v ) {
-<a name="l00550"></a>00550 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l00551"></a>00551 <span class="keywordflow">if</span> ( my_reserved )
-<a name="l00552"></a>00552 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00553"></a>00553
-<a name="l00554"></a>00554 <span class="keywordflow">if</span> ( my_has_cached_item ) {
-<a name="l00555"></a>00555 v = my_cached_item;
-<a name="l00556"></a>00556 my_has_cached_item = <span class="keyword">false</span>;
-<a name="l00557"></a>00557 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (*my_body)(v) == <span class="keyword">false</span> ) {
-<a name="l00558"></a>00558 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00559"></a>00559 }
-<a name="l00560"></a>00560 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00561"></a>00561 }
-<a name="l00562"></a>00562
-<a name="l00564"></a><a class="code" href="a00330.html#ad459713ff3c1c9ad0f4826daa141f65">00564</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00330.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>( <a class="code" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v ) {
-<a name="l00565"></a>00565 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l00566"></a>00566 <span class="keywordflow">if</span> ( my_reserved ) {
-<a name="l00567"></a>00567 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00568"></a>00568 }
-<a name="l00569"></a>00569
-<a name="l00570"></a>00570 <span class="keywordflow">if</span> ( !my_has_cached_item && (*my_body)(my_cached_item) )
-<a name="l00571"></a>00571 my_has_cached_item = <span class="keyword">true</span>;
-<a name="l00572"></a>00572
-<a name="l00573"></a>00573 <span class="keywordflow">if</span> ( my_has_cached_item ) {
-<a name="l00574"></a>00574 v = my_cached_item;
-<a name="l00575"></a>00575 my_reserved = <span class="keyword">true</span>;
-<a name="l00576"></a>00576 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00577"></a>00577 } <span class="keywordflow">else</span> {
-<a name="l00578"></a>00578 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00579"></a>00579 }
-<a name="l00580"></a>00580 }
-<a name="l00581"></a>00581
-<a name="l00583"></a>00583
-<a name="l00584"></a><a class="code" href="a00330.html#494678baf9096835268736b800824460">00584</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00330.html#494678baf9096835268736b800824460">try_release</a>( ) {
-<a name="l00585"></a>00585 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l00586"></a>00586 __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"releasing non-existent reservation"</span> );
-<a name="l00587"></a>00587 my_reserved = <span class="keyword">false</span>;
-<a name="l00588"></a>00588 <span class="keywordflow">if</span>(!my_successors.empty())
-<a name="l00589"></a>00589 spawn_put();
-<a name="l00590"></a>00590 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00591"></a>00591 }
-<a name="l00592"></a>00592
-<a name="l00594"></a><a class="code" href="a00330.html#2c7fcc29e2894b29138be3c1edce9bc9">00594</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00330.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>( ) {
-<a name="l00595"></a>00595 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l00596"></a>00596 __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"consuming non-existent reservation"</span> );
-<a name="l00597"></a>00597 my_reserved = <span class="keyword">false</span>;
-<a name="l00598"></a>00598 my_has_cached_item = <span class="keyword">false</span>;
-<a name="l00599"></a>00599 <span class="keywordflow">if</span> ( !my_successors.empty() ) {
-<a name="l00600"></a>00600 spawn_put();
-<a name="l00601"></a>00601 }
-<a name="l00602"></a>00602 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00603"></a>00603 }
-<a name="l00604"></a>00604
-<a name="l00606"></a><a class="code" href="a00330.html#4b647e4a93d08ccdd8d323279e4eaaa6">00606</a> <span class="keywordtype">void</span> <a class="code" href="a00330.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a>() {
-<a name="l00607"></a>00607 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l00608"></a>00608 my_active = <span class="keyword">true</span>;
-<a name="l00609"></a>00609 <span class="keywordflow">if</span> ( !my_successors.empty() )
-<a name="l00610"></a>00610 spawn_put();
-<a name="l00611"></a>00611 }
-<a name="l00612"></a>00612
-<a name="l00613"></a>00613 <span class="keyword">private</span>:
-<a name="l00614"></a>00614 <a class="code" href="a00337.html">task</a> *my_root_task;
-<a name="l00615"></a>00615 <a class="code" href="a00331.html">spin_mutex</a> my_mutex;
-<a name="l00616"></a>00616 <span class="keywordtype">bool</span> my_active;
-<a name="l00617"></a>00617 <span class="keywordtype">bool</span> init_my_active;
-<a name="l00618"></a>00618 internal::source_body<output_type> *my_body;
-<a name="l00619"></a>00619 internal::broadcast_cache< output_type > my_successors;
-<a name="l00620"></a>00620 <span class="keywordtype">bool</span> my_reserved;
-<a name="l00621"></a>00621 <span class="keywordtype">bool</span> my_has_cached_item;
-<a name="l00622"></a>00622 <a class="code" href="a00330.html#407533487cc3f6032c1072cba19c609c">output_type</a> my_cached_item;
-<a name="l00623"></a>00623
-<a name="l00624"></a>00624 <span class="keyword">friend</span> <span class="keyword">class </span>internal::source_task< source_node< output_type > >;
-<a name="l00625"></a>00625
-<a name="l00627"></a>00627 <span class="comment">/* override */</span> <span class="keywordtype">void</span> apply_body( ) {
-<a name="l00628"></a>00628 output_type v;
-<a name="l00629"></a>00629 <span class="keywordflow">if</span> ( <a class="code" href="a00330.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>(v) == <span class="keyword">false</span> )
-<a name="l00630"></a>00630 <span class="keywordflow">return</span>;
-<a name="l00631"></a>00631
-<a name="l00632"></a>00632 <span class="keywordflow">if</span> ( my_successors.try_put( v ) )
-<a name="l00633"></a>00633 <a class="code" href="a00330.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>();
-<a name="l00634"></a>00634 <span class="keywordflow">else</span>
-<a name="l00635"></a>00635 <a class="code" href="a00330.html#494678baf9096835268736b800824460">try_release</a>();
-<a name="l00636"></a>00636 }
-<a name="l00637"></a>00637
-<a name="l00639"></a>00639 <span class="comment">/* override */</span> <span class="keywordtype">void</span> spawn_put( ) {
-<a name="l00640"></a>00640 <a class="code" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l00641"></a>00641 internal::source_task< <a class="code" href="a00330.html">source_node< output_type ></a> >( *<span class="keyword">this</span> ) );
-<a name="l00642"></a>00642 }
-<a name="l00643"></a>00643 };
-<a name="l00644"></a>00644
-<a name="l00646"></a>00646 <span class="keyword">template</span> < <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output = continue_msg, graph_buffer_policy = queueing, <span class="keyword">typename</span> Allocator=cache_aligned_allocator<Input> >
-<a name="l00647"></a><a class="code" href="a00286.html">00647</a> <span class="keyword">class </span><a class="code" href="a00286.html">function_node</a> : <span class="keyword">public</span> <a class="code" href="a00289.html">graph_node</a>, <span class="keyword">public</span> internal::function_input<Input,Output,Allocator>, <span class="keyword">public</span> internal::function_output<Output> {
-<a name="l00648"></a>00648 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l00649"></a>00649 <span class="keyword">public</span>:
-<a name="l00650"></a>00650 <span class="keyword">typedef</span> Input input_type;
-<a name="l00651"></a>00651 <span class="keyword">typedef</span> Output output_type;
-<a name="l00652"></a>00652 <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< input_type ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l00653"></a>00653 <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< output_type ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l00654"></a>00654 <span class="keyword">typedef</span> internal::function_input<input_type,output_type,Allocator> fInput_type;
-<a name="l00655"></a>00655 <span class="keyword">typedef</span> internal::function_output<output_type> fOutput_type;
-<a name="l00656"></a>00656
-<a name="l00658"></a>00658 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00659"></a><a class="code" href="a00286.html#5c215b40e3daf73d1c6802ecb5aded6c">00659</a> <a class="code" href="a00286.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <a class="code" href="a00288.html">graph</a> &g, size_t concurrency, Body body ) :
-<a name="l00660"></a>00660 <a class="code" href="a00289.html">graph_node</a>(g), internal::function_input<input_type,output_type,Allocator>(g, concurrency, body)
-<a name="l00661"></a>00661 {}
-<a name="l00662"></a>00662
-<a name="l00664"></a><a class="code" href="a00286.html#d5132323fd2ac6a00ea0c78beda78723">00664</a> <a class="code" href="a00286.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <span class="keyword">const</span> <a class="code" href="a00286.html">function_node</a>& src ) :
-<a name="l00665"></a>00665 <a class="code" href="a00289.html">graph_node</a>(src.my_graph), internal::function_input<input_type,output_type,Allocator>( src ),
-<a name="l00666"></a>00666 fOutput_type()
-<a name="l00667"></a>00667 {}
-<a name="l00668"></a>00668
-<a name="l00669"></a>00669 <span class="keywordtype">bool</span> try_put(<span class="keyword">const</span> input_type &i) { <span class="keywordflow">return</span> fInput_type::try_put(i); }
-<a name="l00670"></a>00670
-<a name="l00671"></a>00671 <span class="keyword">protected</span>:
-<a name="l00672"></a>00672 <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> fOutput_type::my_successors; }
-<a name="l00673"></a>00673 };
-<a name="l00674"></a>00674
-<a name="l00676"></a>00676 <span class="keyword">template</span> < <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output, <span class="keyword">typename</span> Allocator >
-<a name="l00677"></a><a class="code" href="a00287.html">00677</a> <span class="keyword">class </span><a class="code" href="a00286.html">function_node</a><Input,Output,queueing,Allocator> : <span class="keyword">public</span> <a class="code" href="a00289.html">graph_node</a>, <span class="keyword">public</span> internal::function_input<Input,Output,Allocator>, <span class="keyword">public</span> internal::function_output<Output> {
-<a name="l00678"></a>00678 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l00679"></a>00679 <span class="keyword">public</span>:
-<a name="l00680"></a>00680 <span class="keyword">typedef</span> Input input_type;
-<a name="l00681"></a>00681 <span class="keyword">typedef</span> Output output_type;
-<a name="l00682"></a>00682 <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< input_type ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l00683"></a>00683 <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< output_type ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l00684"></a>00684 <span class="keyword">typedef</span> internal::function_input<input_type,output_type,Allocator> fInput_type;
-<a name="l00685"></a>00685 <span class="keyword">typedef</span> internal::function_input_queue<input_type, Allocator> queue_type;
-<a name="l00686"></a>00686 <span class="keyword">typedef</span> internal::function_output<output_type> fOutput_type;
-<a name="l00687"></a>00687
-<a name="l00689"></a>00689 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00690"></a><a class="code" href="a00287.html#5b9019c1e6e9b2c41c986a384bd179db">00690</a> <a class="code" href="a00286.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <a class="code" href="a00288.html">graph</a> &g, size_t concurrency, Body body ) :
-<a name="l00691"></a>00691 <a class="code" href="a00289.html">graph_node</a>(g), fInput_type( g, concurrency, body, new queue_type() )
-<a name="l00692"></a>00692 {}
-<a name="l00693"></a>00693
-<a name="l00695"></a><a class="code" href="a00287.html#01055081ed477714503820035db3a965">00695</a> <a class="code" href="a00286.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <span class="keyword">const</span> <a class="code" href="a00286.html">function_node</a>& src ) :
-<a name="l00696"></a>00696 <a class="code" href="a00289.html">graph_node</a>(src.my_graph), fInput_type( src, new queue_type() ), fOutput_type()
-<a name="l00697"></a>00697 {}
-<a name="l00698"></a>00698
-<a name="l00699"></a>00699 <span class="keywordtype">bool</span> try_put(<span class="keyword">const</span> input_type &i) { <span class="keywordflow">return</span> fInput_type::try_put(i); }
-<a name="l00700"></a>00700
-<a name="l00701"></a>00701 <span class="keyword">protected</span>:
-<a name="l00702"></a>00702 <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> fOutput_type::my_successors; }
-<a name="l00703"></a>00703 };
-<a name="l00704"></a>00704
-<a name="l00705"></a>00705 <span class="preprocessor">#include "tbb/internal/_flow_graph_types_impl.h"</span>
-<a name="l00706"></a>00706
-<a name="l00708"></a>00708 <span class="comment">// Output is a tuple of output types.</span>
-<a name="l00709"></a>00709 <span class="keyword">template</span> < <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output, graph_buffer_policy = queueing, <span class="keyword">typename</span> Allocator=cache_aligned_allocator<Input> >
-<a name="l00710"></a><a class="code" href="a00300.html">00710</a> <span class="keyword">class </span><a class="code" href="a00300.html">multifunction_node</a> :
-<a name="l00711"></a>00711 <span class="keyword">public</span> <a class="code" href="a00289.html">graph_node</a>,
-<a name="l00712"></a>00712 <span class="keyword">public</span> internal::multifunction_input
-<a name="l00713"></a>00713 <
-<a name="l00714"></a>00714 Input,
-<a name="l00715"></a>00715 typename internal::wrap_tuple_elements<
-<a name="l00716"></a>00716 std::tuple_size<Output>::value, <span class="comment">// #elements in tuple</span>
-<a name="l00717"></a>00717 internal::function_output, <span class="comment">// wrap this around each element</span>
-<a name="l00718"></a>00718 Output <span class="comment">// the tuple providing the types</span>
-<a name="l00719"></a>00719 >::type,
-<a name="l00720"></a>00720 Allocator
-<a name="l00721"></a>00721 > {
-<a name="l00722"></a>00722 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l00723"></a>00723 <span class="keyword">private</span>:
-<a name="l00724"></a>00724 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<Output>::value;
-<a name="l00725"></a>00725 <span class="keyword">public</span>:
-<a name="l00726"></a>00726 <span class="keyword">typedef</span> Input input_type;
-<a name="l00727"></a>00727 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::wrap_tuple_elements<N,internal::function_output, Output>::type output_ports_type;
-<a name="l00728"></a>00728 <span class="keyword">private</span>:
-<a name="l00729"></a>00729 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::multifunction_input<input_type, output_ports_type, Allocator> base_type;
-<a name="l00730"></a>00730 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::function_input_queue<input_type,Allocator> queue_type;
-<a name="l00731"></a>00731 <span class="keyword">public</span>:
-<a name="l00732"></a>00732 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00733"></a>00733 <a class="code" href="a00300.html">multifunction_node</a>( <a class="code" href="a00288.html">graph</a> &g, size_t concurrency, Body body ) :
-<a name="l00734"></a>00734 <a class="code" href="a00289.html">graph_node</a>(g), base_type(g,concurrency, body)
-<a name="l00735"></a>00735 {}
-<a name="l00736"></a>00736 <a class="code" href="a00300.html">multifunction_node</a>( <span class="keyword">const</span> <a class="code" href="a00300.html">multifunction_node</a> &other) :
-<a name="l00737"></a>00737 <a class="code" href="a00289.html">graph_node</a>(other.<a class="code" href="a00289.html#6f51137fff91095fa3e6a736b71c27cc">my_graph</a>), base_type(other)
-<a name="l00738"></a>00738 {}
-<a name="l00739"></a>00739 <span class="comment">// all the guts are in multifunction_input...</span>
-<a name="l00740"></a>00740 }; <span class="comment">// multifunction_node</span>
-<a name="l00741"></a>00741
-<a name="l00742"></a>00742 <span class="keyword">template</span> < <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output, <span class="keyword">typename</span> Allocator >
-<a name="l00743"></a>00743 <span class="keyword">class </span><a class="code" href="a00300.html">multifunction_node</a><Input,Output,queueing,Allocator> : <span class="keyword">public</span> <a class="code" href="a00289.html">graph_node</a>, <span class="keyword">public</span> internal::multifunction_input<Input,
-<a name="l00744"></a>00744 typename internal::wrap_tuple_elements<std::tuple_size<Output>::value, internal::function_output, Output>::type, Allocator> {
-<a name="l00745"></a>00745 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l00746"></a>00746 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<Output>::value;
-<a name="l00747"></a>00747 <span class="keyword">public</span>:
-<a name="l00748"></a>00748 <span class="keyword">typedef</span> Input input_type;
-<a name="l00749"></a>00749 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::wrap_tuple_elements<N, internal::function_output, Output>::type output_ports_type;
-<a name="l00750"></a>00750 <span class="keyword">private</span>:
-<a name="l00751"></a>00751 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::multifunction_input<input_type, output_ports_type, Allocator> base_type;
-<a name="l00752"></a>00752 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::function_input_queue<input_type,Allocator> queue_type;
-<a name="l00753"></a>00753 <span class="keyword">public</span>:
-<a name="l00754"></a>00754 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00755"></a>00755 <a class="code" href="a00300.html">multifunction_node</a>( <a class="code" href="a00288.html">graph</a> &g, size_t concurrency, Body body) :
-<a name="l00756"></a>00756 <a class="code" href="a00289.html">graph_node</a>(g), base_type(g,concurrency, body, new queue_type())
-<a name="l00757"></a>00757 {}
-<a name="l00758"></a>00758 <a class="code" href="a00300.html">multifunction_node</a>( <span class="keyword">const</span> <a class="code" href="a00300.html">multifunction_node</a> &other) :
-<a name="l00759"></a>00759 <a class="code" href="a00289.html">graph_node</a>(other.my_graph), base_type(other, new queue_type())
-<a name="l00760"></a>00760 {}
-<a name="l00761"></a>00761 }; <span class="comment">// multifunction_node</span>
-<a name="l00762"></a>00762
-<a name="l00764"></a>00764 <span class="comment">// successors. The node has unlimited concurrency, so though it is marked as</span>
-<a name="l00765"></a>00765 <span class="comment">// "rejecting" it does not reject inputs.</span>
-<a name="l00766"></a>00766 <span class="keyword">template</span><<span class="keyword">typename</span> TupleType, <span class="keyword">typename</span> Allocator=cache_aligned_allocator<TupleType> >
-<a name="l00767"></a><a class="code" href="a00336.html">00767</a> <span class="keyword">class </span><a class="code" href="a00336.html">split_node</a> : <span class="keyword">public</span> <a class="code" href="a00300.html">multifunction_node</a><TupleType, TupleType, rejecting, Allocator> {
-<a name="l00768"></a>00768 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<TupleType>::value;
-<a name="l00769"></a>00769 <span class="keyword">typedef</span> <a class="code" href="a00300.html">multifunction_node<TupleType,TupleType,rejecting,Allocator></a> <a class="code" href="a00300.html">base_type</a>;
-<a name="l00770"></a>00770 <span class="keyword">public</span>:
-<a name="l00771"></a>00771 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::output_ports_type output_ports_type;
-<a name="l00772"></a>00772 <span class="keyword">private</span>:
-<a name="l00773"></a>00773 <span class="keyword">struct </span>splitting_body {
-<a name="l00774"></a>00774 <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> TupleType& t, output_ports_type &p) {
-<a name="l00775"></a>00775 internal::emit_element<N>::emit_this(t, p);
-<a name="l00776"></a>00776 }
-<a name="l00777"></a>00777 };
-<a name="l00778"></a>00778 <span class="keyword">public</span>:
-<a name="l00779"></a>00779 <span class="keyword">typedef</span> TupleType input_type;
-<a name="l00780"></a>00780 <span class="keyword">typedef</span> Allocator allocator_type;
-<a name="l00781"></a>00781 <a class="code" href="a00336.html">split_node</a>(<a class="code" href="a00288.html">graph</a> &g) : <a class="code" href="a00300.html">base_type</a>(g, unlimited, splitting_body()) {}
-<a name="l00782"></a>00782 <a class="code" href="a00336.html">split_node</a>( <span class="keyword">const</span> <a class="code" href="a00336.html">split_node</a> & other) : <a class="code" href="a00300.html">base_type</a>(other) {}
-<a name="l00783"></a>00783 };
-<a name="l00784"></a>00784
-<a name="l00786"></a>00786 <span class="keyword">template</span> <<span class="keyword">typename</span> Output>
-<a name="l00787"></a><a class="code" href="a00278.html">00787</a> <span class="keyword">class </span><a class="code" href="a00278.html">continue_node</a> : <span class="keyword">public</span> <a class="code" href="a00289.html">graph_node</a>, <span class="keyword">public</span> internal::continue_input<Output>, <span class="keyword">public</span> internal::function_output<Output> {
-<a name="l00788"></a>00788 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l00789"></a>00789 <span class="keyword">public</span>:
-<a name="l00790"></a>00790 <span class="keyword">typedef</span> <a class="code" href="a00277.html">continue_msg</a> <a class="code" href="a00277.html">input_type</a>;
-<a name="l00791"></a>00791 <span class="keyword">typedef</span> Output output_type;
-<a name="l00792"></a>00792 <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< input_type ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l00793"></a>00793 <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< output_type ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l00794"></a>00794 <span class="keyword">typedef</span> internal::function_output<output_type> fOutput_type;
-<a name="l00795"></a>00795
-<a name="l00797"></a>00797 <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
-<a name="l00798"></a><a class="code" href="a00278.html#2f200db877d2f80c08d09422e8bffd5a">00798</a> <a class="code" href="a00278.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>( <a class="code" href="a00288.html">graph</a> &g, Body body ) :
-<a name="l00799"></a>00799 <a class="code" href="a00289.html">graph_node</a>(g), internal::continue_input<output_type>( g, body )
-<a name="l00800"></a>00800 {}
-<a name="l00801"></a>00801
-<a name="l00803"></a>00803 <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
-<a name="l00804"></a><a class="code" href="a00278.html#7817aebf22dd125ca04df53ac488d163">00804</a> <a class="code" href="a00278.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>( <a class="code" href="a00288.html">graph</a> &g, <span class="keywordtype">int</span> number_of_predecessors, Body body ) :
-<a name="l00805"></a>00805 <a class="code" href="a00289.html">graph_node</a>(g), internal::continue_input<output_type>( g, number_of_predecessors, body )
-<a name="l00806"></a>00806 {}
-<a name="l00807"></a>00807
-<a name="l00809"></a><a class="code" href="a00278.html#869562787fcb5c57a90aea120f26d492">00809</a> <a class="code" href="a00278.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>( <span class="keyword">const</span> <a class="code" href="a00278.html">continue_node</a>& src ) :
-<a name="l00810"></a>00810 <a class="code" href="a00289.html">graph_node</a>(src.my_graph), internal::continue_input<output_type>(src),
-<a name="l00811"></a>00811 internal::function_output<Output>()
-<a name="l00812"></a>00812 {}
-<a name="l00813"></a>00813
-<a name="l00814"></a>00814 <span class="keywordtype">bool</span> try_put(<span class="keyword">const</span> input_type &i) { <span class="keywordflow">return</span> internal::continue_input<Output>::try_put(i); }
-<a name="l00815"></a>00815
-<a name="l00816"></a>00816 <span class="keyword">protected</span>:
-<a name="l00817"></a>00817 <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> fOutput_type::my_successors; }
-<a name="l00818"></a>00818 };
-<a name="l00819"></a>00819
-<a name="l00820"></a>00820 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l00821"></a>00821 <span class="keyword">class </span>overwrite_node : <span class="keyword">public</span> graph_node, <span class="keyword">public</span> receiver<T>, <span class="keyword">public</span> sender<T> {
-<a name="l00822"></a>00822 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l00823"></a>00823 <span class="keyword">public</span>:
-<a name="l00824"></a>00824 <span class="keyword">typedef</span> T input_type;
-<a name="l00825"></a>00825 <span class="keyword">typedef</span> T output_type;
-<a name="l00826"></a>00826 <span class="keyword">typedef</span> sender< input_type > predecessor_type;
-<a name="l00827"></a>00827 <span class="keyword">typedef</span> receiver< output_type > successor_type;
-<a name="l00828"></a>00828
-<a name="l00829"></a>00829 overwrite_node(graph &g) : graph_node(g), my_buffer_is_valid(false) {
-<a name="l00830"></a>00830 my_successors.set_owner( <span class="keyword">this</span> );
-<a name="l00831"></a>00831 }
-<a name="l00832"></a>00832
-<a name="l00833"></a>00833 <span class="comment">// Copy constructor; doesn't take anything from src; default won't work</span>
-<a name="l00834"></a>00834 overwrite_node( <span class="keyword">const</span> overwrite_node& src ) :
-<a name="l00835"></a>00835 graph_node(src.my_graph), receiver<T>(), sender<T>(), my_buffer_is_valid(false)
-<a name="l00836"></a>00836 {
-<a name="l00837"></a>00837 my_successors.set_owner( <span class="keyword">this</span> );
-<a name="l00838"></a>00838 }
-<a name="l00839"></a>00839
-<a name="l00840"></a>00840 ~overwrite_node() {}
-<a name="l00841"></a>00841
-<a name="l00842"></a>00842 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00327.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>( successor_type &s ) {
-<a name="l00843"></a>00843 spin_mutex::scoped_lock l( my_mutex );
-<a name="l00844"></a>00844 <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
-<a name="l00845"></a>00845 <span class="comment">// We have a valid value that must be forwarded immediately.</span>
-<a name="l00846"></a>00846 <span class="keywordflow">if</span> ( s.try_put( my_buffer ) || !s.register_predecessor( *<span class="keyword">this</span> ) ) {
-<a name="l00847"></a>00847 <span class="comment">// We add the successor: it accepted our put or it rejected it but won't let use become a predecessor</span>
-<a name="l00848"></a>00848 my_successors.register_successor( s );
-<a name="l00849"></a>00849 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00850"></a>00850 } <span class="keywordflow">else</span> {
-<a name="l00851"></a>00851 <span class="comment">// We don't add the successor: it rejected our put and we became its predecessor instead</span>
-<a name="l00852"></a>00852 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00853"></a>00853 }
-<a name="l00854"></a>00854 } <span class="keywordflow">else</span> {
-<a name="l00855"></a>00855 <span class="comment">// No valid value yet, just add as successor</span>
-<a name="l00856"></a>00856 my_successors.register_successor( s );
-<a name="l00857"></a>00857 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00858"></a>00858 }
-<a name="l00859"></a>00859 }
-<a name="l00860"></a>00860
-<a name="l00861"></a>00861 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00327.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>( successor_type &s ) {
-<a name="l00862"></a>00862 spin_mutex::scoped_lock l( my_mutex );
-<a name="l00863"></a>00863 my_successors.remove_successor(s);
-<a name="l00864"></a>00864 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00865"></a>00865 }
-<a name="l00866"></a>00866
-<a name="l00867"></a>00867 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( <span class="keyword">const</span> T &v ) {
-<a name="l00868"></a>00868 spin_mutex::scoped_lock l( my_mutex );
-<a name="l00869"></a>00869 my_buffer = v;
-<a name="l00870"></a>00870 my_buffer_is_valid = <span class="keyword">true</span>;
-<a name="l00871"></a>00871 my_successors.try_put(v);
-<a name="l00872"></a>00872 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00873"></a>00873 }
-<a name="l00874"></a>00874
-<a name="l00875"></a>00875 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_get( T &v ) {
-<a name="l00876"></a>00876 spin_mutex::scoped_lock l( my_mutex );
-<a name="l00877"></a>00877 <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
-<a name="l00878"></a>00878 v = my_buffer;
-<a name="l00879"></a>00879 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00880"></a>00880 } <span class="keywordflow">else</span> {
-<a name="l00881"></a>00881 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00882"></a>00882 }
-<a name="l00883"></a>00883 }
-<a name="l00884"></a>00884
-<a name="l00885"></a>00885 <span class="keywordtype">bool</span> is_valid() {
-<a name="l00886"></a>00886 spin_mutex::scoped_lock l( my_mutex );
-<a name="l00887"></a>00887 <span class="keywordflow">return</span> my_buffer_is_valid;
-<a name="l00888"></a>00888 }
-<a name="l00889"></a>00889
-<a name="l00890"></a>00890 <span class="keywordtype">void</span> clear() {
-<a name="l00891"></a>00891 spin_mutex::scoped_lock l( my_mutex );
-<a name="l00892"></a>00892 my_buffer_is_valid = <span class="keyword">false</span>;
-<a name="l00893"></a>00893 }
-<a name="l00894"></a>00894
-<a name="l00895"></a>00895 <span class="keyword">protected</span>:
-<a name="l00896"></a>00896 spin_mutex my_mutex;
-<a name="l00897"></a>00897 internal::broadcast_cache< T, null_rw_mutex > my_successors;
-<a name="l00898"></a>00898 T my_buffer;
-<a name="l00899"></a>00899 <span class="keywordtype">bool</span> my_buffer_is_valid;
-<a name="l00900"></a>00900 };
-<a name="l00901"></a>00901
-<a name="l00902"></a>00902 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l00903"></a>00903 <span class="keyword">class </span>write_once_node : <span class="keyword">public</span> overwrite_node<T> {
-<a name="l00904"></a>00904 <span class="keyword">public</span>:
-<a name="l00905"></a>00905 <span class="keyword">typedef</span> T input_type;
-<a name="l00906"></a>00906 <span class="keyword">typedef</span> T output_type;
-<a name="l00907"></a>00907 <span class="keyword">typedef</span> sender< input_type > predecessor_type;
-<a name="l00908"></a>00908 <span class="keyword">typedef</span> receiver< output_type > successor_type;
-<a name="l00909"></a>00909
-<a name="l00911"></a>00911 write_once_node(graph& g) : overwrite_node<T>(g) {}
-<a name="l00912"></a>00912
-<a name="l00914"></a>00914 write_once_node( <span class="keyword">const</span> write_once_node& src ) : overwrite_node<T>(src) {}
-<a name="l00915"></a>00915
-<a name="l00916"></a>00916 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( <span class="keyword">const</span> T &v ) {
-<a name="l00917"></a>00917 spin_mutex::scoped_lock l( this->my_mutex );
-<a name="l00918"></a>00918 <span class="keywordflow">if</span> ( this->my_buffer_is_valid ) {
-<a name="l00919"></a>00919 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00920"></a>00920 } <span class="keywordflow">else</span> {
-<a name="l00921"></a>00921 this->my_buffer = v;
-<a name="l00922"></a>00922 this->my_buffer_is_valid = <span class="keyword">true</span>;
-<a name="l00923"></a>00923 this->my_successors.try_put(v);
-<a name="l00924"></a>00924 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00925"></a>00925 }
-<a name="l00926"></a>00926 }
-<a name="l00927"></a>00927 };
-<a name="l00928"></a>00928
-<a name="l00930"></a>00930 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00931"></a><a class="code" href="a00262.html">00931</a> <span class="keyword">class </span><a class="code" href="a00262.html">broadcast_node</a> : <span class="keyword">public</span> <a class="code" href="a00289.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00321.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00327.html">sender</a><T> {
-<a name="l00932"></a>00932 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l00933"></a>00933 internal::broadcast_cache<T> my_successors;
-<a name="l00934"></a>00934 <span class="keyword">public</span>:
-<a name="l00935"></a><a class="code" href="a00262.html#43c775d80e98cc601de69764983319f9">00935</a> <span class="keyword">typedef</span> T <a class="code" href="a00262.html#43c775d80e98cc601de69764983319f9">input_type</a>;
-<a name="l00936"></a><a class="code" href="a00262.html#8fd8d3075823e08b879be46c1215ab0f">00936</a> <span class="keyword">typedef</span> T output_type;
-<a name="l00937"></a><a class="code" href="a00262.html#0e2ad9a121cb286aa0d0142fef33c646">00937</a> <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< input_type ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l00938"></a><a class="code" href="a00262.html#cc6a0eb1c4ee65465770628d8366f055">00938</a> <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< output_type ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l00939"></a>00939
-<a name="l00940"></a>00940 <a class="code" href="a00262.html">broadcast_node</a>(<a class="code" href="a00288.html">graph</a>& g) : <a class="code" href="a00289.html">graph_node</a>(g) {
-<a name="l00941"></a>00941 my_successors.set_owner( <span class="keyword">this</span> );
-<a name="l00942"></a>00942 }
-<a name="l00943"></a>00943
-<a name="l00944"></a>00944 <span class="comment">// Copy constructor</span>
-<a name="l00945"></a>00945 <a class="code" href="a00262.html">broadcast_node</a>( <span class="keyword">const</span> <a class="code" href="a00262.html">broadcast_node</a>& src ) :
-<a name="l00946"></a>00946 <a class="code" href="a00289.html">graph_node</a>(src.my_graph), <a class="code" href="a00321.html">receiver</a><T>(), <a class="code" href="a00327.html">sender</a><T>()
-<a name="l00947"></a>00947 {
-<a name="l00948"></a>00948 my_successors.set_owner( <span class="keyword">this</span> );
-<a name="l00949"></a>00949 }
-<a name="l00950"></a>00950
-<a name="l00952"></a><a class="code" href="a00262.html#fd0324c9ddb51fe6f95b3d015d338941">00952</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00262.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a>( <a class="code" href="a00321.html">receiver<T></a> &r ) {
-<a name="l00953"></a>00953 my_successors.register_successor( r );
-<a name="l00954"></a>00954 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00955"></a>00955 }
-<a name="l00956"></a>00956
-<a name="l00958"></a><a class="code" href="a00262.html#366efcc046ec08a104281109801ae629">00958</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00262.html#366efcc046ec08a104281109801ae629">remove_successor</a>( <a class="code" href="a00321.html">receiver<T></a> &r ) {
-<a name="l00959"></a>00959 my_successors.remove_successor( r );
-<a name="l00960"></a>00960 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00961"></a>00961 }
-<a name="l00962"></a>00962
-<a name="l00963"></a><a class="code" href="a00262.html#29eb768c10b377880bbf83d31ee49acf">00963</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00262.html#29eb768c10b377880bbf83d31ee49acf">try_put</a>( <span class="keyword">const</span> T &t ) {
-<a name="l00964"></a>00964 my_successors.try_put(t);
-<a name="l00965"></a>00965 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00966"></a>00966 }
-<a name="l00967"></a>00967 };
-<a name="l00968"></a>00968
-<a name="l00969"></a>00969 <span class="preprocessor">#include "internal/_flow_graph_item_buffer_impl.h"</span>
-<a name="l00970"></a>00970
-<a name="l00972"></a>00972 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
-<a name="l00973"></a><a class="code" href="a00263.html">00973</a> <span class="keyword">class </span><a class="code" href="a00263.html">buffer_node</a> : <span class="keyword">public</span> <a class="code" href="a00289.html">graph_node</a>, <span class="keyword">public</span> reservable_item_buffer<T, A>, <span class="keyword">public</span> <a class="code" href="a00321.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00327.html">sender</a><T> {
-<a name="l00974"></a>00974 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l00975"></a>00975 <span class="keyword">public</span>:
-<a name="l00976"></a><a class="code" href="a00263.html#334efb81b56a2f2b3ae08a16e8d65620">00976</a> <span class="keyword">typedef</span> T <a class="code" href="a00263.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a>;
-<a name="l00977"></a><a class="code" href="a00263.html#089520db81f6a1551dc94c01efbdd7be">00977</a> <span class="keyword">typedef</span> T output_type;
-<a name="l00978"></a><a class="code" href="a00263.html#5fb0ad03a822ca0fc34ad5d56a4093a2">00978</a> <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< input_type ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l00979"></a><a class="code" href="a00263.html#66f7eda69b75e08f50726e50a11429cd">00979</a> <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< output_type ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l00980"></a>00980 <span class="keyword">typedef</span> <a class="code" href="a00263.html">buffer_node<T, A></a> <a class="code" href="a00263.html">my_class</a>;
-<a name="l00981"></a>00981 <span class="keyword">protected</span>:
-<a name="l00982"></a>00982 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00983"></a>00983 internal::round_robin_cache< T, null_rw_mutex > my_successors;
-<a name="l00984"></a>00984
-<a name="l00985"></a>00985 <a class="code" href="a00337.html">task</a> *my_parent;
-<a name="l00986"></a>00986
-<a name="l00987"></a>00987 <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< buffer_node< T, A > >;
-<a name="l00988"></a>00988
-<a name="l00989"></a>00989 <span class="keyword">enum</span> op_type {reg_succ, rem_succ, req_item, res_item, rel_res, con_res, put_item, try_fwd};
-<a name="l00990"></a>00990 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l00991"></a>00991
-<a name="l00992"></a>00992 <span class="comment">// implements the aggregator_operation concept</span>
-<a name="l00993"></a>00993 <span class="keyword">class </span>buffer_operation : <span class="keyword">public</span> internal::aggregated_operation< buffer_operation > {
-<a name="l00994"></a>00994 <span class="keyword">public</span>:
-<a name="l00995"></a>00995 <span class="keywordtype">char</span> type;
-<a name="l00996"></a>00996 T *elem;
-<a name="l00997"></a>00997 <a class="code" href="a00263.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a> *r;
-<a name="l00998"></a>00998 buffer_operation(<span class="keyword">const</span> T& e, op_type t) :
-<a name="l00999"></a>00999 type(char(t)), elem(const_cast<T*>(&e)), r(NULL) {}
-<a name="l01000"></a>01000 buffer_operation(op_type t) : type(char(t)), r(NULL) {}
-<a name="l01001"></a>01001 };
-<a name="l01002"></a>01002
-<a name="l01003"></a>01003 <span class="keywordtype">bool</span> forwarder_busy;
-<a name="l01004"></a>01004 <span class="keyword">typedef</span> internal::aggregating_functor<my_class, buffer_operation> my_handler;
-<a name="l01005"></a>01005 <span class="keyword">friend</span> <span class="keyword">class </span>internal::aggregating_functor<my_class, buffer_operation>;
-<a name="l01006"></a>01006 internal::aggregator< my_handler, buffer_operation> my_aggregator;
-<a name="l01007"></a>01007
-<a name="l01008"></a>01008 <span class="keyword">virtual</span> <span class="keywordtype">void</span> handle_operations(buffer_operation *op_list) {
-<a name="l01009"></a>01009 buffer_operation *tmp;
-<a name="l01010"></a>01010 <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
-<a name="l01011"></a>01011 <span class="keywordflow">while</span> (op_list) {
-<a name="l01012"></a>01012 tmp = op_list;
-<a name="l01013"></a>01013 op_list = op_list->next;
-<a name="l01014"></a>01014 <span class="keywordflow">switch</span> (tmp->type) {
-<a name="l01015"></a>01015 <span class="keywordflow">case</span> reg_succ: <a class="code" href="a00263.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01016"></a>01016 <span class="keywordflow">case</span> rem_succ: <a class="code" href="a00263.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01017"></a>01017 <span class="keywordflow">case</span> req_item: internal_pop(tmp); <span class="keywordflow">break</span>;
-<a name="l01018"></a>01018 <span class="keywordflow">case</span> res_item: internal_reserve(tmp); <span class="keywordflow">break</span>;
-<a name="l01019"></a>01019 <span class="keywordflow">case</span> rel_res: internal_release(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01020"></a>01020 <span class="keywordflow">case</span> con_res: internal_consume(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01021"></a>01021 <span class="keywordflow">case</span> put_item: internal_push(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01022"></a>01022 <span class="keywordflow">case</span> try_fwd: <a class="code" href="a00263.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01023"></a>01023 }
-<a name="l01024"></a>01024 }
-<a name="l01025"></a>01025 <span class="keywordflow">if</span> (try_forwarding && !forwarder_busy) {
-<a name="l01026"></a>01026 forwarder_busy = <span class="keyword">true</span>;
-<a name="l01027"></a>01027 <a class="code" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*my_parent)) internal::forward_task< buffer_node<input_type, A> >(*<span class="keyword">this</span>));
-<a name="l01028"></a>01028 }
-<a name="l01029"></a>01029 }
-<a name="l01030"></a>01030
-<a name="l01032"></a><a class="code" href="a00263.html#2648324ce0a38b40132b8502ef250e3a">01032</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00263.html#2648324ce0a38b40132b8502ef250e3a">forward</a>() {
-<a name="l01033"></a>01033 buffer_operation op_data(try_fwd);
-<a name="l01034"></a>01034 <span class="keywordflow">do</span> {
-<a name="l01035"></a>01035 op_data.status = WAIT;
-<a name="l01036"></a>01036 my_aggregator.execute(&op_data);
-<a name="l01037"></a>01037 } <span class="keywordflow">while</span> (op_data.status == SUCCEEDED);
-<a name="l01038"></a>01038 }
-<a name="l01039"></a>01039
-<a name="l01041"></a><a class="code" href="a00263.html#df21388252b8963e839dca29d2c67ea5">01041</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00263.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op) {
-<a name="l01042"></a>01042 my_successors.register_successor(*(op->r));
-<a name="l01043"></a>01043 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01044"></a>01044 }
-<a name="l01045"></a>01045
-<a name="l01047"></a><a class="code" href="a00263.html#6b6cf76dff80fd679251da93351c1291">01047</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00263.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op) {
-<a name="l01048"></a>01048 my_successors.remove_successor(*(op->r));
-<a name="l01049"></a>01049 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01050"></a>01050 }
-<a name="l01051"></a>01051
-<a name="l01053"></a><a class="code" href="a00263.html#dcbffbae514f4d95205b0845785c0a91">01053</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00263.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a>(buffer_operation *op) {
-<a name="l01054"></a>01054 T i_copy;
-<a name="l01055"></a>01055 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
-<a name="l01056"></a>01056 size_type counter = my_successors.size();
-<a name="l01057"></a>01057 <span class="comment">// Try forwarding, giving each successor a chance</span>
-<a name="l01058"></a>01058 <span class="keywordflow">while</span> (counter>0 && !this->buffer_empty() && this->item_valid(this->my_tail-1)) {
-<a name="l01059"></a>01059 this->fetch_back(i_copy);
-<a name="l01060"></a>01060 <span class="keywordflow">if</span>( my_successors.try_put(i_copy) ) {
-<a name="l01061"></a>01061 this->invalidate_back();
-<a name="l01062"></a>01062 --(this->my_tail);
-<a name="l01063"></a>01063 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
-<a name="l01064"></a>01064 }
-<a name="l01065"></a>01065 --counter;
-<a name="l01066"></a>01066 }
-<a name="l01067"></a>01067 <span class="keywordflow">if</span> (success && !counter)
-<a name="l01068"></a>01068 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01069"></a>01069 <span class="keywordflow">else</span> {
-<a name="l01070"></a>01070 __TBB_store_with_release(op->status, FAILED);
-<a name="l01071"></a>01071 forwarder_busy = <span class="keyword">false</span>;
-<a name="l01072"></a>01072 }
-<a name="l01073"></a>01073 }
-<a name="l01074"></a>01074
-<a name="l01075"></a>01075 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_push(buffer_operation *op) {
-<a name="l01076"></a>01076 this->push_back(*(op->elem));
-<a name="l01077"></a>01077 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01078"></a>01078 }
-<a name="l01079"></a>01079
-<a name="l01080"></a>01080 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_pop(buffer_operation *op) {
-<a name="l01081"></a>01081 <span class="keywordflow">if</span>(this->pop_back(*(op->elem))) {
-<a name="l01082"></a>01082 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01083"></a>01083 }
-<a name="l01084"></a>01084 <span class="keywordflow">else</span> {
-<a name="l01085"></a>01085 __TBB_store_with_release(op->status, FAILED);
-<a name="l01086"></a>01086 }
-<a name="l01087"></a>01087 }
-<a name="l01088"></a>01088
-<a name="l01089"></a>01089 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_reserve(buffer_operation *op) {
-<a name="l01090"></a>01090 <span class="keywordflow">if</span>(this->reserve_front(*(op->elem))) {
-<a name="l01091"></a>01091 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01092"></a>01092 }
-<a name="l01093"></a>01093 <span class="keywordflow">else</span> {
-<a name="l01094"></a>01094 __TBB_store_with_release(op->status, FAILED);
-<a name="l01095"></a>01095 }
-<a name="l01096"></a>01096 }
-<a name="l01097"></a>01097
-<a name="l01098"></a>01098 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_consume(buffer_operation *op) {
-<a name="l01099"></a>01099 this->consume_front();
-<a name="l01100"></a>01100 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01101"></a>01101 }
-<a name="l01102"></a>01102
-<a name="l01103"></a>01103 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_release(buffer_operation *op) {
-<a name="l01104"></a>01104 this->release_front();
-<a name="l01105"></a>01105 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01106"></a>01106 }
-<a name="l01107"></a>01107
-<a name="l01108"></a>01108 <span class="keyword">public</span>:
-<a name="l01110"></a><a class="code" href="a00263.html#5fe4b79f780586ff66e002ce32a5c60d">01110</a> <a class="code" href="a00263.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>( <a class="code" href="a00288.html">graph</a> &g ) : <a class="code" href="a00289.html">graph_node</a>(g), reservable_item_buffer<T>(),
-<a name="l01111"></a>01111 my_parent( g.root_task() ), forwarder_busy(false) {
-<a name="l01112"></a>01112 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01113"></a>01113 my_aggregator.initialize_handler(my_handler(<span class="keyword">this</span>));
-<a name="l01114"></a>01114 }
-<a name="l01115"></a>01115
-<a name="l01117"></a><a class="code" href="a00263.html#03ad7b85a8341437f584af06ad050cdc">01117</a> <a class="code" href="a00263.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>( <span class="keyword">const</span> buffer_node& src ) : <a class="code" href="a00289.html">graph_node</a>(src.my_graph),
-<a name="l01118"></a>01118 reservable_item_buffer<T>(), <a class="code" href="a00321.html">receiver</a><T>(), <a class="code" href="a00327.html">sender</a><T>(),
-<a name="l01119"></a>01119 my_parent( src.my_parent ) {
-<a name="l01120"></a>01120 forwarder_busy = <span class="keyword">false</span>;
-<a name="l01121"></a>01121 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01122"></a>01122 my_aggregator.initialize_handler(my_handler(<span class="keyword">this</span>));
-<a name="l01123"></a>01123 }
-<a name="l01124"></a>01124
-<a name="l01125"></a>01125 <span class="keyword">virtual</span> ~buffer_node() {}
-<a name="l01126"></a>01126
-<a name="l01127"></a>01127 <span class="comment">//</span>
-<a name="l01128"></a>01128 <span class="comment">// message sender implementation</span>
-<a name="l01129"></a>01129 <span class="comment">//</span>
-<a name="l01130"></a>01130
-<a name="l01132"></a>01132
-<a name="l01133"></a><a class="code" href="a00263.html#f8bf4944ede4fc106423d67715beb695">01133</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00263.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>( <a class="code" href="a00321.html">receiver<output_type></a> &r ) {
-<a name="l01134"></a>01134 buffer_operation op_data(reg_succ);
-<a name="l01135"></a>01135 op_data.r = &r;
-<a name="l01136"></a>01136 my_aggregator.execute(&op_data);
-<a name="l01137"></a>01137 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01138"></a>01138 }
-<a name="l01139"></a>01139
-<a name="l01141"></a>01141
-<a name="l01143"></a><a class="code" href="a00263.html#2074da0e39b9477c32897d6e5786196f">01143</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00263.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>( <a class="code" href="a00321.html">receiver<output_type></a> &r ) {
-<a name="l01144"></a>01144 r.<a class="code" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(*<span class="keyword">this</span>);
-<a name="l01145"></a>01145 buffer_operation op_data(rem_succ);
-<a name="l01146"></a>01146 op_data.r = &r;
-<a name="l01147"></a>01147 my_aggregator.execute(&op_data);
-<a name="l01148"></a>01148 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01149"></a>01149 }
-<a name="l01150"></a>01150
-<a name="l01152"></a>01152
-<a name="l01154"></a><a class="code" href="a00263.html#aeb8aec46ca99ca022356a792c46735e">01154</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00263.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>( T &v ) {
-<a name="l01155"></a>01155 buffer_operation op_data(req_item);
-<a name="l01156"></a>01156 op_data.elem = &v;
-<a name="l01157"></a>01157 my_aggregator.execute(&op_data);
-<a name="l01158"></a>01158 <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
-<a name="l01159"></a>01159 }
-<a name="l01160"></a>01160
-<a name="l01162"></a>01162
-<a name="l01164"></a><a class="code" href="a00263.html#1cc889bb6c38bcb81757d0ebbc3a5e64">01164</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00263.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>( T &v ) {
-<a name="l01165"></a>01165 buffer_operation op_data(res_item);
-<a name="l01166"></a>01166 op_data.elem = &v;
-<a name="l01167"></a>01167 my_aggregator.execute(&op_data);
-<a name="l01168"></a>01168 <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
-<a name="l01169"></a>01169 }
-<a name="l01170"></a>01170
-<a name="l01172"></a>01172
-<a name="l01173"></a><a class="code" href="a00263.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">01173</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00263.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>() {
-<a name="l01174"></a>01174 buffer_operation op_data(rel_res);
-<a name="l01175"></a>01175 my_aggregator.execute(&op_data);
-<a name="l01176"></a>01176 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01177"></a>01177 }
-<a name="l01178"></a>01178
-<a name="l01180"></a>01180
-<a name="l01181"></a><a class="code" href="a00263.html#8ef07c434eb763d947a7b4e80c086a49">01181</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00263.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>() {
-<a name="l01182"></a>01182 buffer_operation op_data(con_res);
-<a name="l01183"></a>01183 my_aggregator.execute(&op_data);
-<a name="l01184"></a>01184 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01185"></a>01185 }
-<a name="l01186"></a>01186
-<a name="l01188"></a>01188
-<a name="l01189"></a><a class="code" href="a00263.html#2b02fe332e704bbe14f297802298b63a">01189</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00263.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(<span class="keyword">const</span> T &t) {
-<a name="l01190"></a>01190 buffer_operation op_data(t, put_item);
-<a name="l01191"></a>01191 my_aggregator.execute(&op_data);
-<a name="l01192"></a>01192 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01193"></a>01193 }
-<a name="l01194"></a>01194 };
-<a name="l01195"></a>01195
-<a name="l01197"></a>01197 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
-<a name="l01198"></a><a class="code" href="a00313.html">01198</a> <span class="keyword">class </span><a class="code" href="a00313.html">queue_node</a> : <span class="keyword">public</span> buffer_node<T, A> {
-<a name="l01199"></a>01199 <span class="keyword">protected</span>:
-<a name="l01200"></a>01200 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00263.html">buffer_node<T, A>::size_type</a> size_type;
-<a name="l01201"></a>01201 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00263.html">buffer_node<T, A>::buffer_operation</a> queue_operation;
-<a name="l01202"></a>01202
-<a name="l01203"></a>01203 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01204"></a>01204
-<a name="l01206"></a><a class="code" href="a00313.html#eadcbbb81f9a9d223afabe0f40e77ecb">01206</a> <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00313.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a>(queue_operation *op) {
-<a name="l01207"></a>01207 T i_copy;
-<a name="l01208"></a>01208 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
-<a name="l01209"></a>01209 size_type counter = this->my_successors.size();
-<a name="l01210"></a>01210 <span class="keywordflow">if</span> (this->my_reserved || !this->item_valid(this->my_head)) {
-<a name="l01211"></a>01211 __TBB_store_with_release(op->status, FAILED);
-<a name="l01212"></a>01212 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01213"></a>01213 <span class="keywordflow">return</span>;
-<a name="l01214"></a>01214 }
-<a name="l01215"></a>01215 <span class="comment">// Keep trying to send items while there is at least one accepting successor</span>
-<a name="l01216"></a>01216 <span class="keywordflow">while</span> (counter>0 && this->item_valid(this->my_head)) {
-<a name="l01217"></a>01217 this->fetch_front(i_copy);
-<a name="l01218"></a>01218 <span class="keywordflow">if</span>(this->my_successors.try_put(i_copy)) {
-<a name="l01219"></a>01219 this->invalidate_front();
-<a name="l01220"></a>01220 ++(this->my_head);
-<a name="l01221"></a>01221 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
-<a name="l01222"></a>01222 }
-<a name="l01223"></a>01223 --counter;
-<a name="l01224"></a>01224 }
-<a name="l01225"></a>01225 <span class="keywordflow">if</span> (success && !counter)
-<a name="l01226"></a>01226 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01227"></a>01227 <span class="keywordflow">else</span> {
-<a name="l01228"></a>01228 __TBB_store_with_release(op->status, FAILED);
-<a name="l01229"></a>01229 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01230"></a>01230 }
-<a name="l01231"></a>01231 }
-<a name="l01232"></a>01232
-<a name="l01233"></a>01233 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(queue_operation *op) {
-<a name="l01234"></a>01234 <span class="keywordflow">if</span> ( this->my_reserved || !this->item_valid(this->my_head)){
-<a name="l01235"></a>01235 __TBB_store_with_release(op->status, FAILED);
-<a name="l01236"></a>01236 }
-<a name="l01237"></a>01237 <span class="keywordflow">else</span> {
-<a name="l01238"></a>01238 this->pop_front(*(op->elem));
-<a name="l01239"></a>01239 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01240"></a>01240 }
-<a name="l01241"></a>01241 }
-<a name="l01242"></a>01242 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(queue_operation *op) {
-<a name="l01243"></a>01243 <span class="keywordflow">if</span> (this->my_reserved || !this->item_valid(this->my_head)) {
-<a name="l01244"></a>01244 __TBB_store_with_release(op->status, FAILED);
-<a name="l01245"></a>01245 }
-<a name="l01246"></a>01246 <span class="keywordflow">else</span> {
-<a name="l01247"></a>01247 this->my_reserved = <span class="keyword">true</span>;
-<a name="l01248"></a>01248 this->fetch_front(*(op->elem));
-<a name="l01249"></a>01249 this->invalidate_front();
-<a name="l01250"></a>01250 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01251"></a>01251 }
-<a name="l01252"></a>01252 }
-<a name="l01253"></a>01253 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(queue_operation *op) {
-<a name="l01254"></a>01254 this->consume_front();
-<a name="l01255"></a>01255 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01256"></a>01256 }
-<a name="l01257"></a>01257
-<a name="l01258"></a>01258 <span class="keyword">public</span>:
-<a name="l01259"></a><a class="code" href="a00313.html#1e71030845210b6c4c7380eb9e11a2ac">01259</a> <span class="keyword">typedef</span> T <a class="code" href="a00313.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a>;
-<a name="l01260"></a><a class="code" href="a00313.html#25b5a53ab1f9a342644fa3759bc0b1ad">01260</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01261"></a><a class="code" href="a00313.html#5e2fdd33c45d44549dee9c1638e19898">01261</a> <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< input_type ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l01262"></a><a class="code" href="a00313.html#f35076a19f256f9e7a61bed77ca1ccc5">01262</a> <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< output_type ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l01263"></a>01263
-<a name="l01265"></a><a class="code" href="a00313.html#c716593a92448b0f429d1f3a38e67996">01265</a> <a class="code" href="a00313.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>( <a class="code" href="a00288.html">graph</a> &g ) : buffer_node<T, A>(g) {}
-<a name="l01266"></a>01266
-<a name="l01268"></a><a class="code" href="a00313.html#0226762d9ebba28311b7b1518d948ab1">01268</a> <a class="code" href="a00313.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>( <span class="keyword">const</span> <a class="code" href="a00313.html">queue_node</a>& src) : buffer_node<T, A>(src) {}
-<a name="l01269"></a>01269 };
-<a name="l01270"></a>01270
-<a name="l01272"></a>01272 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
-<a name="l01273"></a><a class="code" href="a00328.html">01273</a> <span class="keyword">class </span><a class="code" href="a00328.html">sequencer_node</a> : <span class="keyword">public</span> <a class="code" href="a00313.html">queue_node</a><T, A> {
-<a name="l01274"></a>01274 internal::function_body< T, size_t > *my_sequencer;
-<a name="l01275"></a>01275 <span class="keyword">public</span>:
-<a name="l01276"></a><a class="code" href="a00328.html#af629f26832ff4e476e240637a78bc0c">01276</a> <span class="keyword">typedef</span> T <a class="code" href="a00328.html#af629f26832ff4e476e240637a78bc0c">input_type</a>;
-<a name="l01277"></a><a class="code" href="a00328.html#ca026eaef70e35791c407323199031a7">01277</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01278"></a><a class="code" href="a00328.html#8127e36811832563fe1e9bc3ba391f79">01278</a> <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< input_type ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l01279"></a><a class="code" href="a00328.html#795f3ee75f133b9d3b159172fc4a197f">01279</a> <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< output_type ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l01280"></a>01280
-<a name="l01282"></a>01282 <span class="keyword">template</span>< <span class="keyword">typename</span> Sequencer >
-<a name="l01283"></a><a class="code" href="a00328.html#7e71cbdf78f989091bc162b89bee7e66">01283</a> <a class="code" href="a00328.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>( <a class="code" href="a00288.html">graph</a> &g, <span class="keyword">const</span> Sequencer& s ) : <a class="code" href="a00313.html">queue_node</a><T, A>(g),
-<a name="l01284"></a>01284 my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {}
-<a name="l01285"></a>01285
-<a name="l01287"></a><a class="code" href="a00328.html#b38e7a070552960384bcc1d91af13a5c">01287</a> <a class="code" href="a00328.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>( <span class="keyword">const</span> <a class="code" href="a00328.html">sequencer_node</a>& src ) : <a class="code" href="a00313.html">queue_node</a><T, A>(src),
-<a name="l01288"></a>01288 my_sequencer( src.my_sequencer->clone() ) {}
-<a name="l01289"></a>01289
-<a name="l01291"></a><a class="code" href="a00328.html#93d3d8f6a72b3e1387047282116ed6ee">01291</a> <a class="code" href="a00328.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a>() { <span class="keyword">delete</span> my_sequencer; }
-<a name="l01292"></a>01292 <span class="keyword">protected</span>:
-<a name="l01293"></a>01293 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00263.html">buffer_node<T, A>::size_type</a> size_type;
-<a name="l01294"></a>01294 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00263.html">buffer_node<T, A>::buffer_operation</a> sequencer_operation;
-<a name="l01295"></a>01295
-<a name="l01296"></a>01296 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01297"></a>01297
-<a name="l01298"></a>01298 <span class="keyword">private</span>:
-<a name="l01299"></a>01299 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(sequencer_operation *op) {
-<a name="l01300"></a>01300 size_type tag = (*my_sequencer)(*(op->elem));
-<a name="l01301"></a>01301
-<a name="l01302"></a>01302 this->my_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;
-<a name="l01303"></a>01303
-<a name="l01304"></a>01304 <span class="keywordflow">if</span>(this->size() > this->capacity())
-<a name="l01305"></a>01305 this->grow_my_array(this->size()); <span class="comment">// tail already has 1 added to it</span>
-<a name="l01306"></a>01306 this->item(tag) = std::make_pair( *(op->elem), <span class="keyword">true</span> );
-<a name="l01307"></a>01307 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01308"></a>01308 }
-<a name="l01309"></a>01309 };
-<a name="l01310"></a>01310
-<a name="l01312"></a>01312 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> Compare = std::less<T>, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
-<a name="l01313"></a><a class="code" href="a00312.html">01313</a> <span class="keyword">class </span><a class="code" href="a00312.html">priority_queue_node</a> : <span class="keyword">public</span> buffer_node<T, A> {
-<a name="l01314"></a>01314 <span class="keyword">public</span>:
-<a name="l01315"></a><a class="code" href="a00312.html#b2829b518979874ad3d2a939e14ae7bd">01315</a> <span class="keyword">typedef</span> T <a class="code" href="a00312.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a>;
-<a name="l01316"></a><a class="code" href="a00312.html#2cb099b590246b6bc93cc15e78c6ee5c">01316</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01317"></a><a class="code" href="a00312.html#fdea783bf9d5a4c98e794ac7e0f84ccf">01317</a> <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< input_type ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l01318"></a><a class="code" href="a00312.html#09ab5064ca8192e68c03da47603e68eb">01318</a> <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< output_type ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l01319"></a>01319
-<a name="l01321"></a><a class="code" href="a00312.html#497ec2612615249bf5a294eb1b7b93b3">01321</a> <a class="code" href="a00312.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>( <a class="code" href="a00288.html">graph</a> &g ) : buffer_node<T, A>(g), mark(0) {}
-<a name="l01322"></a>01322
-<a name="l01324"></a><a class="code" href="a00312.html#17a4f66e23d54100b64805405e905d62">01324</a> <a class="code" href="a00312.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>( <span class="keyword">const</span> <a class="code" href="a00312.html">priority_queue_node</a> &src ) : buffer_node<T, A>(src), mark(0) {}
-<a name="l01325"></a>01325
-<a name="l01326"></a>01326 <span class="keyword">protected</span>:
-<a name="l01327"></a>01327 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00263.html">buffer_node<T, A>::size_type</a> size_type;
-<a name="l01328"></a>01328 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00263.html">buffer_node<T, A>::item_type</a> item_type;
-<a name="l01329"></a>01329 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00263.html">buffer_node<T, A>::buffer_operation</a> prio_operation;
-<a name="l01330"></a>01330
-<a name="l01331"></a>01331 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01332"></a>01332
-<a name="l01333"></a>01333 <span class="comment">/* override */</span> <span class="keywordtype">void</span> handle_operations(prio_operation *op_list) {
-<a name="l01334"></a>01334 prio_operation *tmp <span class="comment">/*, *pop_list*/</span> ;
-<a name="l01335"></a>01335 <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
-<a name="l01336"></a>01336 <span class="keywordflow">while</span> (op_list) {
-<a name="l01337"></a>01337 tmp = op_list;
-<a name="l01338"></a>01338 op_list = op_list->next;
-<a name="l01339"></a>01339 <span class="keywordflow">switch</span> (tmp->type) {
-<a name="l01340"></a>01340 <span class="keywordflow">case</span> <a class="code" href="a00263.html">buffer_node<T, A>::reg_succ</a>: this-><a class="code" href="a00263.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01341"></a>01341 <span class="keywordflow">case</span> <a class="code" href="a00263.html">buffer_node<T, A>::rem_succ</a>: this-><a class="code" href="a00263.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01342"></a>01342 <span class="keywordflow">case</span> <a class="code" href="a00263.html">buffer_node<T, A>::put_item</a>: internal_push(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01343"></a>01343 <span class="keywordflow">case</span> <a class="code" href="a00263.html">buffer_node<T, A>::try_fwd</a>: <a class="code" href="a00312.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01344"></a>01344 <span class="keywordflow">case</span> <a class="code" href="a00263.html">buffer_node<T, A>::rel_res</a>: internal_release(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01345"></a>01345 <span class="keywordflow">case</span> <a class="code" href="a00263.html">buffer_node<T, A>::con_res</a>: internal_consume(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01346"></a>01346 <span class="keywordflow">case</span> <a class="code" href="a00263.html">buffer_node<T, A>::req_item</a>: internal_pop(tmp); <span class="keywordflow">break</span>;
-<a name="l01347"></a>01347 <span class="keywordflow">case</span> <a class="code" href="a00263.html">buffer_node<T, A>::res_item</a>: internal_reserve(tmp); <span class="keywordflow">break</span>;
-<a name="l01348"></a>01348 }
-<a name="l01349"></a>01349 }
-<a name="l01350"></a>01350 <span class="comment">// process pops! for now, no special pop processing</span>
-<a name="l01351"></a>01351 <span class="keywordflow">if</span> (mark<this->my_tail) heapify();
-<a name="l01352"></a>01352 <span class="keywordflow">if</span> (try_forwarding && !this->forwarder_busy) {
-<a name="l01353"></a>01353 this->forwarder_busy = <span class="keyword">true</span>;
-<a name="l01354"></a>01354 <a class="code" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*(this->my_parent))) internal::forward_task< buffer_node<input_type, A> >(*<span class="keyword">this</span>));
-<a name="l01355"></a>01355 }
-<a name="l01356"></a>01356 }
-<a name="l01357"></a>01357
-<a name="l01359"></a><a class="code" href="a00312.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">01359</a> <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00312.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a>(prio_operation *op) {
-<a name="l01360"></a>01360 T i_copy;
-<a name="l01361"></a>01361 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
-<a name="l01362"></a>01362 size_type counter = this->my_successors.size();
-<a name="l01363"></a>01363
-<a name="l01364"></a>01364 <span class="keywordflow">if</span> (this->my_reserved || this->my_tail == 0) {
-<a name="l01365"></a>01365 __TBB_store_with_release(op->status, FAILED);
-<a name="l01366"></a>01366 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01367"></a>01367 <span class="keywordflow">return</span>;
-<a name="l01368"></a>01368 }
-<a name="l01369"></a>01369 <span class="comment">// Keep trying to send while there exists an accepting successor</span>
-<a name="l01370"></a>01370 <span class="keywordflow">while</span> (counter>0 && this->my_tail > 0) {
-<a name="l01371"></a>01371 i_copy = this->my_array[0].first;
-<a name="l01372"></a>01372 <span class="keywordtype">bool</span> msg = this->my_successors.try_put(i_copy);
-<a name="l01373"></a>01373 <span class="keywordflow">if</span> ( msg == <span class="keyword">true</span> ) {
-<a name="l01374"></a>01374 <span class="keywordflow">if</span> (mark == this->my_tail) --mark;
-<a name="l01375"></a>01375 --(this->my_tail);
-<a name="l01376"></a>01376 this->my_array[0].first=this->my_array[this->my_tail].first;
-<a name="l01377"></a>01377 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
-<a name="l01378"></a>01378 reheap();
-<a name="l01379"></a>01379 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
-<a name="l01380"></a>01380 }
-<a name="l01381"></a>01381 --counter;
-<a name="l01382"></a>01382 }
-<a name="l01383"></a>01383 <span class="keywordflow">if</span> (success && !counter)
-<a name="l01384"></a>01384 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01385"></a>01385 <span class="keywordflow">else</span> {
-<a name="l01386"></a>01386 __TBB_store_with_release(op->status, FAILED);
-<a name="l01387"></a>01387 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01388"></a>01388 }
-<a name="l01389"></a>01389 }
-<a name="l01390"></a>01390
-<a name="l01391"></a>01391 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(prio_operation *op) {
-<a name="l01392"></a>01392 <span class="keywordflow">if</span> ( this->my_tail >= this->my_array_size )
-<a name="l01393"></a>01393 this->grow_my_array( this->my_tail + 1 );
-<a name="l01394"></a>01394 this->my_array[this->my_tail] = std::make_pair( *(op->elem), <span class="keyword">true</span> );
-<a name="l01395"></a>01395 ++(this->my_tail);
-<a name="l01396"></a>01396 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01397"></a>01397 }
-<a name="l01398"></a>01398 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(prio_operation *op) {
-<a name="l01399"></a>01399 <span class="keywordflow">if</span> ( this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0 ) {
-<a name="l01400"></a>01400 __TBB_store_with_release(op->status, FAILED);
-<a name="l01401"></a>01401 }
-<a name="l01402"></a>01402 <span class="keywordflow">else</span> {
-<a name="l01403"></a>01403 <span class="keywordflow">if</span> (mark<this->my_tail &&
-<a name="l01404"></a>01404 compare(this->my_array[0].first,
-<a name="l01405"></a>01405 this->my_array[this->my_tail-1].first)) {
-<a name="l01406"></a>01406 <span class="comment">// there are newly pushed elems; last one higher than top</span>
-<a name="l01407"></a>01407 <span class="comment">// copy the data</span>
-<a name="l01408"></a>01408 *(op->elem) = this->my_array[this->my_tail-1].first;
-<a name="l01409"></a>01409 --(this->my_tail);
-<a name="l01410"></a>01410 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01411"></a>01411 }
-<a name="l01412"></a>01412 <span class="keywordflow">else</span> { <span class="comment">// extract and push the last element down heap</span>
-<a name="l01413"></a>01413 *(op->elem) = this->my_array[0].first; <span class="comment">// copy the data</span>
-<a name="l01414"></a>01414 if (mark == this->my_tail) --mark;
-<a name="l01415"></a>01415 --(this->my_tail);
-<a name="l01416"></a>01416 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01417"></a>01417 this->my_array[0].first=this->my_array[this->my_tail].first;
-<a name="l01418"></a>01418 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
-<a name="l01419"></a>01419 reheap();
-<a name="l01420"></a>01420 }
-<a name="l01421"></a>01421 }
-<a name="l01422"></a>01422 }
-<a name="l01423"></a>01423 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(prio_operation *op) {
-<a name="l01424"></a>01424 <span class="keywordflow">if</span> (this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0) {
-<a name="l01425"></a>01425 __TBB_store_with_release(op->status, FAILED);
-<a name="l01426"></a>01426 }
-<a name="l01427"></a>01427 <span class="keywordflow">else</span> {
-<a name="l01428"></a>01428 this->my_reserved = <span class="keyword">true</span>;
-<a name="l01429"></a>01429 *(op->elem) = reserved_item = this->my_array[0].first;
-<a name="l01430"></a>01430 if (mark == this->my_tail) --mark;
-<a name="l01431"></a>01431 --(this->my_tail);
-<a name="l01432"></a>01432 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01433"></a>01433 this->my_array[0].first = this->my_array[this->my_tail].first;
-<a name="l01434"></a>01434 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
-<a name="l01435"></a>01435 reheap();
-<a name="l01436"></a>01436 }
-<a name="l01437"></a>01437 }
-<a name="l01438"></a>01438 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(prio_operation *op) {
-<a name="l01439"></a>01439 this->my_reserved = <span class="keyword">false</span>;
-<a name="l01440"></a>01440 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01441"></a>01441 }
-<a name="l01442"></a>01442 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_release(prio_operation *op) {
-<a name="l01443"></a>01443 <span class="keywordflow">if</span> (this->my_tail >= this->my_array_size)
-<a name="l01444"></a>01444 this->grow_my_array( this->my_tail + 1 );
-<a name="l01445"></a>01445 this->my_array[this->my_tail] = std::make_pair(reserved_item, <span class="keyword">true</span>);
-<a name="l01446"></a>01446 ++(this->my_tail);
-<a name="l01447"></a>01447 this->my_reserved = <span class="keyword">false</span>;
-<a name="l01448"></a>01448 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01449"></a>01449 heapify();
-<a name="l01450"></a>01450 }
-<a name="l01451"></a>01451 <span class="keyword">private</span>:
-<a name="l01452"></a>01452 Compare compare;
-<a name="l01453"></a>01453 size_type mark;
-<a name="l01454"></a>01454 <a class="code" href="a00312.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> reserved_item;
-<a name="l01455"></a>01455
-<a name="l01456"></a>01456 <span class="keywordtype">void</span> heapify() {
-<a name="l01457"></a>01457 <span class="keywordflow">if</span> (!mark) mark = 1;
-<a name="l01458"></a>01458 <span class="keywordflow">for</span> (; mark<this->my_tail; ++mark) { <span class="comment">// for each unheaped element</span>
-<a name="l01459"></a>01459 size_type cur_pos = mark;
-<a name="l01460"></a>01460 <a class="code" href="a00312.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> to_place = this->my_array[mark].first;
-<a name="l01461"></a>01461 <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
-<a name="l01462"></a>01462 size_type parent = (cur_pos-1)>>1;
-<a name="l01463"></a>01463 <span class="keywordflow">if</span> (!compare(this->my_array[parent].first, to_place))
-<a name="l01464"></a>01464 <span class="keywordflow">break</span>;
-<a name="l01465"></a>01465 this->my_array[cur_pos].first = this->my_array[parent].first;
-<a name="l01466"></a>01466 cur_pos = parent;
-<a name="l01467"></a>01467 } <span class="keywordflow">while</span>( cur_pos );
-<a name="l01468"></a>01468 this->my_array[cur_pos].first = to_place;
-<a name="l01469"></a>01469 }
-<a name="l01470"></a>01470 }
-<a name="l01471"></a>01471
-<a name="l01472"></a>01472 <span class="keywordtype">void</span> reheap() {
-<a name="l01473"></a>01473 size_type cur_pos=0, child=1;
-<a name="l01474"></a>01474 <span class="keywordflow">while</span> (child < mark) {
-<a name="l01475"></a>01475 size_type target = child;
-<a name="l01476"></a>01476 <span class="keywordflow">if</span> (child+1<mark &&
-<a name="l01477"></a>01477 compare(this->my_array[child].first,
-<a name="l01478"></a>01478 this->my_array[child+1].first))
-<a name="l01479"></a>01479 ++target;
-<a name="l01480"></a>01480 <span class="comment">// target now has the higher priority child</span>
-<a name="l01481"></a>01481 <span class="keywordflow">if</span> (compare(this->my_array[target].first,
-<a name="l01482"></a>01482 this->my_array[this->my_tail].first))
-<a name="l01483"></a>01483 <span class="keywordflow">break</span>;
-<a name="l01484"></a>01484 this->my_array[cur_pos].first = this->my_array[target].first;
-<a name="l01485"></a>01485 cur_pos = target;
-<a name="l01486"></a>01486 child = (cur_pos<<1)+1;
-<a name="l01487"></a>01487 }
-<a name="l01488"></a>01488 this->my_array[cur_pos].first = this->my_array[this->my_tail].first;
-<a name="l01489"></a>01489 }
-<a name="l01490"></a>01490 };
-<a name="l01491"></a>01491
-<a name="l01493"></a>01493
-<a name="l01496"></a>01496 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01497"></a><a class="code" href="a00292.html">01497</a> <span class="keyword">class </span><a class="code" href="a00292.html">limiter_node</a> : <span class="keyword">public</span> <a class="code" href="a00289.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00321.html">receiver</a>< T >, <span class="keyword">public</span> <a class="code" href="a00327.html">sender</a>< T > {
-<a name="l01498"></a>01498 <span class="keyword">using</span> graph_node::my_graph;
-<a name="l01499"></a>01499 <span class="keyword">public</span>:
-<a name="l01500"></a><a class="code" href="a00292.html#035196d3c9240ef041f528ebcde8baa7">01500</a> <span class="keyword">typedef</span> T <a class="code" href="a00292.html#035196d3c9240ef041f528ebcde8baa7">input_type</a>;
-<a name="l01501"></a><a class="code" href="a00292.html#6e67fc480147c0b88a483b85db6457b0">01501</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01502"></a><a class="code" href="a00292.html#f89fcf44f38eb33f965ee5362d3e68e9">01502</a> <span class="keyword">typedef</span> <a class="code" href="a00327.html">sender< input_type ></a> <a class="code" href="a00327.html">predecessor_type</a>;
-<a name="l01503"></a><a class="code" href="a00292.html#e8945e4dd6ea759ff9e4735da13f12ef">01503</a> <span class="keyword">typedef</span> <a class="code" href="a00321.html">receiver< output_type ></a> <a class="code" href="a00321.html">successor_type</a>;
-<a name="l01504"></a>01504
-<a name="l01505"></a>01505 <span class="keyword">private</span>:
-<a name="l01506"></a>01506 <a class="code" href="a00337.html">task</a> *my_root_task;
-<a name="l01507"></a>01507 size_t my_threshold;
-<a name="l01508"></a>01508 size_t my_count;
-<a name="l01509"></a>01509 internal::predecessor_cache< T > my_predecessors;
-<a name="l01510"></a>01510 <a class="code" href="a00331.html">spin_mutex</a> my_mutex;
-<a name="l01511"></a>01511 internal::broadcast_cache< T > my_successors;
-<a name="l01512"></a>01512 <span class="keywordtype">int</span> init_decrement_predecessors;
-<a name="l01513"></a>01513
-<a name="l01514"></a>01514 <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< limiter_node<T> >;
-<a name="l01515"></a>01515
-<a name="l01516"></a>01516 <span class="comment">// Let decrementer call decrement_counter()</span>
-<a name="l01517"></a>01517 <span class="keyword">friend</span> <span class="keyword">class </span>internal::decrementer< limiter_node<T> >;
-<a name="l01518"></a>01518
-<a name="l01519"></a>01519 <span class="keywordtype">void</span> decrement_counter() {
-<a name="l01520"></a>01520 <a class="code" href="a00292.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> v;
-<a name="l01521"></a>01521
-<a name="l01522"></a>01522 <span class="comment">// If we can't get / put an item immediately then drop the count</span>
-<a name="l01523"></a>01523 <span class="keywordflow">if</span> ( my_predecessors.get_item( v ) == <span class="keyword">false</span>
-<a name="l01524"></a>01524 || my_successors.try_put(v) == false ) {
-<a name="l01525"></a>01525 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01526"></a>01526 --my_count;
-<a name="l01527"></a>01527 <span class="keywordflow">if</span> ( !my_predecessors.empty() )
-<a name="l01528"></a>01528 <a class="code" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l01529"></a>01529 internal::forward_task< <a class="code" href="a00292.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
-<a name="l01530"></a>01530 }
-<a name="l01531"></a>01531 }
-<a name="l01532"></a>01532
-<a name="l01533"></a>01533 <span class="keywordtype">void</span> forward() {
-<a name="l01534"></a>01534 {
-<a name="l01535"></a>01535 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01536"></a>01536 <span class="keywordflow">if</span> ( my_count < my_threshold )
-<a name="l01537"></a>01537 ++my_count;
-<a name="l01538"></a>01538 <span class="keywordflow">else</span>
-<a name="l01539"></a>01539 <span class="keywordflow">return</span>;
-<a name="l01540"></a>01540 }
-<a name="l01541"></a>01541 decrement_counter();
-<a name="l01542"></a>01542 }
-<a name="l01543"></a>01543
-<a name="l01544"></a>01544 <span class="keyword">public</span>:
-<a name="l01546"></a><a class="code" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">01546</a> internal::decrementer< limiter_node<T> > <a class="code" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>;
-<a name="l01547"></a>01547
-<a name="l01549"></a><a class="code" href="a00292.html#831b06576f46fe2bf3ed0f86b793c1b2">01549</a> <a class="code" href="a00292.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>(<a class="code" href="a00288.html">graph</a> &g, size_t threshold, <span class="keywordtype">int</span> num_decrement_predecessors=0) :
-<a name="l01550"></a>01550 <a class="code" href="a00289.html">graph_node</a>(g), my_root_task(g.root_task()), my_threshold(threshold), my_count(0),
-<a name="l01551"></a>01551 init_decrement_predecessors(num_decrement_predecessors),
-<a name="l01552"></a>01552 <a class="code" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>(num_decrement_predecessors)
-<a name="l01553"></a>01553 {
-<a name="l01554"></a>01554 my_predecessors.set_owner(<span class="keyword">this</span>);
-<a name="l01555"></a>01555 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01556"></a>01556 <a class="code" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>.set_owner(<span class="keyword">this</span>);
-<a name="l01557"></a>01557 }
-<a name="l01558"></a>01558
-<a name="l01560"></a><a class="code" href="a00292.html#83d3ab884543b070ee5b345a87f241fa">01560</a> <a class="code" href="a00292.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>( <span class="keyword">const</span> limiter_node& src ) :
-<a name="l01561"></a>01561 <a class="code" href="a00289.html">graph_node</a>(src.my_graph), <a class="code" href="a00321.html">receiver</a><T>(), <a class="code" href="a00327.html">sender</a><T>(),
-<a name="l01562"></a>01562 my_root_task(src.my_root_task), my_threshold(src.my_threshold), my_count(0),
-<a name="l01563"></a>01563 init_decrement_predecessors(src.init_decrement_predecessors),
-<a name="l01564"></a>01564 <a class="code" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>(src.init_decrement_predecessors)
-<a name="l01565"></a>01565 {
-<a name="l01566"></a>01566 my_predecessors.set_owner(<span class="keyword">this</span>);
-<a name="l01567"></a>01567 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01568"></a>01568 <a class="code" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>.set_owner(<span class="keyword">this</span>);
-<a name="l01569"></a>01569 }
-<a name="l01570"></a>01570
-<a name="l01572"></a><a class="code" href="a00292.html#c76561d8d871b4769876988a4de12a9b">01572</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00292.html#c76561d8d871b4769876988a4de12a9b">register_successor</a>( <a class="code" href="a00321.html">receiver<output_type></a> &r ) {
-<a name="l01573"></a>01573 my_successors.register_successor(r);
-<a name="l01574"></a>01574 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01575"></a>01575 }
-<a name="l01576"></a>01576
-<a name="l01578"></a>01578
-<a name="l01579"></a><a class="code" href="a00292.html#275e328063c121b3e506ccef2a825d28">01579</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00292.html#275e328063c121b3e506ccef2a825d28">remove_successor</a>( <a class="code" href="a00321.html">receiver<output_type></a> &r ) {
-<a name="l01580"></a>01580 r.<a class="code" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(*<span class="keyword">this</span>);
-<a name="l01581"></a>01581 my_successors.remove_successor(r);
-<a name="l01582"></a>01582 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01583"></a>01583 }
-<a name="l01584"></a>01584
-<a name="l01586"></a><a class="code" href="a00292.html#55a02d458a4d8ffa6accd7a70605da2f">01586</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00292.html#55a02d458a4d8ffa6accd7a70605da2f">try_put</a>( <span class="keyword">const</span> T &t ) {
-<a name="l01587"></a>01587 {
-<a name="l01588"></a>01588 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01589"></a>01589 <span class="keywordflow">if</span> ( my_count >= my_threshold )
-<a name="l01590"></a>01590 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01591"></a>01591 <span class="keywordflow">else</span>
-<a name="l01592"></a>01592 ++my_count;
-<a name="l01593"></a>01593 }
-<a name="l01594"></a>01594
-<a name="l01595"></a>01595 <span class="keywordtype">bool</span> msg = my_successors.try_put(t);
-<a name="l01596"></a>01596
-<a name="l01597"></a>01597 <span class="keywordflow">if</span> ( msg != <span class="keyword">true</span> ) {
-<a name="l01598"></a>01598 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01599"></a>01599 --my_count;
-<a name="l01600"></a>01600 <span class="keywordflow">if</span> ( !my_predecessors.empty() )
-<a name="l01601"></a>01601 <a class="code" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l01602"></a>01602 internal::forward_task< <a class="code" href="a00292.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
-<a name="l01603"></a>01603 }
-<a name="l01604"></a>01604
-<a name="l01605"></a>01605 <span class="keywordflow">return</span> msg;
-<a name="l01606"></a>01606 }
-<a name="l01607"></a>01607
-<a name="l01609"></a><a class="code" href="a00292.html#de70a0e88ce7655d8c14b6af57f7496f">01609</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00292.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a>( <a class="code" href="a00327.html">predecessor_type</a> &src ) {
-<a name="l01610"></a>01610 <a class="code" href="a00332.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01611"></a>01611 my_predecessors.add( src );
-<a name="l01612"></a>01612 <span class="keywordflow">if</span> ( my_count < my_threshold && !my_successors.empty() )
-<a name="l01613"></a>01613 <a class="code" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l01614"></a>01614 internal::forward_task< <a class="code" href="a00292.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
-<a name="l01615"></a>01615 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01616"></a>01616 }
-<a name="l01617"></a>01617
-<a name="l01619"></a><a class="code" href="a00292.html#c530e7b469454e2340460795f2da3317">01619</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00292.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a>( <a class="code" href="a00327.html">predecessor_type</a> &src ) {
-<a name="l01620"></a>01620 my_predecessors.remove( src );
-<a name="l01621"></a>01621 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01622"></a>01622 }
-<a name="l01623"></a>01623 };
-<a name="l01624"></a>01624
-<a name="l01625"></a>01625 <span class="preprocessor">#include "internal/_flow_graph_join_impl.h"</span>
-<a name="l01626"></a>01626
-<a name="l01627"></a>01627 <span class="keyword">using</span> internal::reserving_port;
-<a name="l01628"></a>01628 <span class="keyword">using</span> internal::queueing_port;
-<a name="l01629"></a>01629 <span class="keyword">using</span> internal::tag_matching_port;
-<a name="l01630"></a>01630 <span class="keyword">using</span> internal::input_port;
-<a name="l01631"></a>01631 <span class="keyword">using</span> internal::tag_value;
-<a name="l01632"></a>01632 <span class="keyword">using</span> internal::NO_TAG;
-<a name="l01633"></a>01633
-<a name="l01634"></a>01634 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple, graph_buffer_policy JP=queueing> <span class="keyword">class </span>join_node;
-<a name="l01635"></a>01635
-<a name="l01636"></a>01636 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l01637"></a>01637 <span class="keyword">class </span>join_node<OutputTuple,reserving>: <span class="keyword">public</span> internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, reserving_port, OutputTuple, reserving> {
-<a name="l01638"></a>01638 <span class="keyword">private</span>:
-<a name="l01639"></a>01639 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
-<a name="l01640"></a>01640 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, reserving_port, OutputTuple, reserving> unfolded_type;
-<a name="l01641"></a>01641 <span class="keyword">public</span>:
-<a name="l01642"></a>01642 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l01643"></a>01643 <span class="keyword">typedef</span> <span class="keyword">typename</span> unfolded_type::input_ports_type input_ports_type;
-<a name="l01644"></a>01644 join_node(<a class="code" href="a00288.html">graph</a> &g) : unfolded_type(g) { }
-<a name="l01645"></a>01645 join_node(<span class="keyword">const</span> join_node &other) : unfolded_type(other) {}
-<a name="l01646"></a>01646 };
-<a name="l01647"></a>01647
-<a name="l01648"></a>01648 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l01649"></a>01649 <span class="keyword">class </span>join_node<OutputTuple,queueing>: <span class="keyword">public</span> internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, queueing_port, OutputTuple, queueing> {
-<a name="l01650"></a>01650 <span class="keyword">private</span>:
-<a name="l01651"></a>01651 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
-<a name="l01652"></a>01652 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, queueing_port, OutputTuple, queueing> unfolded_type;
-<a name="l01653"></a>01653 <span class="keyword">public</span>:
-<a name="l01654"></a>01654 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l01655"></a>01655 <span class="keyword">typedef</span> <span class="keyword">typename</span> unfolded_type::input_ports_type input_ports_type;
-<a name="l01656"></a>01656 join_node(graph &g) : unfolded_type(g) { }
-<a name="l01657"></a>01657 join_node(<span class="keyword">const</span> join_node &other) : unfolded_type(other) {}
-<a name="l01658"></a>01658 };
-<a name="l01659"></a>01659
-<a name="l01660"></a>01660 <span class="comment">// template for tag_matching join_node</span>
-<a name="l01661"></a>01661 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l01662"></a>01662 <span class="keyword">class </span>join_node<OutputTuple, tag_matching> : <span class="keyword">public</span> internal::unfolded_join_node<std::tuple_size<OutputTuple>::value,
-<a name="l01663"></a>01663 tag_matching_port, OutputTuple, tag_matching> {
-<a name="l01664"></a>01664 <span class="keyword">private</span>:
-<a name="l01665"></a>01665 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
-<a name="l01666"></a>01666 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, tag_matching_port, OutputTuple, tag_matching> unfolded_type;
-<a name="l01667"></a>01667 <span class="keyword">public</span>:
-<a name="l01668"></a>01668 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l01669"></a>01669 <span class="keyword">typedef</span> <span class="keyword">typename</span> unfolded_type::input_ports_type input_ports_type;
-<a name="l01670"></a>01670 <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1>
-<a name="l01671"></a>01671 join_node(graph &g, B0 b0, B1 b1) : unfolded_type(g, b0, b1) { }
-<a name="l01672"></a>01672 <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2>
-<a name="l01673"></a>01673 join_node(graph &g, B0 b0, B1 b1, B2 b2) : unfolded_type(g, b0, b1, b2) { }
-<a name="l01674"></a>01674 <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3>
-<a name="l01675"></a>01675 join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3) : unfolded_type(g, b0, b1, b2, b3) { }
-<a name="l01676"></a>01676 <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4>
-<a name="l01677"></a>01677 join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) : unfolded_type(g, b0, b1, b2, b3, b4) { }
-<a name="l01678"></a>01678 <span class="preprocessor">#if __TBB_VARIADIC_MAX >= 6</span>
-<a name="l01679"></a>01679 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5>
-<a name="l01680"></a>01680 join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5) : unfolded_type(g, b0, b1, b2, b3, b4, b5) { }
-<a name="l01681"></a>01681 <span class="preprocessor">#endif</span>
-<a name="l01682"></a>01682 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_VARIADIC_MAX >= 7</span>
-<a name="l01683"></a>01683 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5, <span class="keyword">typename</span> B6>
-<a name="l01684"></a>01684 join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6) { }
-<a name="l01685"></a>01685 <span class="preprocessor">#endif</span>
-<a name="l01686"></a>01686 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_VARIADIC_MAX >= 8</span>
-<a name="l01687"></a>01687 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5, <span class="keyword">typename</span> B6, <span class="keyword">typename</span> B7>
-<a name="l01688"></a>01688 join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7) { }
-<a name="l01689"></a>01689 <span class="preprocessor">#endif</span>
-<a name="l01690"></a>01690 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_VARIADIC_MAX >= 9</span>
-<a name="l01691"></a>01691 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5, <span class="keyword">typename</span> B6, <span class="keyword">typename</span> B7, <span class="keyword">typename</span> B8>
-<a name="l01692"></a>01692 join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7, b8) { }
-<a name="l01693"></a>01693 <span class="preprocessor">#endif</span>
-<a name="l01694"></a>01694 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_VARIADIC_MAX >= 10</span>
-<a name="l01695"></a>01695 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5, <span class="keyword">typename</span> B6, <span class="keyword">typename</span> B7, <span class="keyword">typename</span> B8, <span cl [...]
-<a name="l01696"></a>01696 join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8, B9 b9) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9) { }
-<a name="l01697"></a>01697 <span class="preprocessor">#endif</span>
-<a name="l01698"></a>01698 <span class="preprocessor"></span> join_node(<span class="keyword">const</span> join_node &other) : unfolded_type(other) {}
-<a name="l01699"></a>01699 };
-<a name="l01700"></a>01700
-<a name="l01701"></a>01701 <span class="preprocessor">#if TBB_PREVIEW_GRAPH_NODES</span>
-<a name="l01702"></a>01702 <span class="preprocessor"></span><span class="comment">// or node</span>
-<a name="l01703"></a>01703 <span class="preprocessor">#include "internal/_flow_graph_or_impl.h"</span>
-<a name="l01704"></a>01704
-<a name="l01705"></a>01705 <span class="keyword">template</span><<span class="keyword">typename</span> InputTuple>
-<a name="l01706"></a>01706 <span class="keyword">class </span>or_node : <span class="keyword">public</span> internal::unfolded_or_node<InputTuple> {
-<a name="l01707"></a>01707 <span class="keyword">private</span>:
-<a name="l01708"></a>01708 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<InputTuple>::value;
-<a name="l01709"></a>01709 <span class="keyword">public</span>:
-<a name="l01710"></a>01710 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::or_output_type<InputTuple>::type output_type;
-<a name="l01711"></a>01711 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_or_node<InputTuple> unfolded_type;
-<a name="l01712"></a>01712 or_node(graph& g) : unfolded_type(g) { }
-<a name="l01713"></a>01713 <span class="comment">// Copy constructor</span>
-<a name="l01714"></a>01714 or_node( <span class="keyword">const</span> or_node& other ) : unfolded_type(other) { }
-<a name="l01715"></a>01715 };
-<a name="l01716"></a>01716 <span class="preprocessor">#endif // TBB_PREVIEW_GRAPH_NODES</span>
-<a name="l01717"></a>01717 <span class="preprocessor"></span>
-<a name="l01719"></a>01719 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01720"></a>01720 <span class="keyword">inline</span> <span class="keywordtype">void</span> make_edge( sender<T> &p, receiver<T> &s ) {
-<a name="l01721"></a>01721 p.register_successor( s );
-<a name="l01722"></a>01722 }
-<a name="l01723"></a>01723
-<a name="l01725"></a>01725 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01726"></a>01726 <span class="keyword">inline</span> <span class="keywordtype">void</span> remove_edge( sender<T> &p, receiver<T> &s ) {
-<a name="l01727"></a>01727 p.remove_successor( s );
-<a name="l01728"></a>01728 }
-<a name="l01729"></a>01729
-<a name="l01731"></a>01731 <span class="keyword">template</span>< <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Node >
-<a name="l01732"></a>01732 Body copy_body( Node &n ) {
-<a name="l01733"></a>01733 <span class="keywordflow">return</span> n.template copy_function_object<Body>();
-<a name="l01734"></a>01734 }
-<a name="l01735"></a>01735
-<a name="l01736"></a>01736 } <span class="comment">// interface6</span>
-<a name="l01737"></a>01737
-<a name="l01738"></a>01738 <span class="keyword">using</span> interface6::graph;
-<a name="l01739"></a>01739 <span class="keyword">using</span> interface6::graph_node;
-<a name="l01740"></a>01740 <span class="keyword">using</span> interface6::continue_msg;
-<a name="l01741"></a>01741 <span class="keyword">using</span> interface6::sender;
-<a name="l01742"></a>01742 <span class="keyword">using</span> interface6::receiver;
-<a name="l01743"></a>01743 <span class="keyword">using</span> interface6::continue_receiver;
-<a name="l01744"></a>01744
-<a name="l01745"></a>01745 <span class="keyword">using</span> interface6::source_node;
-<a name="l01746"></a>01746 <span class="keyword">using</span> interface6::function_node;
-<a name="l01747"></a>01747 <span class="keyword">using</span> interface6::multifunction_node;
-<a name="l01748"></a>01748 <span class="keyword">using</span> interface6::split_node;
-<a name="l01749"></a>01749 <span class="keyword">using</span> interface6::internal::output_port;
-<a name="l01750"></a>01750 <span class="preprocessor">#if TBB_PREVIEW_GRAPH_NODES</span>
-<a name="l01751"></a>01751 <span class="preprocessor"></span> <span class="keyword">using</span> interface6::or_node;
-<a name="l01752"></a>01752 <span class="preprocessor">#endif</span>
-<a name="l01753"></a>01753 <span class="preprocessor"></span> <span class="keyword">using</span> interface6::continue_node;
-<a name="l01754"></a>01754 <span class="keyword">using</span> interface6::overwrite_node;
-<a name="l01755"></a>01755 <span class="keyword">using</span> interface6::write_once_node;
-<a name="l01756"></a>01756 <span class="keyword">using</span> interface6::broadcast_node;
-<a name="l01757"></a>01757 <span class="keyword">using</span> interface6::buffer_node;
-<a name="l01758"></a>01758 <span class="keyword">using</span> interface6::queue_node;
-<a name="l01759"></a>01759 <span class="keyword">using</span> interface6::sequencer_node;
-<a name="l01760"></a>01760 <span class="keyword">using</span> interface6::priority_queue_node;
-<a name="l01761"></a>01761 <span class="keyword">using</span> interface6::limiter_node;
-<a name="l01762"></a>01762 <span class="keyword">using namespace </span>interface6::internal::graph_policy_namespace;
-<a name="l01763"></a>01763 <span class="keyword">using</span> interface6::join_node;
-<a name="l01764"></a>01764 <span class="keyword">using</span> interface6::input_port;
-<a name="l01765"></a>01765 <span class="keyword">using</span> interface6::copy_body;
-<a name="l01766"></a>01766 <span class="keyword">using</span> interface6::make_edge;
-<a name="l01767"></a>01767 <span class="keyword">using</span> interface6::remove_edge;
-<a name="l01768"></a>01768 <span class="keyword">using</span> interface6::internal::NO_TAG;
-<a name="l01769"></a>01769 <span class="keyword">using</span> interface6::internal::tag_value;
-<a name="l01770"></a>01770
-<a name="l01771"></a>01771 } <span class="comment">// flow</span>
-<a name="l01772"></a>01772 } <span class="comment">// tbb</span>
-<a name="l01773"></a>01773
-<a name="l01774"></a>01774 <span class="preprocessor">#endif // __TBB_flow_graph_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00524.html b/doc/html/a00524.html
deleted file mode 100644
index f47438a..0000000
--- a/doc/html/a00524.html
+++ /dev/null
@@ -1,269 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>memory_pool.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>memory_pool.h</h1><a href="a00373.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_memory_pool_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_memory_pool_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if !TBB_PREVIEW_MEMORY_POOL</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#error Set TBB_PREVIEW_MEMORY_POOL to include memory_pool.h</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "<a class="code" href="a00392.html">scalable_allocator.h</a>"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "tbb_machine.h"</span> <span class="comment">// TODO: avoid linkage with libtbb on IA-64</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <new></span> <span class="comment">// std::bad_alloc</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#if __TBB_CPP11_RVALUE_REF_PRESENT && !__TBB_CPP11_STD_FORWARD_BROKEN</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#include <utility></span> <span class="comment">// std::forward</span>
-<a name="l00035"></a>00035 <span class="preprocessor">#endif</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span>
-<a name="l00037"></a>00037 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#define __TBBMALLOC_ASSERT ASSERT</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define __TBBMALLOC_ASSERT(a,b) ((void)0)</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span>
-<a name="l00043"></a>00043 <span class="keyword">namespace </span>tbb {
-<a name="l00044"></a>00044 <span class="keyword">namespace </span>interface6 {
-<a name="l00046"></a>00046 <span class="keyword">namespace </span>internal {
-<a name="l00047"></a>00047
-<a name="l00049"></a>00049 <span class="keyword">class </span>pool_base : tbb::internal::no_copy {
-<a name="l00050"></a>00050 <span class="comment">// Pool interface is separate from standard allocator classes because it has</span>
-<a name="l00051"></a>00051 <span class="comment">// to maintain internal state, no copy or assignment. Move and swap are possible.</span>
-<a name="l00052"></a>00052 <span class="keyword">public</span>:
-<a name="l00054"></a>00054 <span class="keywordtype">void</span> recycle() { rml::pool_reset(my_pool); }
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057 <span class="keywordtype">void</span> *malloc(size_t size) { <span class="keywordflow">return</span> rml::pool_malloc(my_pool, size); }
-<a name="l00058"></a>00058
-<a name="l00060"></a>00060 <span class="keywordtype">void</span> free(<span class="keywordtype">void</span>* ptr) { rml::pool_free(my_pool, ptr); }
-<a name="l00061"></a>00061
-<a name="l00063"></a>00063 <span class="comment">// Enables some low-level optimization possibilities</span>
-<a name="l00064"></a>00064 <span class="keywordtype">void</span> *realloc(<span class="keywordtype">void</span>* ptr, size_t size) {
-<a name="l00065"></a>00065 <span class="keywordflow">return</span> rml::pool_realloc(my_pool, ptr, size);
-<a name="l00066"></a>00066 }
-<a name="l00067"></a>00067
-<a name="l00068"></a>00068 <span class="keyword">protected</span>:
-<a name="l00070"></a>00070 <span class="keywordtype">void</span> destroy() { rml::pool_destroy(my_pool); }
-<a name="l00071"></a>00071
-<a name="l00072"></a>00072 rml::MemoryPool *my_pool;
-<a name="l00073"></a>00073 };
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 } <span class="comment">// namespace internal</span>
-<a name="l00077"></a>00077 <span class="comment"></span>
-<a name="l00078"></a>00078 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00079"></a>00079 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
-<a name="l00080"></a>00080 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span>
-<a name="l00085"></a>00085
-<a name="l00086"></a>00086 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> P = <span class="keywordtype">int</span>ernal::pool_base>
-<a name="l00087"></a><a class="code" href="a00296.html">00087</a> <span class="keyword">class </span><a class="code" href="a00296.html">memory_pool_allocator</a> {
-<a name="l00088"></a>00088 <span class="keyword">protected</span>:
-<a name="l00089"></a>00089 <span class="keyword">typedef</span> P pool_type;
-<a name="l00090"></a>00090 pool_type *my_pool;
-<a name="l00091"></a>00091 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
-<a name="l00092"></a>00092 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00296.html">memory_pool_allocator</a>;
-<a name="l00093"></a>00093 <span class="keyword">template</span><<span class="keyword">typename</span> V, <span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
-<a name="l00094"></a>00094 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<U,R></a>& b);
-<a name="l00095"></a>00095 <span class="keyword">template</span><<span class="keyword">typename</span> V, <span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
-<a name="l00096"></a>00096 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<U,R></a>& b);
-<a name="l00097"></a>00097 <span class="keyword">public</span>:
-<a name="l00098"></a>00098 <span class="keyword">typedef</span> <span class="keyword">typename</span> tbb::internal::allocator_type<T>::value_type value_type;
-<a name="l00099"></a>00099 <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00100"></a>00100 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00101"></a>00101 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00102"></a>00102 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00103"></a>00103 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00104"></a>00104 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00105"></a>00105 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00106"></a>00106 <span class="keyword">typedef</span> <a class="code" href="a00296.html">memory_pool_allocator<U, P></a> other;
-<a name="l00107"></a>00107 };
-<a name="l00108"></a>00108
-<a name="l00109"></a>00109 <a class="code" href="a00296.html">memory_pool_allocator</a>(pool_type &pool) <span class="keywordflow">throw</span>() : my_pool(&pool) {}
-<a name="l00110"></a>00110 <a class="code" href="a00296.html">memory_pool_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator</a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00296.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
-<a name="l00111"></a>00111 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00112"></a>00112 <a class="code" href="a00296.html">memory_pool_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<U,P></a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00296.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
-<a name="l00113"></a>00113
-<a name="l00114"></a>00114 pointer address(reference x)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &x; }
-<a name="l00115"></a>00115 const_pointer address(const_reference x)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &x; }
-<a name="l00116"></a>00116
-<a name="l00118"></a><a class="code" href="a00296.html#365bd64d284c80d85bb2149a12681526">00118</a> pointer <a class="code" href="a00296.html#365bd64d284c80d85bb2149a12681526">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> = 0) {
-<a name="l00119"></a>00119 <span class="keywordflow">return</span> static_cast<pointer>( my_pool->malloc( n*<span class="keyword">sizeof</span>(value_type) ) );
-<a name="l00120"></a>00120 }
-<a name="l00122"></a><a class="code" href="a00296.html#4e24a03de38638af07548383024c54ab">00122</a> <span class="keywordtype">void</span> <a class="code" href="a00296.html#4e24a03de38638af07548383024c54ab">deallocate</a>( pointer p, size_type ) {
-<a name="l00123"></a>00123 my_pool->free(p);
-<a name="l00124"></a>00124 }
-<a name="l00126"></a><a class="code" href="a00296.html#beebdb6144df8ba219fadfad4de866ea">00126</a> size_type <a class="code" href="a00296.html#beebdb6144df8ba219fadfad4de866ea">max_size</a>() const throw() {
-<a name="l00127"></a>00127 size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
-<a name="l00128"></a>00128 <span class="keywordflow">return</span> (max > 0 ? max : 1);
-<a name="l00129"></a>00129 }
-<a name="l00131"></a>00131 <span class="preprocessor">#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00132"></a>00132 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span>... Args>
-<a name="l00133"></a><a class="code" href="a00296.html#3491a81e0597c1696a163e7c8fa8706a">00133</a> <span class="keywordtype">void</span> <a class="code" href="a00296.html#3491a81e0597c1696a163e7c8fa8706a">construct</a>(pointer p, Args&&... args)
-<a name="l00134"></a>00134 <span class="preprocessor">#if __TBB_CPP11_STD_FORWARD_BROKEN</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span> { ::new((<span class="keywordtype">void</span> *)p) T((args)...); }
-<a name="l00136"></a>00136 <span class="preprocessor"> #else</span>
-<a name="l00137"></a>00137 <span class="preprocessor"></span> { ::new((<span class="keywordtype">void</span> *)p) T(std::forward<Args>(args)...); }
-<a name="l00138"></a>00138 <span class="preprocessor">#endif</span>
-<a name="l00139"></a>00139 <span class="preprocessor"></span><span class="preprocessor">#else // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span> <span class="keywordtype">void</span> <a class="code" href="a00296.html#3491a81e0597c1696a163e7c8fa8706a">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) { ::new((<span class="keywordtype">void</span>*)(p)) value_type(value); }
-<a name="l00141"></a>00141 <span class="preprocessor">#endif // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span>
-<a name="l00144"></a>00144 <span class="keywordtype">void</span> destroy( pointer p ) { p->~value_type(); }
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 };
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span>
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <span class="keyword">template</span><<span class="keyword">typename</span> P>
-<a name="l00155"></a><a class="code" href="a00297.html">00155</a> <span class="keyword">class </span><a class="code" href="a00296.html">memory_pool_allocator</a><void, P> {
-<a name="l00156"></a>00156 <span class="keyword">public</span>:
-<a name="l00157"></a>00157 <span class="keyword">typedef</span> P pool_type;
-<a name="l00158"></a>00158 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00159"></a>00159 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00160"></a>00160 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00161"></a>00161 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00162"></a>00162 <span class="keyword">typedef</span> <a class="code" href="a00296.html">memory_pool_allocator<U, P></a> other;
-<a name="l00163"></a>00163 };
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <a class="code" href="a00296.html">memory_pool_allocator</a>( pool_type &pool) <span class="keywordflow">throw</span>() : my_pool(&pool) {}
-<a name="l00166"></a>00166 <a class="code" href="a00296.html">memory_pool_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator</a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00296.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
-<a name="l00167"></a>00167 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00168"></a>00168 <a class="code" href="a00296.html">memory_pool_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<U,P></a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00296.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
-<a name="l00169"></a>00169
-<a name="l00170"></a>00170 <span class="keyword">protected</span>:
-<a name="l00171"></a>00171 pool_type *my_pool;
-<a name="l00172"></a>00172 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
-<a name="l00173"></a>00173 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00296.html">memory_pool_allocator</a>;
-<a name="l00174"></a>00174 <span class="keyword">template</span><<span class="keyword">typename</span> V, <span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
-<a name="l00175"></a>00175 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<U,R></a>& b);
-<a name="l00176"></a>00176 <span class="keyword">template</span><<span class="keyword">typename</span> V, <span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
-<a name="l00177"></a>00177 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<U,R></a>& b);
-<a name="l00178"></a>00178 };
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> P>
-<a name="l00181"></a>00181 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<T,P></a>& a, <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<U,P></a>& b) {<span class="keywordflow">return</span> a.<a class="code" href="a00296.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>==b.<a class="code" href="a [...]
-<a name="l00182"></a>00182
-<a name="l00183"></a>00183 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> P>
-<a name="l00184"></a>00184 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<T,P></a>& a, <span class="keyword">const</span> <a class="code" href="a00296.html">memory_pool_allocator<U,P></a>& b) {<span class="keywordflow">return</span> a.<a class="code" href="a00296.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>!=b.<a class="code" href="a [...]
-<a name="l00185"></a>00185
-<a name="l00186"></a>00186
-<a name="l00188"></a>00188 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
-<a name="l00189"></a><a class="code" href="a00295.html">00189</a> <span class="keyword">class </span><a class="code" href="a00295.html">memory_pool</a> : <span class="keyword">public</span> internal::pool_base {
-<a name="l00190"></a>00190 Alloc my_alloc; <span class="comment">// TODO: base-class optimization</span>
-<a name="l00191"></a>00191 <span class="keyword">static</span> <span class="keywordtype">void</span> *allocate_request(intptr_t pool_id, size_t & bytes);
-<a name="l00192"></a>00192 <span class="keyword">static</span> <span class="keywordtype">int</span> deallocate_request(intptr_t pool_id, <span class="keywordtype">void</span>*, size_t raw_bytes);
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="keyword">public</span>:
-<a name="l00196"></a>00196 <a class="code" href="a00295.html">memory_pool</a>(<span class="keyword">const</span> Alloc &src = Alloc());
-<a name="l00197"></a>00197
-<a name="l00199"></a><a class="code" href="a00295.html#fdad7c4ed08332ec384491a71b721957">00199</a> ~<a class="code" href="a00295.html">memory_pool</a>() { destroy(); } <span class="comment">// call the callbacks first and destroy my_alloc latter</span>
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 };
-<a name="l00202"></a>00202
-<a name="l00203"></a>00203 <span class="keyword">class </span>fixed_pool : <span class="keyword">public</span> internal::pool_base {
-<a name="l00204"></a>00204 <span class="keywordtype">void</span> *my_buffer;
-<a name="l00205"></a>00205 size_t my_size;
-<a name="l00206"></a>00206 <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> *allocate_request(intptr_t pool_id, size_t & bytes);
-<a name="l00207"></a>00207
-<a name="l00208"></a>00208 <span class="keyword">public</span>:
-<a name="l00210"></a>00210 <span class="keyword">inline</span> fixed_pool(<span class="keywordtype">void</span> *buf, size_t size);
-<a name="l00212"></a>00212 ~fixed_pool() { destroy(); }
-<a name="l00213"></a>00213 };
-<a name="l00214"></a>00214
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
-<a name="l00218"></a><a class="code" href="a00295.html#2822528265718a4c779591fc37c02ca8">00218</a> <a class="code" href="a00295.html">memory_pool<Alloc>::memory_pool</a>(<span class="keyword">const</span> Alloc &src) : my_alloc(src) {
-<a name="l00219"></a>00219 rml::MemPoolPolicy args(allocate_request, deallocate_request,
-<a name="l00220"></a>00220 <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Alloc::value_type));
-<a name="l00221"></a>00221 rml::MemPoolError res = rml::pool_create_v1(intptr_t(<span class="keyword">this</span>), &args, &my_pool);
-<a name="l00222"></a>00222 <span class="keywordflow">if</span>( res!=rml::POOL_OK ) __TBB_THROW(std::bad_alloc());
-<a name="l00223"></a>00223 }
-<a name="l00224"></a>00224 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
-<a name="l00225"></a>00225 <span class="keywordtype">void</span> *<a class="code" href="a00295.html">memory_pool<Alloc>::allocate_request</a>(intptr_t pool_id, size_t & bytes) {
-<a name="l00226"></a>00226 <a class="code" href="a00295.html">memory_pool<Alloc></a> &<span class="keyword">self</span> = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
-<a name="l00227"></a>00227 <span class="keyword">const</span> size_t unit_size = <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Alloc::value_type);
-<a name="l00228"></a>00228 __TBBMALLOC_ASSERT( 0 == bytes%unit_size, NULL);
-<a name="l00229"></a>00229 <span class="keywordtype">void</span> *ptr;
-<a name="l00230"></a>00230 __TBB_TRY { ptr = <span class="keyword">self</span>.my_alloc.allocate( bytes/unit_size ); }
-<a name="l00231"></a>00231 __TBB_CATCH(...) { <span class="keywordflow">return</span> 0; }
-<a name="l00232"></a>00232 <span class="keywordflow">return</span> ptr;
-<a name="l00233"></a>00233 }
-<a name="l00234"></a>00234 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
-<a name="l00235"></a>00235 <span class="keywordtype">int</span> memory_pool<Alloc>::deallocate_request(intptr_t pool_id, <span class="keywordtype">void</span>* raw_ptr, size_t raw_bytes) {
-<a name="l00236"></a>00236 memory_pool<Alloc> &<span class="keyword">self</span> = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
-<a name="l00237"></a>00237 <span class="keyword">const</span> size_t unit_size = <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Alloc::value_type);
-<a name="l00238"></a>00238 __TBBMALLOC_ASSERT( 0 == raw_bytes%unit_size, NULL);
-<a name="l00239"></a>00239 <span class="keyword">self</span>.my_alloc.deallocate( static_cast<typename Alloc::value_type*>(raw_ptr), raw_bytes/unit_size );
-<a name="l00240"></a>00240 <span class="keywordflow">return</span> 0;
-<a name="l00241"></a>00241 }
-<a name="l00242"></a>00242 <span class="keyword">inline</span> fixed_pool::fixed_pool(<span class="keywordtype">void</span> *buf, size_t size) : my_buffer(buf), my_size(size) {
-<a name="l00243"></a>00243 rml::MemPoolPolicy args(allocate_request, 0, size, <span class="comment">/*fixedPool=*/</span><span class="keyword">true</span>);
-<a name="l00244"></a>00244 rml::MemPoolError res = rml::pool_create_v1(intptr_t(<span class="keyword">this</span>), &args, &my_pool);
-<a name="l00245"></a>00245 <span class="keywordflow">if</span>( res!=rml::POOL_OK ) __TBB_THROW(std::bad_alloc());
-<a name="l00246"></a>00246 }
-<a name="l00247"></a>00247 <span class="keyword">inline</span> <span class="keywordtype">void</span> *fixed_pool::allocate_request(intptr_t pool_id, size_t & bytes) {
-<a name="l00248"></a>00248 fixed_pool &<span class="keyword">self</span> = *reinterpret_cast<fixed_pool*>(pool_id);
-<a name="l00249"></a>00249 <span class="keywordflow">if</span>( !__TBB_CompareAndSwapW(&<span class="keyword">self</span>.my_size, 0, (bytes=<span class="keyword">self</span>.my_size)) )
-<a name="l00250"></a>00250 <span class="keywordflow">return</span> 0; <span class="comment">// all the memory was given already</span>
-<a name="l00251"></a>00251 <span class="keywordflow">return</span> <span class="keyword">self</span>.my_buffer;
-<a name="l00252"></a>00252 }
-<a name="l00253"></a>00253
-<a name="l00254"></a>00254 } <span class="comment">//namespace interface6</span>
-<a name="l00255"></a>00255 <span class="keyword">using</span> interface6::memory_pool_allocator;
-<a name="l00256"></a>00256 <span class="keyword">using</span> interface6::memory_pool;
-<a name="l00257"></a>00257 <span class="keyword">using</span> interface6::fixed_pool;
-<a name="l00258"></a>00258 } <span class="comment">//namespace tbb</span>
-<a name="l00259"></a>00259
-<a name="l00260"></a>00260 <span class="preprocessor">#undef __TBBMALLOC_ASSERT</span>
-<a name="l00261"></a>00261 <span class="preprocessor"></span><span class="preprocessor">#endif// __TBB_memory_pool_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00531.html b/doc/html/a00531.html
deleted file mode 100644
index b2f9e79..0000000
--- a/doc/html/a00531.html
+++ /dev/null
@@ -1,240 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#else</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="preprocessor">#include <new></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keyword">namespace </span>tbb {
-<a name="l00036"></a>00036
-<a name="l00038"></a>00038
-<a name="l00040"></a><a class="code" href="a00301.html">00040</a> <span class="keyword">class </span><a class="code" href="a00301.html">mutex</a> {
-<a name="l00041"></a>00041 <span class="keyword">public</span>:
-<a name="l00043"></a><a class="code" href="a00301.html#05313cb77d4f85213103d4dab74ed454">00043</a> <a class="code" href="a00301.html#05313cb77d4f85213103d4dab74ed454">mutex</a>() {
-<a name="l00044"></a>00044 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span> internal_construct();
-<a name="l00046"></a>00046 <span class="preprocessor">#else</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span> InitializeCriticalSection(&impl);
-<a name="l00049"></a>00049 <span class="preprocessor"> #else</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span> <span class="keywordtype">int</span> error_code = pthread_mutex_init(&impl,NULL);
-<a name="l00051"></a>00051 <span class="keywordflow">if</span>( error_code )
-<a name="l00052"></a>00052 tbb::internal::handle_perror(error_code,<span class="stringliteral">"mutex: pthread_mutex_init failed"</span>);
-<a name="l00053"></a>00053 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64*/</span>
-<a name="l00054"></a>00054 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00055"></a>00055 };
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 ~<a class="code" href="a00301.html">mutex</a>() {
-<a name="l00058"></a>00058 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span> internal_destroy();
-<a name="l00060"></a>00060 <span class="preprocessor">#else</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span> DeleteCriticalSection(&impl);
-<a name="l00063"></a>00063 <span class="preprocessor"> #else</span>
-<a name="l00064"></a>00064 <span class="preprocessor"></span> pthread_mutex_destroy(&impl);
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00067"></a>00067 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00068"></a>00068 };
-<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <span class="keyword">class </span>scoped_lock;
-<a name="l00071"></a>00071 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00072"></a>00072
-<a name="l00074"></a>00074
-<a name="l00076"></a><a class="code" href="a00302.html">00076</a> <span class="keyword">class </span><a class="code" href="a00302.html">scoped_lock</a> : internal::no_copy {
-<a name="l00077"></a>00077 <span class="keyword">public</span>:
-<a name="l00079"></a><a class="code" href="a00302.html#1d403ae51b484df5d86d85ae38f11e6e">00079</a> <a class="code" href="a00302.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>() : my_mutex(NULL) {};
-<a name="l00080"></a>00080
-<a name="l00082"></a><a class="code" href="a00302.html#605a6b9af0f8cdabdf81825e0de99600">00082</a> <a class="code" href="a00302.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>( <a class="code" href="a00301.html">mutex</a>& <a class="code" href="a00301.html">mutex</a> ) {
-<a name="l00083"></a>00083 <a class="code" href="a00302.html#862e022841cdc522e4296a5533b22efd">acquire</a>( mutex );
-<a name="l00084"></a>00084 }
-<a name="l00085"></a>00085
-<a name="l00087"></a><a class="code" href="a00302.html#0ebbbecaf4311e9df7362cb76ceaa368">00087</a> <a class="code" href="a00302.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>() {
-<a name="l00088"></a>00088 <span class="keywordflow">if</span>( my_mutex )
-<a name="l00089"></a>00089 <a class="code" href="a00302.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>();
-<a name="l00090"></a>00090 }
-<a name="l00091"></a>00091
-<a name="l00093"></a><a class="code" href="a00302.html#862e022841cdc522e4296a5533b22efd">00093</a> <span class="keywordtype">void</span> <a class="code" href="a00302.html#862e022841cdc522e4296a5533b22efd">acquire</a>( <a class="code" href="a00301.html">mutex</a>& <a class="code" href="a00301.html">mutex</a> ) {
-<a name="l00094"></a>00094 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00095"></a>00095 <span class="preprocessor"></span> internal_acquire(mutex);
-<a name="l00096"></a>00096 <span class="preprocessor">#else</span>
-<a name="l00097"></a>00097 <span class="preprocessor"></span> mutex.<a class="code" href="a00301.html#4470e61c24c129a0299ca6c17240adbb">lock</a>();
-<a name="l00098"></a>00098 my_mutex = &mutex;
-<a name="l00099"></a>00099 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00100"></a>00100 }
-<a name="l00101"></a>00101
-<a name="l00103"></a><a class="code" href="a00302.html#591e0c49b82bcedffcbe0923f1b915ec">00103</a> <span class="keywordtype">bool</span> <a class="code" href="a00302.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>( <a class="code" href="a00301.html">mutex</a>& <a class="code" href="a00301.html">mutex</a> ) {
-<a name="l00104"></a>00104 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal_try_acquire (mutex);
-<a name="l00106"></a>00106 <span class="preprocessor">#else</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00301.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>();
-<a name="l00108"></a>00108 <span class="keywordflow">if</span>( result )
-<a name="l00109"></a>00109 my_mutex = &mutex;
-<a name="l00110"></a>00110 <span class="keywordflow">return</span> result;
-<a name="l00111"></a>00111 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00112"></a>00112 }
-<a name="l00113"></a>00113
-<a name="l00115"></a><a class="code" href="a00302.html#0d51d18cd99df3b2e93bf07378d0992c">00115</a> <span class="keywordtype">void</span> <a class="code" href="a00302.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>() {
-<a name="l00116"></a>00116 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span> internal_release ();
-<a name="l00118"></a>00118 <span class="preprocessor">#else</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span> my_mutex-><a class="code" href="a00301.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>();
-<a name="l00120"></a>00120 my_mutex = NULL;
-<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00122"></a>00122 }
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <span class="keyword">private</span>:
-<a name="l00126"></a>00126 <a class="code" href="a00301.html">mutex</a>* my_mutex;
-<a name="l00127"></a>00127
-<a name="l00129"></a>00129 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00301.html">mutex</a>& m );
-<a name="l00130"></a>00130
-<a name="l00132"></a>00132 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00301.html">mutex</a>& m );
-<a name="l00133"></a>00133
-<a name="l00135"></a>00135 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
-<a name="l00136"></a>00136
-<a name="l00137"></a>00137 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00301.html">mutex</a>;
-<a name="l00138"></a>00138 };
-<a name="l00139"></a>00139
-<a name="l00140"></a>00140 <span class="comment">// Mutex traits</span>
-<a name="l00141"></a>00141 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00142"></a>00142 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00143"></a>00143 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">false</span>;
-<a name="l00144"></a>00144
-<a name="l00145"></a>00145 <span class="comment">// ISO C++0x compatibility methods</span>
-<a name="l00146"></a>00146
-<a name="l00148"></a><a class="code" href="a00301.html#4470e61c24c129a0299ca6c17240adbb">00148</a> <span class="keywordtype">void</span> <a class="code" href="a00301.html#4470e61c24c129a0299ca6c17240adbb">lock</a>() {
-<a name="l00149"></a>00149 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span> <a class="code" href="a00253.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00151"></a>00151 <span class="keyword">new</span>(tmp.<a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00302.html">scoped_lock</a>(*<span class="keyword">this</span>);
-<a name="l00152"></a>00152 <span class="preprocessor">#else</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00154"></a>00154 <span class="preprocessor"></span> EnterCriticalSection(&impl);
-<a name="l00155"></a>00155 <span class="preprocessor"> #else</span>
-<a name="l00156"></a>00156 <span class="preprocessor"></span> pthread_mutex_lock(&impl);
-<a name="l00157"></a>00157 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00158"></a>00158 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00159"></a>00159 }
-<a name="l00160"></a>00160
-<a name="l00162"></a>00162
-<a name="l00163"></a><a class="code" href="a00301.html#4331652c79dea1c1131bd59ab161b234">00163</a> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>() {
-<a name="l00164"></a>00164 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00165"></a>00165 <span class="preprocessor"></span> <a class="code" href="a00253.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00166"></a>00166 <a class="code" href="a00302.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00167"></a>00167 s.<a class="code" href="a00302.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = NULL;
-<a name="l00168"></a>00168 <span class="keywordflow">return</span> s.<a class="code" href="a00302.html#e86ffb41a026694b16637f78aa337874">internal_try_acquire</a>(*<span class="keyword">this</span>);
-<a name="l00169"></a>00169 <span class="preprocessor">#else</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span> <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
-<a name="l00172"></a>00172 <span class="preprocessor"> #else</span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span> <span class="keywordflow">return</span> pthread_mutex_trylock(&impl)==0;
-<a name="l00174"></a>00174 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00175"></a>00175 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177
-<a name="l00179"></a><a class="code" href="a00301.html#5fc9ef443ae75d966695546be399cc6b">00179</a> <span class="keywordtype">void</span> <a class="code" href="a00301.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>() {
-<a name="l00180"></a>00180 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span> <a class="code" href="a00253.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00182"></a>00182 <a class="code" href="a00302.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00183"></a>00183 s.<a class="code" href="a00302.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00184"></a>00184 s.<a class="code" href="a00302.html#448b7e9042afcdc455ea3f929ac4c594">internal_release</a>();
-<a name="l00185"></a>00185 <span class="preprocessor">#else</span>
-<a name="l00186"></a>00186 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span> LeaveCriticalSection(&impl);
-<a name="l00188"></a>00188 <span class="preprocessor"> #else</span>
-<a name="l00189"></a>00189 <span class="preprocessor"></span> pthread_mutex_unlock(&impl);
-<a name="l00190"></a>00190 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00191"></a>00191 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00192"></a>00192 }
-<a name="l00193"></a>00193
-<a name="l00195"></a>00195 <span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00196"></a><a class="code" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">00196</a> <span class="preprocessor"></span> <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
-<a name="l00197"></a>00197 <span class="preprocessor"> #else</span>
-<a name="l00198"></a>00198 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_mutex_t* <a class="code" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
-<a name="l00199"></a>00199 <span class="preprocessor"> #endif</span>
-<a name="l00200"></a>00200 <span class="preprocessor"></span> <a class="code" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>) &impl; }
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="keyword">enum</span> state_t {
-<a name="l00203"></a>00203 INITIALIZED=0x1234,
-<a name="l00204"></a>00204 DESTROYED=0x789A,
-<a name="l00205"></a>00205 HELD=0x56CD
-<a name="l00206"></a>00206 };
-<a name="l00207"></a>00207 <span class="keyword">private</span>:
-<a name="l00208"></a>00208 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00209"></a>00209 <span class="preprocessor"></span> CRITICAL_SECTION impl;
-<a name="l00210"></a>00210 <span class="keyword">enum</span> state_t state;
-<a name="l00211"></a>00211 <span class="preprocessor">#else</span>
-<a name="l00212"></a>00212 <span class="preprocessor"></span> pthread_mutex_t impl;
-<a name="l00213"></a>00213 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00214"></a>00214
-<a name="l00216"></a>00216 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00217"></a>00217
-<a name="l00219"></a>00219 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00220"></a>00220
-<a name="l00221"></a>00221 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00222"></a>00222 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00224"></a><a class="code" href="a00301.html#795649a185b0d6af6dc81c5f378616dd">00224</a> <span class="keywordtype">void</span> <a class="code" href="a00301.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>( state_t to ) { state = to; }
-<a name="l00225"></a>00225 <span class="preprocessor">#endif</span>
-<a name="l00226"></a>00226 <span class="preprocessor"></span>};
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 __TBB_DEFINE_PROFILING_SET_NAME(mutex)
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 } <span class="comment">// namespace tbb </span>
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00533.html b/doc/html/a00533.html
deleted file mode 100644
index 1743080..0000000
--- a/doc/html/a00533.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>null_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>null_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_null_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_null_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="keyword">namespace </span>tbb {
-<a name="l00025"></a>00025
-<a name="l00027"></a>00027
-<a name="l00029"></a><a class="code" href="a00303.html">00029</a> <span class="keyword">class </span><a class="code" href="a00303.html">null_mutex</a> {
-<a name="l00031"></a>00031 <a class="code" href="a00303.html">null_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">null_mutex</a>& );
-<a name="l00032"></a>00032 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00303.html">null_mutex</a>& );
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00304.html">00035</a> <span class="keyword">class </span><a class="code" href="a00304.html">scoped_lock</a> {
-<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037 <a class="code" href="a00304.html">scoped_lock</a>() {}
-<a name="l00038"></a>00038 <a class="code" href="a00304.html">scoped_lock</a>( <a class="code" href="a00303.html">null_mutex</a>& ) {}
-<a name="l00039"></a>00039 ~<a class="code" href="a00304.html">scoped_lock</a>() {}
-<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00303.html">null_mutex</a>& ) {}
-<a name="l00041"></a>00041 <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00303.html">null_mutex</a>& ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
-<a name="l00042"></a>00042 <span class="keywordtype">void</span> release() {}
-<a name="l00043"></a>00043 };
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <a class="code" href="a00303.html">null_mutex</a>() {}
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="comment">// Mutex traits </span>
-<a name="l00048"></a>00048 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00049"></a>00049 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">true</span>;
-<a name="l00050"></a>00050 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00051"></a>00051 };
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 }
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_null_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00534.html b/doc/html/a00534.html
deleted file mode 100644
index 9981ca0..0000000
--- a/doc/html/a00534.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>null_rw_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>null_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_null_rw_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_null_rw_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="keyword">namespace </span>tbb {
-<a name="l00025"></a>00025
-<a name="l00027"></a>00027
-<a name="l00029"></a><a class="code" href="a00305.html">00029</a> <span class="keyword">class </span><a class="code" href="a00305.html">null_rw_mutex</a> {
-<a name="l00031"></a>00031 <a class="code" href="a00305.html">null_rw_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00305.html">null_rw_mutex</a>& );
-<a name="l00032"></a>00032 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00305.html">null_rw_mutex</a>& );
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00306.html">00035</a> <span class="keyword">class </span><a class="code" href="a00306.html">scoped_lock</a> {
-<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037 <a class="code" href="a00306.html">scoped_lock</a>() {}
-<a name="l00038"></a>00038 <a class="code" href="a00306.html">scoped_lock</a>( <a class="code" href="a00305.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
-<a name="l00039"></a>00039 ~<a class="code" href="a00306.html">scoped_lock</a>() {}
-<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00305.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
-<a name="l00041"></a>00041 <span class="keywordtype">bool</span> upgrade_to_writer() { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
-<a name="l00042"></a>00042 <span class="keywordtype">bool</span> downgrade_to_reader() { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
-<a name="l00043"></a>00043 <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00305.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
-<a name="l00044"></a>00044 <span class="keywordtype">void</span> release() {}
-<a name="l00045"></a>00045 };
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <a class="code" href="a00305.html">null_rw_mutex</a>() {}
-<a name="l00048"></a>00048
-<a name="l00049"></a>00049 <span class="comment">// Mutex traits </span>
-<a name="l00050"></a>00050 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;
-<a name="l00051"></a>00051 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">true</span>;
-<a name="l00052"></a>00052 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00053"></a>00053 };
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 }
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_null_rw_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00535.html b/doc/html/a00535.html
deleted file mode 100644
index f1a33ff..0000000
--- a/doc/html/a00535.html
+++ /dev/null
@@ -1,480 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_do.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_do.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_do_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_do_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <iterator></span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00031"></a>00031 <span class="keyword">namespace </span>internal {
-<a name="l00032"></a>00032 <span class="keyword">template</span><<span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item> <span class="keyword">class </span>parallel_do_feeder_impl;
-<a name="l00033"></a>00033 <span class="keyword">template</span><<span class="keyword">typename</span> Body> <span class="keyword">class </span>do_group_task;
-<a name="l00034"></a>00034
-<a name="l00036"></a>00036 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00037"></a>00037 <span class="keyword">struct </span>strip { <span class="keyword">typedef</span> T type; };
-<a name="l00038"></a>00038 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00039"></a>00039 <span class="keyword">struct </span>strip<T&> { <span class="keyword">typedef</span> T type; };
-<a name="l00040"></a>00040 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00041"></a>00041 <span class="keyword">struct </span>strip<const T&> { <span class="keyword">typedef</span> T type; };
-<a name="l00042"></a>00042 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00043"></a>00043 <span class="keyword">struct </span>strip<volatile T&> { <span class="keyword">typedef</span> T type; };
-<a name="l00044"></a>00044 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00045"></a>00045 <span class="keyword">struct </span>strip<const volatile T&> { <span class="keyword">typedef</span> T type; };
-<a name="l00046"></a>00046 <span class="comment">// Most of the compilers remove cv-qualifiers from non-reference function argument types. </span>
-<a name="l00047"></a>00047 <span class="comment">// But unfortunately there are those that don't.</span>
-<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00049"></a>00049 <span class="keyword">struct </span>strip<const T> { <span class="keyword">typedef</span> T type; };
-<a name="l00050"></a>00050 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00051"></a>00051 <span class="keyword">struct </span>strip<volatile T> { <span class="keyword">typedef</span> T type; };
-<a name="l00052"></a>00052 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00053"></a>00053 <span class="keyword">struct </span>strip<const volatile T> { <span class="keyword">typedef</span> T type; };
-<a name="l00054"></a>00054 } <span class="comment">// namespace internal</span>
-<a name="l00056"></a>00056 <span class="comment"></span>
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 <span class="keyword">template</span><<span class="keyword">typename</span> Item>
-<a name="l00060"></a><a class="code" href="a00307.html">00060</a> <span class="keyword">class </span><a class="code" href="a00307.html">parallel_do_feeder</a>: internal::no_copy
-<a name="l00061"></a>00061 {
-<a name="l00062"></a>00062 <a class="code" href="a00307.html">parallel_do_feeder</a>() {}
-<a name="l00063"></a>00063 <span class="keyword">virtual</span> ~<a class="code" href="a00307.html">parallel_do_feeder</a> () {}
-<a name="l00064"></a>00064 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_add( <span class="keyword">const</span> Item& item ) = 0;
-<a name="l00065"></a>00065 <span class="keyword">template</span><<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>internal::parallel_do_feeder_impl;
-<a name="l00066"></a>00066 <span class="keyword">public</span>:
-<a name="l00068"></a><a class="code" href="a00307.html#40baaf0f6856f4491dd0adf896c93516">00068</a> <span class="keywordtype">void</span> <a class="code" href="a00307.html#40baaf0f6856f4491dd0adf896c93516">add</a>( <span class="keyword">const</span> Item& item ) {internal_add(item);}
-<a name="l00069"></a>00069 };
-<a name="l00070"></a>00070
-<a name="l00072"></a>00072 <span class="keyword">namespace </span>internal {
-<a name="l00074"></a>00074
-<a name="l00076"></a>00076 <span class="keyword">template</span><<span class="keyword">class</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00077"></a>00077 <span class="keyword">class </span>parallel_do_operator_selector
-<a name="l00078"></a>00078 {
-<a name="l00079"></a>00079 <span class="keyword">typedef</span> parallel_do_feeder<Item> Feeder;
-<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2, <span class="keyword">typename</span> CvItem >
-<a name="l00081"></a>00081 <span class="keyword">static</span> <span class="keywordtype">void</span> internal_call( <span class="keyword">const</span> Body& obj, A1& arg1, A2&, <span class="keywordtype">void</span> (Body::*)(CvItem) <span class="keyword">const</span> ) {
-<a name="l00082"></a>00082 obj(arg1);
-<a name="l00083"></a>00083 }
-<a name="l00084"></a>00084 <span class="keyword">template</span><<span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2, <span class="keyword">typename</span> CvItem >
-<a name="l00085"></a>00085 <span class="keyword">static</span> <span class="keywordtype">void</span> internal_call( <span class="keyword">const</span> Body& obj, A1& arg1, A2& arg2, <span class="keywordtype">void</span> (Body::*)(CvItem, parallel_do_feeder<Item>&) <span class="keyword">const</span> ) {
-<a name="l00086"></a>00086 obj(arg1, arg2);
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="keyword">public</span>:
-<a name="l00090"></a>00090 <span class="keyword">template</span><<span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2 >
-<a name="l00091"></a>00091 <span class="keyword">static</span> <span class="keywordtype">void</span> call( <span class="keyword">const</span> Body& obj, A1& arg1, A2& arg2 )
-<a name="l00092"></a>00092 {
-<a name="l00093"></a>00093 internal_call( obj, arg1, arg2, &Body::operator() );
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095 };
-<a name="l00096"></a>00096
-<a name="l00098"></a>00098
-<a name="l00100"></a>00100 <span class="keyword">template</span><<span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00101"></a>00101 <span class="keyword">class </span>do_iteration_task: <span class="keyword">public</span> task
-<a name="l00102"></a>00102 {
-<a name="l00103"></a>00103 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 Item my_value;
-<a name="l00106"></a>00106 feeder_type& my_feeder;
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 do_iteration_task( <span class="keyword">const</span> Item& value, feeder_type& feeder ) :
-<a name="l00109"></a>00109 my_value(value), my_feeder(feeder)
-<a name="l00110"></a>00110 {}
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="comment">/*override*/</span>
-<a name="l00113"></a>00113 task* execute()
-<a name="l00114"></a>00114 {
-<a name="l00115"></a>00115 parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, my_value, my_feeder);
-<a name="l00116"></a>00116 <span class="keywordflow">return</span> NULL;
-<a name="l00117"></a>00117 }
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keyword">template</span><<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>parallel_do_feeder_impl;
-<a name="l00120"></a>00120 }; <span class="comment">// class do_iteration_task</span>
-<a name="l00121"></a>00121
-<a name="l00122"></a>00122 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00123"></a>00123 <span class="keyword">class </span>do_iteration_task_iter: <span class="keyword">public</span> task
-<a name="l00124"></a>00124 {
-<a name="l00125"></a>00125 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00126"></a>00126
-<a name="l00127"></a>00127 Iterator my_iter;
-<a name="l00128"></a>00128 feeder_type& my_feeder;
-<a name="l00129"></a>00129
-<a name="l00130"></a>00130 do_iteration_task_iter( <span class="keyword">const</span> Iterator& iter, feeder_type& feeder ) :
-<a name="l00131"></a>00131 my_iter(iter), my_feeder(feeder)
-<a name="l00132"></a>00132 {}
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="comment">/*override*/</span>
-<a name="l00135"></a>00135 task* execute()
-<a name="l00136"></a>00136 {
-<a name="l00137"></a>00137 parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, *my_iter, my_feeder);
-<a name="l00138"></a>00138 <span class="keywordflow">return</span> NULL;
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_group_task_forward;
-<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_group_task_input;
-<a name="l00143"></a>00143 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_task_iter;
-<a name="l00144"></a>00144 }; <span class="comment">// class do_iteration_task_iter</span>
-<a name="l00145"></a>00145
-<a name="l00147"></a>00147
-<a name="l00149"></a>00149 <span class="keyword">template</span><<span class="keyword">class</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00150"></a>00150 <span class="keyword">class </span>parallel_do_feeder_impl : <span class="keyword">public</span> parallel_do_feeder<Item>
-<a name="l00151"></a>00151 {
-<a name="l00152"></a>00152 <span class="comment">/*override*/</span>
-<a name="l00153"></a>00153 <span class="keywordtype">void</span> internal_add( <span class="keyword">const</span> Item& item )
-<a name="l00154"></a>00154 {
-<a name="l00155"></a>00155 <span class="keyword">typedef</span> do_iteration_task<Body, Item> iteration_type;
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 iteration_type& t = *<span class="keyword">new</span> (task::allocate_additional_child_of(*my_barrier)) iteration_type(item, *<span class="keyword">this</span>);
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 t.spawn( t );
-<a name="l00160"></a>00160 }
-<a name="l00161"></a>00161 <span class="keyword">public</span>:
-<a name="l00162"></a>00162 <span class="keyword">const</span> Body* my_body;
-<a name="l00163"></a>00163 empty_task* my_barrier;
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 parallel_do_feeder_impl()
-<a name="l00166"></a>00166 {
-<a name="l00167"></a>00167 my_barrier = <span class="keyword">new</span>( <a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) empty_task();
-<a name="l00168"></a>00168 __TBB_ASSERT(my_barrier, <span class="stringliteral">"root task allocation failed"</span>);
-<a name="l00169"></a>00169 }
-<a name="l00170"></a>00170
-<a name="l00171"></a>00171 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00172"></a>00172 <span class="preprocessor"></span> parallel_do_feeder_impl(<a class="code" href="a00339.html">tbb::task_group_context</a> &context)
-<a name="l00173"></a>00173 {
-<a name="l00174"></a>00174 my_barrier = <span class="keyword">new</span>( <a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(context) ) empty_task();
-<a name="l00175"></a>00175 __TBB_ASSERT(my_barrier, <span class="stringliteral">"root task allocation failed"</span>);
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177 <span class="preprocessor">#endif</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span>
-<a name="l00179"></a>00179 ~parallel_do_feeder_impl()
-<a name="l00180"></a>00180 {
-<a name="l00181"></a>00181 my_barrier->destroy(*my_barrier);
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183 }; <span class="comment">// class parallel_do_feeder_impl</span>
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185
-<a name="l00187"></a>00187
-<a name="l00190"></a>00190 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00191"></a>00191 <span class="keyword">class </span>do_group_task_forward: <span class="keyword">public</span> task
-<a name="l00192"></a>00192 {
-<a name="l00193"></a>00193 <span class="keyword">static</span> <span class="keyword">const</span> size_t max_arg_size = 4;
-<a name="l00194"></a>00194
-<a name="l00195"></a>00195 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 feeder_type& my_feeder;
-<a name="l00198"></a>00198 Iterator my_first;
-<a name="l00199"></a>00199 size_t my_size;
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 do_group_task_forward( Iterator first, size_t size, feeder_type& feeder )
-<a name="l00202"></a>00202 : my_feeder(feeder), my_first(first), my_size(size)
-<a name="l00203"></a>00203 {}
-<a name="l00204"></a>00204
-<a name="l00205"></a>00205 <span class="comment">/*override*/</span> task* execute()
-<a name="l00206"></a>00206 {
-<a name="l00207"></a>00207 <span class="keyword">typedef</span> do_iteration_task_iter<Iterator, Body, Item> iteration_type;
-<a name="l00208"></a>00208 __TBB_ASSERT( my_size>0, NULL );
-<a name="l00209"></a>00209 task_list list;
-<a name="l00210"></a>00210 task* t;
-<a name="l00211"></a>00211 size_t k=0;
-<a name="l00212"></a>00212 <span class="keywordflow">for</span>(;;) {
-<a name="l00213"></a>00213 t = <span class="keyword">new</span>( allocate_child() ) iteration_type( my_first, my_feeder );
-<a name="l00214"></a>00214 ++my_first;
-<a name="l00215"></a>00215 <span class="keywordflow">if</span>( ++k==my_size ) <span class="keywordflow">break</span>;
-<a name="l00216"></a>00216 list.push_back(*t);
-<a name="l00217"></a>00217 }
-<a name="l00218"></a>00218 set_ref_count(<span class="keywordtype">int</span>(k+1));
-<a name="l00219"></a>00219 spawn(list);
-<a name="l00220"></a>00220 spawn_and_wait_for_all(*t);
-<a name="l00221"></a>00221 <span class="keywordflow">return</span> NULL;
-<a name="l00222"></a>00222 }
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> _Item> <span class="keyword">friend</span> <span class="keyword">class </span>do_task_iter;
-<a name="l00225"></a>00225 }; <span class="comment">// class do_group_task_forward</span>
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 <span class="keyword">template</span><<span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00228"></a>00228 <span class="keyword">class </span>do_group_task_input: <span class="keyword">public</span> task
-<a name="l00229"></a>00229 {
-<a name="l00230"></a>00230 <span class="keyword">static</span> <span class="keyword">const</span> size_t max_arg_size = 4;
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00233"></a>00233
-<a name="l00234"></a>00234 feeder_type& my_feeder;
-<a name="l00235"></a>00235 size_t my_size;
-<a name="l00236"></a>00236 aligned_space<Item, max_arg_size> my_arg;
-<a name="l00237"></a>00237
-<a name="l00238"></a>00238 do_group_task_input( feeder_type& feeder )
-<a name="l00239"></a>00239 : my_feeder(feeder), my_size(0)
-<a name="l00240"></a>00240 {}
-<a name="l00241"></a>00241
-<a name="l00242"></a>00242 <span class="comment">/*override*/</span> task* execute()
-<a name="l00243"></a>00243 {
-<a name="l00244"></a>00244 <span class="keyword">typedef</span> do_iteration_task_iter<Item*, Body, Item> iteration_type;
-<a name="l00245"></a>00245 __TBB_ASSERT( my_size>0, NULL );
-<a name="l00246"></a>00246 task_list list;
-<a name="l00247"></a>00247 task* t;
-<a name="l00248"></a>00248 size_t k=0;
-<a name="l00249"></a>00249 <span class="keywordflow">for</span>(;;) {
-<a name="l00250"></a>00250 t = <span class="keyword">new</span>( allocate_child() ) iteration_type( my_arg.begin() + k, my_feeder );
-<a name="l00251"></a>00251 <span class="keywordflow">if</span>( ++k==my_size ) <span class="keywordflow">break</span>;
-<a name="l00252"></a>00252 list.push_back(*t);
-<a name="l00253"></a>00253 }
-<a name="l00254"></a>00254 set_ref_count(<span class="keywordtype">int</span>(k+1));
-<a name="l00255"></a>00255 spawn(list);
-<a name="l00256"></a>00256 spawn_and_wait_for_all(*t);
-<a name="l00257"></a>00257 <span class="keywordflow">return</span> NULL;
-<a name="l00258"></a>00258 }
-<a name="l00259"></a>00259
-<a name="l00260"></a>00260 ~do_group_task_input(){
-<a name="l00261"></a>00261 <span class="keywordflow">for</span>( size_t k=0; k<my_size; ++k)
-<a name="l00262"></a>00262 (my_arg.begin() + k)->~Item();
-<a name="l00263"></a>00263 }
-<a name="l00264"></a>00264
-<a name="l00265"></a>00265 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_task_iter;
-<a name="l00266"></a>00266 }; <span class="comment">// class do_group_task_input</span>
-<a name="l00267"></a>00267
-<a name="l00269"></a>00269
-<a name="l00271"></a>00271 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00272"></a>00272 <span class="keyword">class </span>do_task_iter: <span class="keyword">public</span> task
-<a name="l00273"></a>00273 {
-<a name="l00274"></a>00274 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00275"></a>00275
-<a name="l00276"></a>00276 <span class="keyword">public</span>:
-<a name="l00277"></a>00277 do_task_iter( Iterator first, Iterator last , feeder_type& feeder ) :
-<a name="l00278"></a>00278 my_first(first), my_last(last), my_feeder(feeder)
-<a name="l00279"></a>00279 {}
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="keyword">private</span>:
-<a name="l00282"></a>00282 Iterator my_first;
-<a name="l00283"></a>00283 Iterator my_last;
-<a name="l00284"></a>00284 feeder_type& my_feeder;
-<a name="l00285"></a>00285
-<a name="l00286"></a>00286 <span class="comment">/* Do not merge run(xxx) and run_xxx() methods. They are separated in order</span>
-<a name="l00287"></a>00287 <span class="comment"> to make sure that compilers will eliminate unused argument of type xxx</span>
-<a name="l00288"></a>00288 <span class="comment"> (that is will not put it on stack). The sole purpose of this argument </span>
-<a name="l00289"></a>00289 <span class="comment"> is overload resolution.</span>
-<a name="l00290"></a>00290 <span class="comment"> </span>
-<a name="l00291"></a>00291 <span class="comment"> An alternative could be using template functions, but explicit specialization </span>
-<a name="l00292"></a>00292 <span class="comment"> of member function templates is not supported for non specialized class </span>
-<a name="l00293"></a>00293 <span class="comment"> templates. Besides template functions would always fall back to the least </span>
-<a name="l00294"></a>00294 <span class="comment"> efficient variant (the one for input iterators) in case of iterators having </span>
-<a name="l00295"></a>00295 <span class="comment"> custom tags derived from basic ones. */</span>
-<a name="l00296"></a>00296 <span class="comment">/*override*/</span> task* execute()
-<a name="l00297"></a>00297 {
-<a name="l00298"></a>00298 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::iterator_traits<Iterator>::iterator_category iterator_tag;
-<a name="l00299"></a>00299 <span class="keywordflow">return</span> run( (iterator_tag*)NULL );
-<a name="l00300"></a>00300 }
-<a name="l00301"></a>00301
-<a name="l00304"></a>00304 <span class="keyword">inline</span> task* run( <span class="keywordtype">void</span>* ) { <span class="keywordflow">return</span> run_for_input_iterator(); }
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 task* run_for_input_iterator() {
-<a name="l00307"></a>00307 <span class="keyword">typedef</span> do_group_task_input<Body, Item> block_type;
-<a name="l00308"></a>00308
-<a name="l00309"></a>00309 block_type& t = *<span class="keyword">new</span>( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(my_feeder);
-<a name="l00310"></a>00310 size_t k=0;
-<a name="l00311"></a>00311 <span class="keywordflow">while</span>( !(my_first == my_last) ) {
-<a name="l00312"></a>00312 <span class="keyword">new</span> (t.my_arg.begin() + k) Item(*my_first);
-<a name="l00313"></a>00313 ++my_first;
-<a name="l00314"></a>00314 <span class="keywordflow">if</span>( ++k==block_type::max_arg_size ) {
-<a name="l00315"></a>00315 <span class="keywordflow">if</span> ( !(my_first == my_last) )
-<a name="l00316"></a>00316 recycle_to_reexecute();
-<a name="l00317"></a>00317 <span class="keywordflow">break</span>;
-<a name="l00318"></a>00318 }
-<a name="l00319"></a>00319 }
-<a name="l00320"></a>00320 <span class="keywordflow">if</span>( k==0 ) {
-<a name="l00321"></a>00321 destroy(t);
-<a name="l00322"></a>00322 <span class="keywordflow">return</span> NULL;
-<a name="l00323"></a>00323 } <span class="keywordflow">else</span> {
-<a name="l00324"></a>00324 t.my_size = k;
-<a name="l00325"></a>00325 <span class="keywordflow">return</span> &t;
-<a name="l00326"></a>00326 }
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328
-<a name="l00329"></a>00329 <span class="keyword">inline</span> task* run( std::forward_iterator_tag* ) { <span class="keywordflow">return</span> run_for_forward_iterator(); }
-<a name="l00330"></a>00330
-<a name="l00331"></a>00331 task* run_for_forward_iterator() {
-<a name="l00332"></a>00332 <span class="keyword">typedef</span> do_group_task_forward<Iterator, Body, Item> block_type;
-<a name="l00333"></a>00333
-<a name="l00334"></a>00334 Iterator first = my_first;
-<a name="l00335"></a>00335 size_t k=0;
-<a name="l00336"></a>00336 <span class="keywordflow">while</span>( !(my_first==my_last) ) {
-<a name="l00337"></a>00337 ++my_first;
-<a name="l00338"></a>00338 <span class="keywordflow">if</span>( ++k==block_type::max_arg_size ) {
-<a name="l00339"></a>00339 <span class="keywordflow">if</span> ( !(my_first==my_last) )
-<a name="l00340"></a>00340 recycle_to_reexecute();
-<a name="l00341"></a>00341 <span class="keywordflow">break</span>;
-<a name="l00342"></a>00342 }
-<a name="l00343"></a>00343 }
-<a name="l00344"></a>00344 <span class="keywordflow">return</span> k==0 ? NULL : <span class="keyword">new</span>( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(first, k, my_feeder);
-<a name="l00345"></a>00345 }
-<a name="l00346"></a>00346
-<a name="l00347"></a>00347 <span class="keyword">inline</span> task* run( std::random_access_iterator_tag* ) { <span class="keywordflow">return</span> run_for_random_access_iterator(); }
-<a name="l00348"></a>00348
-<a name="l00349"></a>00349 task* run_for_random_access_iterator() {
-<a name="l00350"></a>00350 <span class="keyword">typedef</span> do_group_task_forward<Iterator, Body, Item> block_type;
-<a name="l00351"></a>00351 <span class="keyword">typedef</span> do_iteration_task_iter<Iterator, Body, Item> iteration_type;
-<a name="l00352"></a>00352
-<a name="l00353"></a>00353 size_t k = static_cast<size_t>(my_last-my_first);
-<a name="l00354"></a>00354 <span class="keywordflow">if</span>( k > block_type::max_arg_size ) {
-<a name="l00355"></a>00355 Iterator middle = my_first + k/2;
-<a name="l00356"></a>00356
-<a name="l00357"></a>00357 empty_task& c = *<span class="keyword">new</span>( allocate_continuation() ) empty_task;
-<a name="l00358"></a>00358 do_task_iter& b = *<span class="keyword">new</span>( c.allocate_child() ) do_task_iter(middle, my_last, my_feeder);
-<a name="l00359"></a>00359 recycle_as_child_of(c);
-<a name="l00360"></a>00360
-<a name="l00361"></a>00361 my_last = middle;
-<a name="l00362"></a>00362 c.set_ref_count(2);
-<a name="l00363"></a>00363 c.spawn(b);
-<a name="l00364"></a>00364 <span class="keywordflow">return</span> <span class="keyword">this</span>;
-<a name="l00365"></a>00365 }<span class="keywordflow">else</span> <span class="keywordflow">if</span>( k != 0 ) {
-<a name="l00366"></a>00366 task_list list;
-<a name="l00367"></a>00367 task* t;
-<a name="l00368"></a>00368 size_t k1=0;
-<a name="l00369"></a>00369 <span class="keywordflow">for</span>(;;) {
-<a name="l00370"></a>00370 t = <span class="keyword">new</span>( allocate_child() ) iteration_type(my_first, my_feeder);
-<a name="l00371"></a>00371 ++my_first;
-<a name="l00372"></a>00372 <span class="keywordflow">if</span>( ++k1==k ) <span class="keywordflow">break</span>;
-<a name="l00373"></a>00373 list.push_back(*t);
-<a name="l00374"></a>00374 }
-<a name="l00375"></a>00375 set_ref_count(<span class="keywordtype">int</span>(k+1));
-<a name="l00376"></a>00376 spawn(list);
-<a name="l00377"></a>00377 spawn_and_wait_for_all(*t);
-<a name="l00378"></a>00378 }
-<a name="l00379"></a>00379 <span class="keywordflow">return</span> NULL;
-<a name="l00380"></a>00380 }
-<a name="l00381"></a>00381 }; <span class="comment">// class do_task_iter</span>
-<a name="l00382"></a>00382
-<a name="l00384"></a>00384
-<a name="l00386"></a>00386 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00387"></a>00387 <span class="keywordtype">void</span> run_parallel_do( Iterator first, Iterator last, <span class="keyword">const</span> Body& body
-<a name="l00388"></a>00388 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00389"></a>00389 , task_group_context& context
-<a name="l00390"></a>00390 #endif
-<a name="l00391"></a>00391 )
-<a name="l00392"></a>00392 {
-<a name="l00393"></a>00393 <span class="keyword">typedef</span> do_task_iter<Iterator, Body, Item> root_iteration_task;
-<a name="l00394"></a>00394 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00395"></a>00395 <span class="preprocessor"></span> parallel_do_feeder_impl<Body, Item> feeder(context);
-<a name="l00396"></a>00396 <span class="preprocessor">#else</span>
-<a name="l00397"></a>00397 <span class="preprocessor"></span> parallel_do_feeder_impl<Body, Item> feeder;
-<a name="l00398"></a>00398 <span class="preprocessor">#endif</span>
-<a name="l00399"></a>00399 <span class="preprocessor"></span> feeder.my_body = &body;
-<a name="l00400"></a>00400
-<a name="l00401"></a>00401 root_iteration_task &t = *<span class="keyword">new</span>( feeder.my_barrier->allocate_child() ) root_iteration_task(first, last, feeder);
-<a name="l00402"></a>00402
-<a name="l00403"></a>00403 feeder.my_barrier->set_ref_count(2);
-<a name="l00404"></a>00404 feeder.my_barrier->spawn_and_wait_for_all(t);
-<a name="l00405"></a>00405 }
-<a name="l00406"></a>00406
-<a name="l00408"></a>00408
-<a name="l00410"></a>00410 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00411"></a>00411 <span class="keywordtype">void</span> select_parallel_do( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <span class="keywordtype">void</span> (Body::*)(Item) <span class="keyword">const</span>
-<a name="l00412"></a>00412 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00413"></a>00413 , task_group_context& context
-<a name="l00414"></a>00414 #endif <span class="comment">// __TBB_TASK_GROUP_CONTEXT </span>
-<a name="l00415"></a>00415 )
-<a name="l00416"></a>00416 {
-<a name="l00417"></a>00417 run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
-<a name="l00418"></a>00418 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00419"></a>00419 <span class="preprocessor"></span> , context
-<a name="l00420"></a>00420 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT </span>
-<a name="l00421"></a>00421 <span class="preprocessor"></span> );
-<a name="l00422"></a>00422 }
-<a name="l00423"></a>00423
-<a name="l00425"></a>00425
-<a name="l00427"></a>00427 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item, <span class="keyword">typename</span> _Item>
-<a name="l00428"></a>00428 <span class="keywordtype">void</span> select_parallel_do( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <span class="keywordtype">void</span> (Body::*)(Item, parallel_do_feeder<_Item>&) <span class="keyword">const</span>
-<a name="l00429"></a>00429 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00430"></a>00430 , task_group_context& context
-<a name="l00431"></a>00431 #endif <span class="comment">// __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00432"></a>00432 )
-<a name="l00433"></a>00433 {
-<a name="l00434"></a>00434 run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
-<a name="l00435"></a>00435 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00436"></a>00436 <span class="preprocessor"></span> , context
-<a name="l00437"></a>00437 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00438"></a>00438 <span class="preprocessor"></span> );
-<a name="l00439"></a>00439 }
-<a name="l00440"></a>00440
-<a name="l00441"></a>00441 } <span class="comment">// namespace internal</span>
-<a name="l00443"></a>00443 <span class="comment"></span>
-<a name="l00444"></a>00444
-<a name="l00467"></a>00467
-<a name="l00468"></a>00468
-<a name="l00469"></a>00469 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body>
-<a name="l00470"></a><a class="code" href="a00426.html#g3383e2703977012b6f384d673410f1f7">00470</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body )
-<a name="l00471"></a>00471 {
-<a name="l00472"></a>00472 <span class="keywordflow">if</span> ( first == last )
-<a name="l00473"></a>00473 <span class="keywordflow">return</span>;
-<a name="l00474"></a>00474 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00475"></a>00475 <span class="preprocessor"></span> <a class="code" href="a00339.html">task_group_context</a> context;
-<a name="l00476"></a>00476 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00477"></a>00477 <span class="preprocessor"></span> internal::select_parallel_do( first, last, body, &Body::operator()
-<a name="l00478"></a>00478 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00479"></a>00479 , context
-<a name="l00480"></a>00480 #endif <span class="comment">// __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00481"></a>00481 );
-<a name="l00482"></a>00482 }
-<a name="l00483"></a>00483
-<a name="l00484"></a>00484 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00486"></a>00486 <span class="preprocessor"></span>
-<a name="l00487"></a>00487 <span class="preprocessor">template<typename Iterator, typename Body> </span>
-<a name="l00488"></a><a class="code" href="a00426.html#g2617dc9b88b3285a7212599d49f74228">00488</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00426.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <a class="code" href="a00339.html">task_group_context</a>& context )
-<a name="l00489"></a>00489 {
-<a name="l00490"></a>00490 <span class="keywordflow">if</span> ( first == last )
-<a name="l00491"></a>00491 <span class="keywordflow">return</span>;
-<a name="l00492"></a>00492 internal::select_parallel_do( first, last, body, &Body::operator(), context );
-<a name="l00493"></a>00493 }
-<a name="l00494"></a>00494 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00495"></a>00495 <span class="preprocessor"></span>
-<a name="l00497"></a>00497
-<a name="l00498"></a>00498 } <span class="comment">// namespace </span>
-<a name="l00499"></a>00499
-<a name="l00500"></a>00500 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_do_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00544.html b/doc/html/a00544.html
deleted file mode 100644
index 4e3d497..0000000
--- a/doc/html/a00544.html
+++ /dev/null
@@ -1,256 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_for.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_for.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_for_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_for_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <new></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "task.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="keyword">namespace </span>interface6 {
-<a name="l00034"></a>00034 <span class="keyword">namespace </span>internal {
-<a name="l00035"></a>00035
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00039"></a>00039 <span class="keyword">class </span>start_for: <span class="keyword">public</span> task {
-<a name="l00040"></a>00040 Range my_range;
-<a name="l00041"></a>00041 <span class="keyword">const</span> Body my_body;
-<a name="l00042"></a>00042 <span class="keyword">typename</span> Partitioner::task_partition_type my_partition;
-<a name="l00043"></a>00043 <span class="comment">/*override*/</span> task* execute();
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="keyword">public</span>:
-<a name="l00047"></a>00047 start_for( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, Partitioner& partitioner ) :
-<a name="l00048"></a>00048 my_range(range),
-<a name="l00049"></a>00049 my_body(body),
-<a name="l00050"></a>00050 my_partition(partitioner)
-<a name="l00051"></a>00051 {
-<a name="l00052"></a>00052 }
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 start_for( start_for& parent_, split ) :
-<a name="l00056"></a>00056 my_range(parent_.my_range,split()),
-<a name="l00057"></a>00057 my_body(parent_.my_body),
-<a name="l00058"></a>00058 my_partition(parent_.my_partition, split())
-<a name="l00059"></a>00059 {
-<a name="l00060"></a>00060 my_partition.set_affinity(*<span class="keyword">this</span>);
-<a name="l00061"></a>00061 }
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 start_for( start_for& parent_, <span class="keyword">const</span> Range& r, depth_t d ) :
-<a name="l00065"></a>00065 my_range(r),
-<a name="l00066"></a>00066 my_body(parent_.my_body),
-<a name="l00067"></a>00067 my_partition(parent_.my_partition,split())
-<a name="l00068"></a>00068 {
-<a name="l00069"></a>00069 my_partition.set_affinity(*<span class="keyword">this</span>);
-<a name="l00070"></a>00070 my_partition.align_depth( d );
-<a name="l00071"></a>00071 }
-<a name="l00073"></a>00073 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
-<a name="l00074"></a>00074 my_partition.note_affinity( <span class="keywordtype">id</span> );
-<a name="l00075"></a>00075 }
-<a name="l00076"></a>00076 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> Partitioner& partitioner ) {
-<a name="l00077"></a>00077 <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00078"></a>00078 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
-<a name="l00079"></a>00079 start_for& a = *<span class="keyword">new</span>(<a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_for(range,body,const_cast<Partitioner&>(partitioner));
-<a name="l00080"></a>00080 <span class="preprocessor">#else</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span> <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
-<a name="l00082"></a>00082 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
-<a name="l00083"></a>00083 task_group_context context;
-<a name="l00084"></a>00084 start_for& a = *<span class="keyword">new</span>(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
-<a name="l00085"></a>00085 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
-<a name="l00086"></a>00086 <a class="code" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088 }
-<a name="l00089"></a>00089 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> Partitioner& partitioner, task_group_context& context ) {
-<a name="l00091"></a>00091 <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00092"></a>00092 start_for& a = *<span class="keyword">new</span>(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
-<a name="l00093"></a>00093 <a class="code" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095 }
-<a name="l00096"></a>00096 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00098"></a>00098 flag_task *create_continuation() {
-<a name="l00099"></a>00099 <span class="keywordflow">return</span> <span class="keyword">new</span>( allocate_continuation() ) flag_task();
-<a name="l00100"></a>00100 }
-<a name="l00102"></a>00102 <span class="keywordtype">void</span> run_body( Range &r ) { my_body( r ); }
-<a name="l00103"></a>00103 };
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00106"></a>00106 task* start_for<Range,Body,Partitioner>::execute() {
-<a name="l00107"></a>00107 my_partition.check_being_stolen( *<span class="keyword">this</span> );
-<a name="l00108"></a>00108 my_partition.execute(*<span class="keyword">this</span>, my_range);
-<a name="l00109"></a>00109 <span class="keywordflow">return</span> NULL;
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111 } <span class="comment">// namespace internal</span>
-<a name="l00113"></a>00113 <span class="comment"></span>} <span class="comment">// namespace interfaceX</span>
-<a name="l00114"></a>00114
-<a name="l00116"></a>00116 <span class="keyword">namespace </span>internal {
-<a name="l00117"></a>00117 <span class="keyword">using</span> interface6::internal::start_for;
-<a name="l00118"></a>00118
-<a name="l00120"></a>00120 <span class="keyword">template</span><<span class="keyword">typename</span> Function, <span class="keyword">typename</span> Index>
-<a name="l00121"></a>00121 <span class="keyword">class </span>parallel_for_body : internal::no_assign {
-<a name="l00122"></a>00122 <span class="keyword">const</span> Function &my_func;
-<a name="l00123"></a>00123 <span class="keyword">const</span> Index my_begin;
-<a name="l00124"></a>00124 <span class="keyword">const</span> Index my_step;
-<a name="l00125"></a>00125 <span class="keyword">public</span>:
-<a name="l00126"></a>00126 parallel_for_body( <span class="keyword">const</span> Function& _func, Index& _begin, Index& _step)
-<a name="l00127"></a>00127 : my_func(_func), my_begin(_begin), my_step(_step) {}
-<a name="l00128"></a>00128
-<a name="l00129"></a>00129 <span class="keywordtype">void</span> operator()( <a class="code" href="a00259.html">tbb::blocked_range<Index></a>& r )<span class="keyword"> const </span>{
-<a name="l00130"></a>00130 <span class="keywordflow">for</span>( Index i = r.<a class="code" href="a00259.html#18d2258400756ac1446dac7676b18df3">begin</a>(), k = my_begin + i * my_step; i < r.<a class="code" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>(); i++, k = k + my_step)
-<a name="l00131"></a>00131 my_func( k );
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133 };
-<a name="l00134"></a>00134 } <span class="comment">// namespace internal</span>
-<a name="l00136"></a>00136 <span class="comment"></span>
-<a name="l00137"></a>00137 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00138"></a>00138
-<a name="l00149"></a>00149
-<a name="l00151"></a>00151
-<a name="l00152"></a>00152 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00153"></a><a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">00153</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body ) {
-<a name="l00154"></a>00154 internal::start_for<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00160"></a><a class="code" href="a00426.html#g13cac5dd55c7533bccea43a51c33d0e5">00160</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>& partitioner ) {
-<a name="l00161"></a>00161 internal::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);
-<a name="l00162"></a>00162 }
-<a name="l00163"></a>00163
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00167"></a><a class="code" href="a00426.html#ga7ac75d532389b55b9247f3fdb0b00d1">00167</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00257.html">auto_partitioner</a>& partitioner ) {
-<a name="l00168"></a>00168 internal::start_for<Range,Body,auto_partitioner>::run(range,body,partitioner);
-<a name="l00169"></a>00169 }
-<a name="l00170"></a>00170
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00174"></a><a class="code" href="a00426.html#g9cd1b210ceb1c040f30e390b4a21bde8">00174</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00249.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00175"></a>00175 internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177
-<a name="l00178"></a>00178 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00180"></a>00180 <span class="preprocessor"></span>
-<a name="l00181"></a>00181 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00182"></a><a class="code" href="a00426.html#g2d317a5e0078cd193125439fed60dfdc">00182</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>& partitioner, <a class="code" hr [...]
-<a name="l00183"></a>00183 internal::start_for<Range,Body,simple_partitioner>::run(range, body, partitioner, context);
-<a name="l00184"></a>00184 }
-<a name="l00185"></a>00185
-<a name="l00187"></a>00187
-<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00189"></a><a class="code" href="a00426.html#g1c0700e3f85e83a788ff3ede88ebb7e9">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00257.html">auto_partitioner</a>& partitioner, <a class="code" href="a00339.html">task_group_context< [...]
-<a name="l00190"></a>00190 internal::start_for<Range,Body,auto_partitioner>::run(range, body, partitioner, context);
-<a name="l00191"></a>00191 }
-<a name="l00192"></a>00192
-<a name="l00194"></a>00194
-<a name="l00195"></a>00195 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00196"></a><a class="code" href="a00426.html#g04b4696b67370c01353ff5974c8f1196">00196</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00249.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00339.html">task_group_context</a>& context ) {
-<a name="l00197"></a>00197 internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner, context);
-<a name="l00198"></a>00198 }
-<a name="l00199"></a>00199 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00203"></a>00203
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00207"></a>00207 <span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f) {
-<a name="l00208"></a>00208 <span class="keywordflow">if</span> (step <= 0 )
-<a name="l00209"></a>00209 internal::throw_exception(internal::eid_nonpositive_step); <span class="comment">// throws std::invalid_argument</span>
-<a name="l00210"></a>00210 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (last > first) {
-<a name="l00211"></a>00211 <span class="comment">// Above "else" avoids "potential divide by zero" warning on some platforms</span>
-<a name="l00212"></a>00212 Index end = (last - first - Index(1)) / step + Index(1);
-<a name="l00213"></a>00213 <a class="code" href="a00259.html">tbb::blocked_range<Index></a> range(static_cast<Index>(0), end);
-<a name="l00214"></a>00214 internal::parallel_for_body<Function, Index> body(f, first, step);
-<a name="l00215"></a>00215 <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00257.html">tbb::auto_partitioner</a>());
-<a name="l00216"></a>00216 }
-<a name="l00217"></a>00217 }
-<a name="l00219"></a>00219 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00220"></a>00220 <span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f) {
-<a name="l00221"></a>00221 <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f);
-<a name="l00222"></a>00222 }
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00226"></a>00226 <span class="preprocessor">template <typename Index, typename Function></span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f, <a class="code" href="a00339.html">tbb::task_group_context</a> &context) {
-<a name="l00228"></a>00228 <span class="keywordflow">if</span> (step <= 0 )
-<a name="l00229"></a>00229 internal::throw_exception(internal::eid_nonpositive_step); <span class="comment">// throws std::invalid_argument</span>
-<a name="l00230"></a>00230 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (last > first) {
-<a name="l00231"></a>00231 <span class="comment">// Above "else" avoids "potential divide by zero" warning on some platforms</span>
-<a name="l00232"></a>00232 Index end = (last - first - Index(1)) / step + Index(1);
-<a name="l00233"></a>00233 <a class="code" href="a00259.html">tbb::blocked_range<Index></a> range(static_cast<Index>(0), end);
-<a name="l00234"></a>00234 internal::parallel_for_body<Function, Index> body(f, first, step);
-<a name="l00235"></a>00235 <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00257.html">tbb::auto_partitioner</a>(), context);
-<a name="l00236"></a>00236 }
-<a name="l00237"></a>00237 }
-<a name="l00239"></a>00239 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00240"></a>00240 <span class="keywordtype">void</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f, <a class="code" href="a00339.html">tbb::task_group_context</a> &context) {
-<a name="l00241"></a>00241 <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
-<a name="l00242"></a>00242 }
-<a name="l00243"></a>00243 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00244"></a>00244
-<a name="l00245"></a>00245
-<a name="l00246"></a>00246 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00247"></a>00247
-<a name="l00248"></a>00248 <span class="keyword">using</span> <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">strict_ppl::parallel_for</a>;
-<a name="l00249"></a>00249
-<a name="l00250"></a>00250 } <span class="comment">// namespace tbb</span>
-<a name="l00251"></a>00251
-<a name="l00252"></a>00252 <span class="preprocessor">#if TBB_PREVIEW_SERIAL_SUBSET</span>
-<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NORMAL_EXECUTION</span>
-<a name="l00254"></a>00254 <span class="preprocessor"></span><span class="preprocessor">#include "../serial/tbb/parallel_for.h"</span>
-<a name="l00255"></a>00255 <span class="preprocessor">#undef __TBB_NORMAL_EXECUTION</span>
-<a name="l00256"></a>00256 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00257"></a>00257 <span class="preprocessor"></span>
-<a name="l00258"></a>00258 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_for_H */</span>
-<a name="l00259"></a>00259
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00548.html b/doc/html/a00548.html
deleted file mode 100644
index d89d71a..0000000
--- a/doc/html/a00548.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_for_each.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_for_each.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_for_each_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_for_each_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "parallel_do.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>internal {
-<a name="l00030"></a>00030 <span class="comment">// The class calls user function in operator()</span>
-<a name="l00031"></a>00031 <span class="keyword">template</span> <<span class="keyword">typename</span> Function, <span class="keyword">typename</span> Iterator>
-<a name="l00032"></a>00032 <span class="keyword">class </span>parallel_for_each_body : internal::no_assign {
-<a name="l00033"></a>00033 <span class="keyword">const</span> Function &my_func;
-<a name="l00034"></a>00034 <span class="keyword">public</span>:
-<a name="l00035"></a>00035 parallel_for_each_body(<span class="keyword">const</span> Function &_func) : my_func(_func) {}
-<a name="l00036"></a>00036 parallel_for_each_body(<span class="keyword">const</span> parallel_for_each_body<Function, Iterator> &_caller) : my_func(_caller.my_func) {}
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="keywordtype">void</span> operator() ( <span class="keyword">typename</span> std::iterator_traits<Iterator>::reference value )<span class="keyword"> const </span>{
-<a name="l00039"></a>00039 my_func(value);
-<a name="l00040"></a>00040 }
-<a name="l00041"></a>00041 };
-<a name="l00042"></a>00042 } <span class="comment">// namespace internal</span>
-<a name="l00044"></a>00044 <span class="comment"></span>
-<a name="l00048"></a>00048
-<a name="l00049"></a>00049
-<a name="l00050"></a>00050 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
-<a name="l00052"></a><a class="code" href="a00426.html#gcd40c32f319747e61a8f73fcfc452001">00052</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f, <a class="code" href="a00339.html">task_group_context</a> &context) {
-<a name="l00053"></a>00053 internal::parallel_for_each_body<Function, InputIterator> body(f);
-<a name="l00054"></a>00054 <a class="code" href="a00426.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body, context);
-<a name="l00055"></a>00055 }
-<a name="l00056"></a>00056 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00057"></a>00057
-<a name="l00059"></a>00059 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
-<a name="l00060"></a><a class="code" href="a00426.html#gc2d710ca573f0a9bd94379cba3772def">00060</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f) {
-<a name="l00061"></a>00061 internal::parallel_for_each_body<Function, InputIterator> body(f);
-<a name="l00062"></a>00062 <a class="code" href="a00426.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body);
-<a name="l00063"></a>00063 }
-<a name="l00064"></a>00064
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 } <span class="comment">// namespace</span>
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_for_each_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00550.html b/doc/html/a00550.html
deleted file mode 100644
index e4c96d7..0000000
--- a/doc/html/a00550.html
+++ /dev/null
@@ -1,386 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_invoke.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_invoke.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_invoke_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_invoke_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="preprocessor">#if !__TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span>
-<a name="l00030"></a><a class="code" href="a00339.html">00030</a> <span class="keyword">struct </span><a class="code" href="a00339.html">task_group_context</a> {};
-<a name="l00031"></a>00031 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034 <span class="keyword">namespace </span>internal {
-<a name="l00035"></a>00035 <span class="comment">// Simple task object, executing user method</span>
-<a name="l00036"></a>00036 <span class="keyword">template</span><<span class="keyword">typename</span> function>
-<a name="l00037"></a>00037 <span class="keyword">class </span>function_invoker : <span class="keyword">public</span> <a class="code" href="a00337.html">task</a>{
-<a name="l00038"></a>00038 <span class="keyword">public</span>:
-<a name="l00039"></a>00039 function_invoker(<span class="keyword">const</span> function& _function) : my_function(_function) {}
-<a name="l00040"></a>00040 <span class="keyword">private</span>:
-<a name="l00041"></a>00041 <span class="keyword">const</span> function &my_function;
-<a name="l00042"></a>00042 <span class="comment">/*override*/</span>
-<a name="l00043"></a>00043 task* execute()
-<a name="l00044"></a>00044 {
-<a name="l00045"></a>00045 my_function();
-<a name="l00046"></a>00046 <span class="keywordflow">return</span> NULL;
-<a name="l00047"></a>00047 }
-<a name="l00048"></a>00048 };
-<a name="l00049"></a>00049
-<a name="l00050"></a>00050 <span class="comment">// The class spawns two or three child tasks</span>
-<a name="l00051"></a>00051 <span class="keyword">template</span> <size_t N, <span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2, <span class="keyword">typename</span> function3>
-<a name="l00052"></a>00052 <span class="keyword">class </span>spawner : <span class="keyword">public</span> task {
-<a name="l00053"></a>00053 <span class="keyword">private</span>:
-<a name="l00054"></a>00054 <span class="keyword">const</span> function1& my_func1;
-<a name="l00055"></a>00055 <span class="keyword">const</span> function2& my_func2;
-<a name="l00056"></a>00056 <span class="keyword">const</span> function3& my_func3;
-<a name="l00057"></a>00057 <span class="keywordtype">bool</span> is_recycled;
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 task* execute (){
-<a name="l00060"></a>00060 <span class="keywordflow">if</span>(is_recycled){
-<a name="l00061"></a>00061 <span class="keywordflow">return</span> NULL;
-<a name="l00062"></a>00062 }<span class="keywordflow">else</span>{
-<a name="l00063"></a>00063 __TBB_ASSERT(N==2 || N==3, <span class="stringliteral">"Number of arguments passed to spawner is wrong"</span>);
-<a name="l00064"></a>00064 set_ref_count(N);
-<a name="l00065"></a>00065 recycle_as_safe_continuation();
-<a name="l00066"></a>00066 internal::function_invoker<function2>* invoker2 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function2>(my_func2);
-<a name="l00067"></a>00067 __TBB_ASSERT(invoker2, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00068"></a>00068 spawn(*invoker2);
-<a name="l00069"></a>00069 size_t n = N; <span class="comment">// To prevent compiler warnings</span>
-<a name="l00070"></a>00070 <span class="keywordflow">if</span> (n>2) {
-<a name="l00071"></a>00071 internal::function_invoker<function3>* invoker3 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function3>(my_func3);
-<a name="l00072"></a>00072 __TBB_ASSERT(invoker3, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00073"></a>00073 spawn(*invoker3);
-<a name="l00074"></a>00074 }
-<a name="l00075"></a>00075 my_func1();
-<a name="l00076"></a>00076 is_recycled = <span class="keyword">true</span>;
-<a name="l00077"></a>00077 <span class="keywordflow">return</span> NULL;
-<a name="l00078"></a>00078 }
-<a name="l00079"></a>00079 } <span class="comment">// execute</span>
-<a name="l00080"></a>00080
-<a name="l00081"></a>00081 <span class="keyword">public</span>:
-<a name="l00082"></a>00082 spawner(<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2, <span class="keyword">const</span> function3& _func3) : my_func1(_func1), my_func2(_func2), my_func3(_func3), is_recycled(false) {}
-<a name="l00083"></a>00083 };
-<a name="l00084"></a>00084
-<a name="l00085"></a>00085 <span class="comment">// Creates and spawns child tasks</span>
-<a name="l00086"></a>00086 <span class="keyword">class </span>parallel_invoke_helper : <span class="keyword">public</span> empty_task {
-<a name="l00087"></a>00087 <span class="keyword">public</span>:
-<a name="l00088"></a>00088 <span class="comment">// Dummy functor class</span>
-<a name="l00089"></a>00089 <span class="keyword">class </span>parallel_invoke_noop {
-<a name="l00090"></a>00090 <span class="keyword">public</span>:
-<a name="l00091"></a>00091 <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{}
-<a name="l00092"></a>00092 };
-<a name="l00093"></a>00093 <span class="comment">// Creates a helper object with user-defined number of children expected</span>
-<a name="l00094"></a>00094 parallel_invoke_helper(<span class="keywordtype">int</span> number_of_children)
-<a name="l00095"></a>00095 {
-<a name="l00096"></a>00096 set_ref_count(number_of_children + 1);
-<a name="l00097"></a>00097 }
-<a name="l00098"></a>00098 <span class="comment">// Adds child task and spawns it</span>
-<a name="l00099"></a>00099 <span class="keyword">template</span> <<span class="keyword">typename</span> function>
-<a name="l00100"></a>00100 <span class="keywordtype">void</span> add_child (<span class="keyword">const</span> function &_func)
-<a name="l00101"></a>00101 {
-<a name="l00102"></a>00102 internal::function_invoker<function>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function>(_func);
-<a name="l00103"></a>00103 __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00104"></a>00104 spawn(*invoker);
-<a name="l00105"></a>00105 }
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="comment">// Adds a task with multiple child tasks and spawns it</span>
-<a name="l00108"></a>00108 <span class="comment">// two arguments</span>
-<a name="l00109"></a>00109 <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2>
-<a name="l00110"></a>00110 <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2)
-<a name="l00111"></a>00111 {
-<a name="l00112"></a>00112 <span class="comment">// The third argument is dummy, it is ignored actually.</span>
-<a name="l00113"></a>00113 parallel_invoke_noop noop;
-<a name="l00114"></a>00114 internal::spawner<2, function1, function2, parallel_invoke_noop>& sub_root = *<span class="keyword">new</span>(allocate_child())internal::spawner<2, function1, function2, parallel_invoke_noop>(_func1, _func2, noop);
-<a name="l00115"></a>00115 spawn(sub_root);
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117 <span class="comment">// three arguments</span>
-<a name="l00118"></a>00118 <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2, <span class="keyword">typename</span> function3>
-<a name="l00119"></a>00119 <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2, <span class="keyword">const</span> function3& _func3)
-<a name="l00120"></a>00120 {
-<a name="l00121"></a>00121 internal::spawner<3, function1, function2, function3>& sub_root = *<span class="keyword">new</span>(allocate_child())internal::spawner<3, function1, function2, function3>(_func1, _func2, _func3);
-<a name="l00122"></a>00122 spawn(sub_root);
-<a name="l00123"></a>00123 }
-<a name="l00124"></a>00124
-<a name="l00125"></a>00125 <span class="comment">// Waits for all child tasks</span>
-<a name="l00126"></a>00126 <span class="keyword">template</span> <<span class="keyword">typename</span> F0>
-<a name="l00127"></a>00127 <span class="keywordtype">void</span> run_and_finish(<span class="keyword">const</span> F0& f0)
-<a name="l00128"></a>00128 {
-<a name="l00129"></a>00129 internal::function_invoker<F0>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<F0>(f0);
-<a name="l00130"></a>00130 __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00131"></a>00131 spawn_and_wait_for_all(*invoker);
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133 };
-<a name="l00134"></a>00134 <span class="comment">// The class destroys root if exception occurred as well as in normal case</span>
-<a name="l00135"></a>00135 <span class="keyword">class </span>parallel_invoke_cleaner: internal::no_copy {
-<a name="l00136"></a>00136 <span class="keyword">public</span>:
-<a name="l00137"></a>00137 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span> parallel_invoke_cleaner(<span class="keywordtype">int</span> number_of_children, <a class="code" href="a00339.html">tbb::task_group_context</a>& context)
-<a name="l00139"></a>00139 : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
-<a name="l00140"></a>00140 #else
-<a name="l00141"></a>00141 parallel_invoke_cleaner(int number_of_children, tbb::task_group_context&)
-<a name="l00142"></a>00142 : root(*new(task::allocate_root()) internal::parallel_invoke_helper(number_of_children))
-<a name="l00143"></a>00143 #endif <span class="comment">/* !__TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00144"></a>00144 {}
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 ~parallel_invoke_cleaner(){
-<a name="l00147"></a>00147 root.destroy(root);
-<a name="l00148"></a>00148 }
-<a name="l00149"></a>00149 internal::parallel_invoke_helper& root;
-<a name="l00150"></a>00150 };
-<a name="l00151"></a>00151 } <span class="comment">// namespace internal</span>
-<a name="l00153"></a>00153 <span class="comment"></span>
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158
-<a name="l00160"></a>00160 <span class="comment">// parallel_invoke with user-defined context</span>
-<a name="l00161"></a>00161 <span class="comment">// two arguments</span>
-<a name="l00162"></a>00162 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1 >
-<a name="l00163"></a><a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00339.html">tbb::task_group_context</a>& context) {
-<a name="l00164"></a>00164 internal::parallel_invoke_cleaner cleaner(2, context);
-<a name="l00165"></a>00165 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00166"></a>00166
-<a name="l00167"></a>00167 root.add_child(f1);
-<a name="l00168"></a>00168
-<a name="l00169"></a>00169 root.run_and_finish(f0);
-<a name="l00170"></a>00170 }
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="comment">// three arguments</span>
-<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2 >
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <a class="code" href="a00339.html">tbb::task_group_context</a>& context) {
-<a name="l00175"></a>00175 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00176"></a>00176 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00177"></a>00177
-<a name="l00178"></a>00178 root.add_child(f2);
-<a name="l00179"></a>00179 root.add_child(f1);
-<a name="l00180"></a>00180
-<a name="l00181"></a>00181 root.run_and_finish(f0);
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="comment">// four arguments</span>
-<a name="l00185"></a>00185 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3>
-<a name="l00186"></a>00186 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3,
-<a name="l00187"></a>00187 <a class="code" href="a00339.html">tbb::task_group_context</a>& context)
-<a name="l00188"></a>00188 {
-<a name="l00189"></a>00189 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00190"></a>00190 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 root.add_child(f3);
-<a name="l00193"></a>00193 root.add_child(f2);
-<a name="l00194"></a>00194 root.add_child(f1);
-<a name="l00195"></a>00195
-<a name="l00196"></a>00196 root.run_and_finish(f0);
-<a name="l00197"></a>00197 }
-<a name="l00198"></a>00198
-<a name="l00199"></a>00199 <span class="comment">// five arguments</span>
-<a name="l00200"></a>00200 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4 >
-<a name="l00201"></a>00201 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00202"></a>00202 <a class="code" href="a00339.html">tbb::task_group_context</a>& context)
-<a name="l00203"></a>00203 {
-<a name="l00204"></a>00204 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00205"></a>00205 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00206"></a>00206
-<a name="l00207"></a>00207 root.add_children(f4, f3);
-<a name="l00208"></a>00208 root.add_children(f2, f1);
-<a name="l00209"></a>00209
-<a name="l00210"></a>00210 root.run_and_finish(f0);
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212
-<a name="l00213"></a>00213 <span class="comment">// six arguments</span>
-<a name="l00214"></a>00214 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00215"></a>00215 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5,
-<a name="l00216"></a>00216 <a class="code" href="a00339.html">tbb::task_group_context</a>& context)
-<a name="l00217"></a>00217 {
-<a name="l00218"></a>00218 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00219"></a>00219 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00220"></a>00220
-<a name="l00221"></a>00221 root.add_children(f5, f4, f3);
-<a name="l00222"></a>00222 root.add_children(f2, f1);
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 root.run_and_finish(f0);
-<a name="l00225"></a>00225 }
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 <span class="comment">// seven arguments</span>
-<a name="l00228"></a>00228 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00229"></a>00229 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00230"></a>00230 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6,
-<a name="l00231"></a>00231 <a class="code" href="a00339.html">tbb::task_group_context</a>& context)
-<a name="l00232"></a>00232 {
-<a name="l00233"></a>00233 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00234"></a>00234 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00235"></a>00235
-<a name="l00236"></a>00236 root.add_children(f6, f5, f4);
-<a name="l00237"></a>00237 root.add_children(f3, f2, f1);
-<a name="l00238"></a>00238
-<a name="l00239"></a>00239 root.run_and_finish(f0);
-<a name="l00240"></a>00240 }
-<a name="l00241"></a>00241
-<a name="l00242"></a>00242 <span class="comment">// eight arguments</span>
-<a name="l00243"></a>00243 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00244"></a>00244 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00245"></a>00245 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00246"></a>00246 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7,
-<a name="l00247"></a>00247 <a class="code" href="a00339.html">tbb::task_group_context</a>& context)
-<a name="l00248"></a>00248 {
-<a name="l00249"></a>00249 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00250"></a>00250 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00251"></a>00251
-<a name="l00252"></a>00252 root.add_children(f7, f6, f5);
-<a name="l00253"></a>00253 root.add_children(f4, f3);
-<a name="l00254"></a>00254 root.add_children(f2, f1);
-<a name="l00255"></a>00255
-<a name="l00256"></a>00256 root.run_and_finish(f0);
-<a name="l00257"></a>00257 }
-<a name="l00258"></a>00258
-<a name="l00259"></a>00259 <span class="comment">// nine arguments</span>
-<a name="l00260"></a>00260 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00261"></a>00261 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
-<a name="l00262"></a>00262 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00263"></a>00263 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8,
-<a name="l00264"></a>00264 <a class="code" href="a00339.html">tbb::task_group_context</a>& context)
-<a name="l00265"></a>00265 {
-<a name="l00266"></a>00266 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00267"></a>00267 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00268"></a>00268
-<a name="l00269"></a>00269 root.add_children(f8, f7, f6);
-<a name="l00270"></a>00270 root.add_children(f5, f4, f3);
-<a name="l00271"></a>00271 root.add_children(f2, f1);
-<a name="l00272"></a>00272
-<a name="l00273"></a>00273 root.run_and_finish(f0);
-<a name="l00274"></a>00274 }
-<a name="l00275"></a>00275
-<a name="l00276"></a>00276 <span class="comment">// ten arguments</span>
-<a name="l00277"></a>00277 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00278"></a>00278 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
-<a name="l00279"></a>00279 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00280"></a>00280 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9,
-<a name="l00281"></a>00281 <a class="code" href="a00339.html">tbb::task_group_context</a>& context)
-<a name="l00282"></a>00282 {
-<a name="l00283"></a>00283 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00284"></a>00284 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00285"></a>00285
-<a name="l00286"></a>00286 root.add_children(f9, f8, f7);
-<a name="l00287"></a>00287 root.add_children(f6, f5, f4);
-<a name="l00288"></a>00288 root.add_children(f3, f2, f1);
-<a name="l00289"></a>00289
-<a name="l00290"></a>00290 root.run_and_finish(f0);
-<a name="l00291"></a>00291 }
-<a name="l00292"></a>00292
-<a name="l00293"></a>00293 <span class="comment">// two arguments</span>
-<a name="l00294"></a>00294 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1>
-<a name="l00295"></a>00295 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1) {
-<a name="l00296"></a>00296 task_group_context context;
-<a name="l00297"></a>00297 parallel_invoke<F0, F1>(f0, f1, context);
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299 <span class="comment">// three arguments</span>
-<a name="l00300"></a>00300 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2>
-<a name="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2) {
-<a name="l00302"></a>00302 task_group_context context;
-<a name="l00303"></a>00303 parallel_invoke<F0, F1, F2>(f0, f1, f2, context);
-<a name="l00304"></a>00304 }
-<a name="l00305"></a>00305 <span class="comment">// four arguments</span>
-<a name="l00306"></a>00306 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3 >
-<a name="l00307"></a>00307 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3) {
-<a name="l00308"></a>00308 task_group_context context;
-<a name="l00309"></a>00309 parallel_invoke<F0, F1, F2, F3>(f0, f1, f2, f3, context);
-<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311 <span class="comment">// five arguments</span>
-<a name="l00312"></a>00312 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4>
-<a name="l00313"></a>00313 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4) {
-<a name="l00314"></a>00314 task_group_context context;
-<a name="l00315"></a>00315 parallel_invoke<F0, F1, F2, F3, F4>(f0, f1, f2, f3, f4, context);
-<a name="l00316"></a>00316 }
-<a name="l00317"></a>00317 <span class="comment">// six arguments</span>
-<a name="l00318"></a>00318 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00319"></a>00319 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5) {
-<a name="l00320"></a>00320 task_group_context context;
-<a name="l00321"></a>00321 parallel_invoke<F0, F1, F2, F3, F4, F5>(f0, f1, f2, f3, f4, f5, context);
-<a name="l00322"></a>00322 }
-<a name="l00323"></a>00323 <span class="comment">// seven arguments</span>
-<a name="l00324"></a>00324 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00325"></a>00325 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00326"></a>00326 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6)
-<a name="l00327"></a>00327 {
-<a name="l00328"></a>00328 task_group_context context;
-<a name="l00329"></a>00329 parallel_invoke<F0, F1, F2, F3, F4, F5, F6>(f0, f1, f2, f3, f4, f5, f6, context);
-<a name="l00330"></a>00330 }
-<a name="l00331"></a>00331 <span class="comment">// eigth arguments</span>
-<a name="l00332"></a>00332 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00333"></a>00333 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00334"></a>00334 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00335"></a>00335 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7)
-<a name="l00336"></a>00336 {
-<a name="l00337"></a>00337 task_group_context context;
-<a name="l00338"></a>00338 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7>(f0, f1, f2, f3, f4, f5, f6, f7, context);
-<a name="l00339"></a>00339 }
-<a name="l00340"></a>00340 <span class="comment">// nine arguments</span>
-<a name="l00341"></a>00341 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00342"></a>00342 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
-<a name="l00343"></a>00343 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00344"></a>00344 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8)
-<a name="l00345"></a>00345 {
-<a name="l00346"></a>00346 task_group_context context;
-<a name="l00347"></a>00347 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8>(f0, f1, f2, f3, f4, f5, f6, f7, f8, context);
-<a name="l00348"></a>00348 }
-<a name="l00349"></a>00349 <span class="comment">// ten arguments</span>
-<a name="l00350"></a>00350 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00351"></a>00351 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
-<a name="l00352"></a>00352 <span class="keywordtype">void</span> <a class="code" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00353"></a>00353 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9)
-<a name="l00354"></a>00354 {
-<a name="l00355"></a>00355 task_group_context context;
-<a name="l00356"></a>00356 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8, F9>(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, context);
-<a name="l00357"></a>00357 }
-<a name="l00358"></a>00358
-<a name="l00360"></a>00360
-<a name="l00361"></a>00361 } <span class="comment">// namespace</span>
-<a name="l00362"></a>00362
-<a name="l00363"></a>00363 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_invoke_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00556.html b/doc/html/a00556.html
deleted file mode 100644
index 0aa7595..0000000
--- a/doc/html/a00556.html
+++ /dev/null
@@ -1,476 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_reduce.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_reduce.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_reduce_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_reduce_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <new></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "task.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="keyword">namespace </span>interface6 {
-<a name="l00034"></a>00034 <span class="keyword">namespace </span>internal {
-<a name="l00035"></a>00035
-<a name="l00036"></a>00036 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00037"></a>00037
-<a name="l00039"></a>00039 <span class="keyword">enum</span> {
-<a name="l00040"></a>00040 root_task, left_child, right_child
-<a name="l00041"></a>00041 };
-<a name="l00042"></a>00042
-<a name="l00044"></a>00044 <span class="keyword">typedef</span> <span class="keywordtype">char</span> reduction_context;
-<a name="l00045"></a>00045
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00049"></a>00049 <span class="keyword">class </span>finish_reduce: <span class="keyword">public</span> flag_task {
-<a name="l00051"></a>00051 <span class="keywordtype">bool</span> has_right_zombie;
-<a name="l00052"></a>00052 <span class="keyword">const</span> reduction_context my_context;
-<a name="l00053"></a>00053 Body* my_body;
-<a name="l00054"></a>00054 aligned_space<Body,1> zombie_space;
-<a name="l00055"></a>00055 finish_reduce( reduction_context context_ ) :
-<a name="l00056"></a>00056 has_right_zombie(false), <span class="comment">// TODO: substitute by flag_task::child_stolen?</span>
-<a name="l00057"></a>00057 my_context(context_),
-<a name="l00058"></a>00058 my_body(NULL)
-<a name="l00059"></a>00059 {
-<a name="l00060"></a>00060 }
-<a name="l00061"></a>00061 task* execute() {
-<a name="l00062"></a>00062 <span class="keywordflow">if</span>( has_right_zombie ) {
-<a name="l00063"></a>00063 <span class="comment">// Right child was stolen.</span>
-<a name="l00064"></a>00064 Body* s = zombie_space.begin();
-<a name="l00065"></a>00065 my_body->join( *s );
-<a name="l00066"></a>00066 s->~Body();
-<a name="l00067"></a>00067 }
-<a name="l00068"></a>00068 <span class="keywordflow">if</span>( my_context==left_child )
-<a name="l00069"></a>00069 itt_store_word_with_release( static_cast<finish_reduce*>(parent())->my_body, my_body );
-<a name="l00070"></a>00070 <span class="keywordflow">return</span> NULL;
-<a name="l00071"></a>00071 }
-<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> Range,<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Partitioner>
-<a name="l00073"></a>00073 <span class="keyword">friend</span> <span class="keyword">class </span>start_reduce;
-<a name="l00074"></a>00074 };
-<a name="l00075"></a>00075
-<a name="l00077"></a>00077
-<a name="l00078"></a>00078 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00079"></a>00079 <span class="keyword">class </span>start_reduce: <span class="keyword">public</span> task {
-<a name="l00080"></a>00080 <span class="keyword">typedef</span> finish_reduce<Body> finish_type;
-<a name="l00081"></a>00081 Body* my_body;
-<a name="l00082"></a>00082 Range my_range;
-<a name="l00083"></a>00083 <span class="keyword">typename</span> Partitioner::task_partition_type my_partition;
-<a name="l00084"></a>00084 reduction_context my_context; <span class="comment">// TODO: factor out into start_reduce_base</span>
-<a name="l00085"></a>00085 <span class="comment">/*override*/</span> task* execute();
-<a name="l00086"></a>00086 <span class="keyword">template</span><<span class="keyword">typename</span> Body_>
-<a name="l00087"></a>00087 <span class="keyword">friend</span> <span class="keyword">class </span>finish_reduce;
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="keyword">public</span>:
-<a name="l00091"></a>00091 start_reduce( <span class="keyword">const</span> Range& range, Body* body, Partitioner& partitioner ) :
-<a name="l00092"></a>00092 my_body(body),
-<a name="l00093"></a>00093 my_range(range),
-<a name="l00094"></a>00094 my_partition(partitioner),
-<a name="l00095"></a>00095 my_context(root_task)
-<a name="l00096"></a>00096 {
-<a name="l00097"></a>00097 }
-<a name="l00099"></a>00099
-<a name="l00100"></a>00100 start_reduce( start_reduce& parent_, split ) :
-<a name="l00101"></a>00101 my_body(parent_.my_body),
-<a name="l00102"></a>00102 my_range(parent_.my_range,split()),
-<a name="l00103"></a>00103 my_partition(parent_.my_partition,split()),
-<a name="l00104"></a>00104 my_context(right_child)
-<a name="l00105"></a>00105 {
-<a name="l00106"></a>00106 my_partition.set_affinity(*<span class="keyword">this</span>);
-<a name="l00107"></a>00107 parent_.my_context = left_child;
-<a name="l00108"></a>00108 }
-<a name="l00110"></a>00110
-<a name="l00111"></a>00111 start_reduce( start_reduce& parent_, <span class="keyword">const</span> Range& r, depth_t d ) :
-<a name="l00112"></a>00112 my_body(parent_.my_body),
-<a name="l00113"></a>00113 my_range(r),
-<a name="l00114"></a>00114 my_partition(parent_.my_partition,split()),
-<a name="l00115"></a>00115 my_context(right_child)
-<a name="l00116"></a>00116 {
-<a name="l00117"></a>00117 my_partition.set_affinity(*<span class="keyword">this</span>);
-<a name="l00118"></a>00118 my_partition.align_depth( d );
-<a name="l00119"></a>00119 parent_.my_context = left_child;
-<a name="l00120"></a>00120 }
-<a name="l00122"></a>00122 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
-<a name="l00123"></a>00123 my_partition.note_affinity( <span class="keywordtype">id</span> );
-<a name="l00124"></a>00124 }
-<a name="l00125"></a>00125 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner ) {
-<a name="l00126"></a>00126 <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00127"></a>00127 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
-<a name="l00128"></a>00128 <a class="code" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(<a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_reduce(range,&body,partitioner) );
-<a name="l00129"></a>00129 <span class="preprocessor">#else</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span> <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
-<a name="l00131"></a>00131 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
-<a name="l00132"></a>00132 task_group_context context;
-<a name="l00133"></a>00133 <a class="code" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
-<a name="l00134"></a>00134 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
-<a name="l00135"></a>00135 }
-<a name="l00136"></a>00136 }
-<a name="l00137"></a>00137 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner, task_group_context& context ) {
-<a name="l00139"></a>00139 <span class="keywordflow">if</span>( !range.empty() )
-<a name="l00140"></a>00140 <a class="code" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
-<a name="l00141"></a>00141 }
-<a name="l00142"></a>00142 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00144"></a>00144 finish_type *create_continuation() {
-<a name="l00145"></a>00145 <span class="keywordflow">return</span> <span class="keyword">new</span>( allocate_continuation() ) finish_type(my_context);
-<a name="l00146"></a>00146 }
-<a name="l00148"></a>00148 <span class="keywordtype">void</span> run_body( Range &r ) { (*my_body)( r ); }
-<a name="l00149"></a>00149 };
-<a name="l00150"></a>00150 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00151"></a>00151 task* start_reduce<Range,Body,Partitioner>::execute() {
-<a name="l00152"></a>00152 my_partition.check_being_stolen( *<span class="keyword">this</span> );
-<a name="l00153"></a>00153 <span class="keywordflow">if</span>( my_context==right_child ) {
-<a name="l00154"></a>00154 finish_type* parent_ptr = static_cast<finish_type*>(parent());
-<a name="l00155"></a>00155 <span class="keywordflow">if</span>( !itt_load_word_with_acquire(parent_ptr->my_body) ) { <span class="comment">// TODO: replace by is_stolen_task() or by parent_ptr->ref_count() == 2???</span>
-<a name="l00156"></a>00156 my_body = <span class="keyword">new</span>( parent_ptr->zombie_space.begin() ) Body(*my_body,split());
-<a name="l00157"></a>00157 parent_ptr->has_right_zombie = <span class="keyword">true</span>;
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159 } <span class="keywordflow">else</span> __TBB_ASSERT(my_context==root_task,NULL);<span class="comment">// because left leaf spawns right leafs without recycling</span>
-<a name="l00160"></a>00160 my_partition.execute(*<span class="keyword">this</span>, my_range);
-<a name="l00161"></a>00161 <span class="keywordflow">if</span>( my_context==left_child ) {
-<a name="l00162"></a>00162 finish_type* parent_ptr = static_cast<finish_type*>(parent());
-<a name="l00163"></a>00163 __TBB_ASSERT(my_body!=parent_ptr->zombie_space.begin(),NULL);
-<a name="l00164"></a>00164 itt_store_word_with_release(parent_ptr->my_body, my_body );
-<a name="l00165"></a>00165 }
-<a name="l00166"></a>00166 <span class="keywordflow">return</span> NULL;
-<a name="l00167"></a>00167 }
-<a name="l00168"></a>00168
-<a name="l00169"></a>00169 <span class="preprocessor">#if TBB_PREVIEW_DETERMINISTIC_REDUCE</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span>
-<a name="l00172"></a>00172 <span class="preprocessor"> template<typename Body></span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span> <span class="keyword">class </span>finish_deterministic_reduce: <span class="keyword">public</span> task {
-<a name="l00174"></a>00174 Body &my_left_body;
-<a name="l00175"></a>00175 Body my_right_body;
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 finish_deterministic_reduce( Body &body ) :
-<a name="l00178"></a>00178 my_left_body( body ),
-<a name="l00179"></a>00179 my_right_body( body, split() )
-<a name="l00180"></a>00180 {
-<a name="l00181"></a>00181 }
-<a name="l00182"></a>00182 task* execute() {
-<a name="l00183"></a>00183 my_left_body.join( my_right_body );
-<a name="l00184"></a>00184 <span class="keywordflow">return</span> NULL;
-<a name="l00185"></a>00185 }
-<a name="l00186"></a>00186 <span class="keyword">template</span><<span class="keyword">typename</span> Range,<span class="keyword">typename</span> Body_>
-<a name="l00187"></a>00187 <span class="keyword">friend</span> <span class="keyword">class </span>start_deterministic_reduce;
-<a name="l00188"></a>00188 };
-<a name="l00189"></a>00189
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00193"></a>00193 <span class="keyword">class </span>start_deterministic_reduce: <span class="keyword">public</span> task {
-<a name="l00194"></a>00194 <span class="keyword">typedef</span> finish_deterministic_reduce<Body> finish_type;
-<a name="l00195"></a>00195 Body &my_body;
-<a name="l00196"></a>00196 Range my_range;
-<a name="l00197"></a>00197 <span class="comment">/*override*/</span> task* execute();
-<a name="l00198"></a>00198
-<a name="l00200"></a>00200 start_deterministic_reduce( <span class="keyword">const</span> Range& range, Body& body ) :
-<a name="l00201"></a>00201 my_body( body ),
-<a name="l00202"></a>00202 my_range( range )
-<a name="l00203"></a>00203 {
-<a name="l00204"></a>00204 }
-<a name="l00206"></a>00206
-<a name="l00207"></a>00207 start_deterministic_reduce( start_deterministic_reduce& parent_, finish_type& c ) :
-<a name="l00208"></a>00208 my_body( c.my_right_body ),
-<a name="l00209"></a>00209 my_range( parent_.my_range, split() )
-<a name="l00210"></a>00210 {
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212
-<a name="l00213"></a>00213 <span class="keyword">public</span>:
-<a name="l00214"></a>00214 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body ) {
-<a name="l00215"></a>00215 <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00216"></a>00216 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
-<a name="l00217"></a>00217 task::spawn_root_and_wait( *<span class="keyword">new</span>(task::allocate_root()) start_deterministic_reduce(range,&body) );
-<a name="l00218"></a>00218 <span class="preprocessor">#else</span>
-<a name="l00219"></a>00219 <span class="preprocessor"></span> <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
-<a name="l00220"></a>00220 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
-<a name="l00221"></a>00221 task_group_context context;
-<a name="l00222"></a>00222 task::spawn_root_and_wait( *<span class="keyword">new</span>(task::allocate_root(context)) start_deterministic_reduce(range,body) );
-<a name="l00223"></a>00223 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
-<a name="l00224"></a>00224 }
-<a name="l00225"></a>00225 }
-<a name="l00226"></a>00226 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, task_group_context& context ) {
-<a name="l00228"></a>00228 <span class="keywordflow">if</span>( !range.empty() )
-<a name="l00229"></a>00229 task::spawn_root_and_wait( *<span class="keyword">new</span>(task::allocate_root(context)) start_deterministic_reduce(range,body) );
-<a name="l00230"></a>00230 }
-<a name="l00231"></a>00231 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00232"></a>00232 };
-<a name="l00233"></a>00233
-<a name="l00234"></a>00234 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00235"></a>00235 task* start_deterministic_reduce<Range,Body>::execute() {
-<a name="l00236"></a>00236 <span class="keywordflow">if</span>( !my_range.is_divisible() ) {
-<a name="l00237"></a>00237 my_body( my_range );
-<a name="l00238"></a>00238 <span class="keywordflow">return</span> NULL;
-<a name="l00239"></a>00239 } <span class="keywordflow">else</span> {
-<a name="l00240"></a>00240 finish_type& c = *<span class="keyword">new</span>( allocate_continuation() ) finish_type( my_body );
-<a name="l00241"></a>00241 recycle_as_child_of(c);
-<a name="l00242"></a>00242 c.set_ref_count(2);
-<a name="l00243"></a>00243 start_deterministic_reduce& b = *<span class="keyword">new</span>( c.allocate_child() ) start_deterministic_reduce( *<span class="keyword">this</span>, c );
-<a name="l00244"></a>00244 task::spawn(b);
-<a name="l00245"></a>00245 <span class="keywordflow">return</span> <span class="keyword">this</span>;
-<a name="l00246"></a>00246 }
-<a name="l00247"></a>00247 }
-<a name="l00248"></a>00248 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_DETERMINISTIC_REDUCE */</span>
-<a name="l00249"></a>00249 } <span class="comment">// namespace internal</span>
-<a name="l00251"></a>00251 <span class="comment"></span>} <span class="comment">//namespace interfaceX</span>
-<a name="l00252"></a>00252
-<a name="l00254"></a>00254 <span class="keyword">namespace </span>internal {
-<a name="l00255"></a>00255 <span class="keyword">using</span> interface6::internal::start_reduce;
-<a name="l00256"></a>00256 <span class="preprocessor">#if TBB_PREVIEW_DETERMINISTIC_REDUCE</span>
-<a name="l00257"></a>00257 <span class="preprocessor"></span> <span class="keyword">using</span> interface6::internal::start_deterministic_reduce;
-<a name="l00258"></a>00258 <span class="preprocessor">#endif</span>
-<a name="l00260"></a>00260 <span class="preprocessor"></span>
-<a name="l00264"></a>00264 <span class="preprocessor"> template<typename Range, typename Value, typename RealBody, typename Reduction></span>
-<a name="l00265"></a>00265 <span class="preprocessor"></span> <span class="keyword">class </span>lambda_reduce_body {
-<a name="l00266"></a>00266
-<a name="l00267"></a>00267 <span class="comment">//FIXME: decide if my_real_body, my_reduction, and identity_element should be copied or referenced</span>
-<a name="l00268"></a>00268 <span class="comment">// (might require some performance measurements)</span>
-<a name="l00269"></a>00269
-<a name="l00270"></a>00270 <span class="keyword">const</span> Value& identity_element;
-<a name="l00271"></a>00271 <span class="keyword">const</span> RealBody& my_real_body;
-<a name="l00272"></a>00272 <span class="keyword">const</span> Reduction& my_reduction;
-<a name="l00273"></a>00273 Value my_value;
-<a name="l00274"></a>00274 lambda_reduce_body& operator= ( <span class="keyword">const</span> lambda_reduce_body& other );
-<a name="l00275"></a>00275 <span class="keyword">public</span>:
-<a name="l00276"></a>00276 lambda_reduce_body( <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& body, <span class="keyword">const</span> Reduction& reduction )
-<a name="l00277"></a>00277 : identity_element(identity)
-<a name="l00278"></a>00278 , my_real_body(body)
-<a name="l00279"></a>00279 , my_reduction(reduction)
-<a name="l00280"></a>00280 , my_value(identity)
-<a name="l00281"></a>00281 { }
-<a name="l00282"></a>00282 lambda_reduce_body( <span class="keyword">const</span> lambda_reduce_body& other )
-<a name="l00283"></a>00283 : identity_element(other.identity_element)
-<a name="l00284"></a>00284 , my_real_body(other.my_real_body)
-<a name="l00285"></a>00285 , my_reduction(other.my_reduction)
-<a name="l00286"></a>00286 , my_value(other.my_value)
-<a name="l00287"></a>00287 { }
-<a name="l00288"></a>00288 lambda_reduce_body( lambda_reduce_body& other, <a class="code" href="a00335.html">tbb::split</a> )
-<a name="l00289"></a>00289 : identity_element(other.identity_element)
-<a name="l00290"></a>00290 , my_real_body(other.my_real_body)
-<a name="l00291"></a>00291 , my_reduction(other.my_reduction)
-<a name="l00292"></a>00292 , my_value(other.identity_element)
-<a name="l00293"></a>00293 { }
-<a name="l00294"></a>00294 <span class="keywordtype">void</span> operator()(Range& range) {
-<a name="l00295"></a>00295 my_value = my_real_body(range, const_cast<const Value&>(my_value));
-<a name="l00296"></a>00296 }
-<a name="l00297"></a>00297 <span class="keywordtype">void</span> join( lambda_reduce_body& rhs ) {
-<a name="l00298"></a>00298 my_value = my_reduction(const_cast<const Value&>(my_value), const_cast<const Value&>(rhs.my_value));
-<a name="l00299"></a>00299 }
-<a name="l00300"></a>00300 Value result()<span class="keyword"> const </span>{
-<a name="l00301"></a>00301 <span class="keywordflow">return</span> my_value;
-<a name="l00302"></a>00302 }
-<a name="l00303"></a>00303 };
-<a name="l00304"></a>00304
-<a name="l00305"></a>00305 } <span class="comment">// namespace internal</span>
-<a name="l00307"></a>00307 <span class="comment"></span>
-<a name="l00308"></a>00308 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00309"></a>00309
-<a name="l00328"></a>00328
-<a name="l00330"></a>00330
-<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00332"></a><a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">00332</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
-<a name="l00333"></a>00333 internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_PARTITIONER() );
-<a name="l00334"></a>00334 }
-<a name="l00335"></a>00335
-<a name="l00337"></a>00337
-<a name="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00339"></a><a class="code" href="a00426.html#gec1b7c03f9da909bef5db12e3d41bed3">00339</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>& partitioner ) {
-<a name="l00340"></a>00340 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );
-<a name="l00341"></a>00341 }
-<a name="l00342"></a>00342
-<a name="l00344"></a>00344
-<a name="l00345"></a>00345 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00346"></a><a class="code" href="a00426.html#g18a19157e6245992fc00ca0adeb7dd37">00346</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00257.html">auto_partitioner</a>& partitioner ) {
-<a name="l00347"></a>00347 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );
-<a name="l00348"></a>00348 }
-<a name="l00349"></a>00349
-<a name="l00351"></a>00351
-<a name="l00352"></a>00352 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00353"></a><a class="code" href="a00426.html#gc61e73fcc36c92d79a217fc355ff4a6b">00353</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00249.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00354"></a>00354 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
-<a name="l00355"></a>00355 }
-<a name="l00356"></a>00356
-<a name="l00357"></a>00357 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00359"></a>00359 <span class="preprocessor"></span>
-<a name="l00360"></a>00360 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00361"></a><a class="code" href="a00426.html#g45cb00c42a18e334bbde8b7535afe460">00361</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>& partitioner, <a class="code" href="a00339.html">task_group_cont [...]
-<a name="l00362"></a>00362 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );
-<a name="l00363"></a>00363 }
-<a name="l00364"></a>00364
-<a name="l00366"></a>00366
-<a name="l00367"></a>00367 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00368"></a><a class="code" href="a00426.html#g1c1ea1d7c61b3c225e92c70d669a53a5">00368</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00257.html">auto_partitioner</a>& partitioner, <a class="code" href="a00339.html">task_group_context</a>& context ) {
-<a name="l00369"></a>00369 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );
-<a name="l00370"></a>00370 }
-<a name="l00371"></a>00371
-<a name="l00373"></a>00373
-<a name="l00374"></a>00374 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00375"></a><a class="code" href="a00426.html#gd9ac3a3811060314695f33b703c6e11b">00375</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00249.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00339.html">task_group_context</a>& context ) {
-<a name="l00376"></a>00376 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
-<a name="l00377"></a>00377 }
-<a name="l00378"></a>00378 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00379"></a>00379
-<a name="l00383"></a>00383
-<a name="l00384"></a>00384
-<a name="l00385"></a>00385 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00386"></a><a class="code" href="a00426.html#gc9412e09fb01fcad8c018ea9cffb28ef">00386</a> Value <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction ) {
-<a name="l00387"></a>00387 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00388"></a>00388 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> __TBB_DEFAULT_PARTITIONER>
-<a name="l00389"></a>00389 ::run(range, body, __TBB_DEFAULT_PARTITIONER() );
-<a name="l00390"></a>00390 <span class="keywordflow">return</span> body.result();
-<a name="l00391"></a>00391 }
-<a name="l00392"></a>00392
-<a name="l00394"></a>00394
-<a name="l00395"></a>00395 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00396"></a><a class="code" href="a00426.html#gaddffeec0e892ac3d6fc7fc2053e1eca">00396</a> Value <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00397"></a>00397 <span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>& partitioner ) {
-<a name="l00398"></a>00398 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00399"></a>00399 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>>
-<a name="l00400"></a>00400 ::run(range, body, partitioner );
-<a name="l00401"></a>00401 <span class="keywordflow">return</span> body.result();
-<a name="l00402"></a>00402 }
-<a name="l00403"></a>00403
-<a name="l00405"></a>00405
-<a name="l00406"></a>00406 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00407"></a><a class="code" href="a00426.html#gb175401f0729e40dd2c5860a17c14385">00407</a> Value <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00408"></a>00408 <span class="keyword">const</span> <a class="code" href="a00257.html">auto_partitioner</a>& partitioner ) {
-<a name="l00409"></a>00409 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00410"></a>00410 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00257.html">auto_partitioner</a>>
-<a name="l00411"></a>00411 ::run( range, body, partitioner );
-<a name="l00412"></a>00412 <span class="keywordflow">return</span> body.result();
-<a name="l00413"></a>00413 }
-<a name="l00414"></a>00414
-<a name="l00416"></a>00416
-<a name="l00417"></a>00417 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00418"></a><a class="code" href="a00426.html#gb7f1f1828ae2b330ce05b8513a495154">00418</a> Value <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00419"></a>00419 <a class="code" href="a00249.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00420"></a>00420 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00421"></a>00421 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00249.html">affinity_partitioner</a>>
-<a name="l00422"></a>00422 ::run( range, body, partitioner );
-<a name="l00423"></a>00423 <span class="keywordflow">return</span> body.result();
-<a name="l00424"></a>00424 }
-<a name="l00425"></a>00425
-<a name="l00426"></a>00426 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00428"></a>00428 <span class="preprocessor"></span>
-<a name="l00429"></a>00429 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
-<a name="l00430"></a><a class="code" href="a00426.html#gfbc0cc2026d87f11a96bcd62788f5bb5">00430</a> <span class="preprocessor"></span>Value <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00431"></a>00431 <span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>& partitioner, <a class="code" href="a00339.html">task_group_context</a>& context ) {
-<a name="l00432"></a>00432 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00433"></a>00433 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>>
-<a name="l00434"></a>00434 ::run( range, body, partitioner, context );
-<a name="l00435"></a>00435 <span class="keywordflow">return</span> body.result();
-<a name="l00436"></a>00436 }
-<a name="l00437"></a>00437
-<a name="l00439"></a>00439
-<a name="l00440"></a>00440 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00441"></a><a class="code" href="a00426.html#g630c90a399937d9d4ae70ff883186dfd">00441</a> Value <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00442"></a>00442 <span class="keyword">const</span> <a class="code" href="a00257.html">auto_partitioner</a>& partitioner, <a class="code" href="a00339.html">task_group_context</a>& context ) {
-<a name="l00443"></a>00443 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00444"></a>00444 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00257.html">auto_partitioner</a>>
-<a name="l00445"></a>00445 ::run( range, body, partitioner, context );
-<a name="l00446"></a>00446 <span class="keywordflow">return</span> body.result();
-<a name="l00447"></a>00447 }
-<a name="l00448"></a>00448
-<a name="l00450"></a>00450
-<a name="l00451"></a>00451 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00452"></a><a class="code" href="a00426.html#g496bd7eadb3b97495ccb5655ef90319e">00452</a> Value <a class="code" href="a00426.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00453"></a>00453 <a class="code" href="a00249.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00339.html">task_group_context</a>& context ) {
-<a name="l00454"></a>00454 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00455"></a>00455 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00249.html">affinity_partitioner</a>>
-<a name="l00456"></a>00456 ::run( range, body, partitioner, context );
-<a name="l00457"></a>00457 <span class="keywordflow">return</span> body.result();
-<a name="l00458"></a>00458 }
-<a name="l00459"></a>00459 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00460"></a>00460
-<a name="l00461"></a>00461 <span class="preprocessor">#if TBB_PREVIEW_DETERMINISTIC_REDUCE</span>
-<a name="l00463"></a>00463 <span class="preprocessor"></span>
-<a name="l00464"></a>00464 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00465"></a><a class="code" href="a00426.html#g873006cc80868b5b4604822bf100ddeb">00465</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00426.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
-<a name="l00466"></a>00466 internal::start_deterministic_reduce<Range,Body>::run( range, body );
-<a name="l00467"></a>00467 }
-<a name="l00468"></a>00468
-<a name="l00469"></a>00469 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00471"></a>00471 <span class="preprocessor"></span>
-<a name="l00472"></a>00472 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00473"></a><a class="code" href="a00426.html#gfd08c56b3a98d4437dadc5365326928a">00473</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00426.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00339.html">task_group_context</a>& context ) {
-<a name="l00474"></a>00474 internal::start_deterministic_reduce<Range,Body>::run( range, body, context );
-<a name="l00475"></a>00475 }
-<a name="l00476"></a>00476 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00477"></a>00477
-<a name="l00481"></a>00481
-<a name="l00482"></a>00482
-<a name="l00483"></a>00483 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00484"></a><a class="code" href="a00426.html#g3edb17bb1967c291d227556e0e47e507">00484</a> Value <a class="code" href="a00426.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction ) {
-<a name="l00485"></a>00485 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00486"></a>00486 internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
-<a name="l00487"></a>00487 ::run(range, body);
-<a name="l00488"></a>00488 <span class="keywordflow">return</span> body.result();
-<a name="l00489"></a>00489 }
-<a name="l00490"></a>00490
-<a name="l00491"></a>00491 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00493"></a>00493 <span class="preprocessor"></span>
-<a name="l00494"></a>00494 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
-<a name="l00495"></a><a class="code" href="a00426.html#g0a66bc67567b2d01d709b59b9bddf84a">00495</a> <span class="preprocessor"></span>Value <a class="code" href="a00426.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00496"></a>00496 <a class="code" href="a00339.html">task_group_context</a>& context ) {
-<a name="l00497"></a>00497 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00498"></a>00498 internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
-<a name="l00499"></a>00499 ::run( range, body, context );
-<a name="l00500"></a>00500 <span class="keywordflow">return</span> body.result();
-<a name="l00501"></a>00501 }
-<a name="l00502"></a>00502 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00503"></a>00503 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_DETERMINISTIC_REDUCE */</span>
-<a name="l00504"></a>00504
-<a name="l00505"></a>00505
-<a name="l00506"></a>00506 } <span class="comment">// namespace tbb</span>
-<a name="l00507"></a>00507
-<a name="l00508"></a>00508 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_reduce_H */</span>
-<a name="l00509"></a>00509
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00562.html b/doc/html/a00562.html
deleted file mode 100644
index bc3407f..0000000
--- a/doc/html/a00562.html
+++ /dev/null
@@ -1,341 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_scan.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_scan.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_scan_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_scan_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <new></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb {
-<a name="l00030"></a>00030
-<a name="l00032"></a>00032
-<a name="l00033"></a><a class="code" href="a00311.html">00033</a> <span class="keyword">struct </span><a class="code" href="a00311.html">pre_scan_tag</a> {
-<a name="l00034"></a>00034 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00035"></a>00035 };
-<a name="l00036"></a>00036
-<a name="l00038"></a>00038
-<a name="l00039"></a><a class="code" href="a00284.html">00039</a> <span class="keyword">struct </span><a class="code" href="a00284.html">final_scan_tag</a> {
-<a name="l00040"></a>00040 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00041"></a>00041 };
-<a name="l00042"></a>00042
-<a name="l00044"></a>00044 <span class="keyword">namespace </span>internal {
-<a name="l00045"></a>00045
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00049"></a>00049 <span class="keyword">class </span>final_sum: <span class="keyword">public</span> <a class="code" href="a00337.html">task</a> {
-<a name="l00050"></a>00050 <span class="keyword">public</span>:
-<a name="l00051"></a>00051 Body body;
-<a name="l00052"></a>00052 <span class="keyword">private</span>:
-<a name="l00053"></a>00053 <a class="code" href="a00253.html">aligned_space<Range,1></a> range;
-<a name="l00055"></a>00055 Body* stuff_last;
-<a name="l00056"></a>00056 <span class="keyword">public</span>:
-<a name="l00057"></a>00057 final_sum( Body& body_ ) :
-<a name="l00058"></a>00058 body(body_,<a class="code" href="a00335.html">split</a>())
-<a name="l00059"></a>00059 {
-<a name="l00060"></a>00060 poison_pointer(stuff_last);
-<a name="l00061"></a>00061 }
-<a name="l00062"></a>00062 ~final_sum() {
-<a name="l00063"></a>00063 range.begin()->~Range();
-<a name="l00064"></a>00064 }
-<a name="l00065"></a>00065 <span class="keywordtype">void</span> finish_construction( <span class="keyword">const</span> Range& range_, Body* stuff_last_ ) {
-<a name="l00066"></a>00066 <span class="keyword">new</span>( range.begin() ) Range(range_);
-<a name="l00067"></a>00067 stuff_last = stuff_last_;
-<a name="l00068"></a>00068 }
-<a name="l00069"></a>00069 <span class="keyword">private</span>:
-<a name="l00070"></a>00070 <span class="comment">/*override*/</span> task* execute() {
-<a name="l00071"></a>00071 body( *range.begin(), final_scan_tag() );
-<a name="l00072"></a>00072 <span class="keywordflow">if</span>( stuff_last )
-<a name="l00073"></a>00073 stuff_last->assign(body);
-<a name="l00074"></a>00074 <span class="keywordflow">return</span> NULL;
-<a name="l00075"></a>00075 }
-<a name="l00076"></a>00076 };
-<a name="l00077"></a>00077
-<a name="l00079"></a>00079
-<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00081"></a>00081 <span class="keyword">class </span>sum_node: <span class="keyword">public</span> task {
-<a name="l00082"></a>00082 <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
-<a name="l00083"></a>00083 <span class="keyword">public</span>:
-<a name="l00084"></a>00084 final_sum_type *incoming;
-<a name="l00085"></a>00085 final_sum_type *body;
-<a name="l00086"></a>00086 Body *stuff_last;
-<a name="l00087"></a>00087 <span class="keyword">private</span>:
-<a name="l00088"></a>00088 final_sum_type *left_sum;
-<a name="l00089"></a>00089 sum_node *left;
-<a name="l00090"></a>00090 sum_node *right;
-<a name="l00091"></a>00091 <span class="keywordtype">bool</span> left_is_final;
-<a name="l00092"></a>00092 Range range;
-<a name="l00093"></a>00093 sum_node( <span class="keyword">const</span> Range range_, <span class="keywordtype">bool</span> left_is_final_ ) :
-<a name="l00094"></a>00094 left_sum(NULL),
-<a name="l00095"></a>00095 left(NULL),
-<a name="l00096"></a>00096 right(NULL),
-<a name="l00097"></a>00097 left_is_final(left_is_final_),
-<a name="l00098"></a>00098 range(range_)
-<a name="l00099"></a>00099 {
-<a name="l00100"></a>00100 <span class="comment">// Poison fields that will be set by second pass.</span>
-<a name="l00101"></a>00101 poison_pointer(body);
-<a name="l00102"></a>00102 poison_pointer(incoming);
-<a name="l00103"></a>00103 }
-<a name="l00104"></a>00104 task* create_child( <span class="keyword">const</span> Range& range_, final_sum_type& f, sum_node* n, final_sum_type* incoming_, Body* stuff_last_ ) {
-<a name="l00105"></a>00105 <span class="keywordflow">if</span>( !n ) {
-<a name="l00106"></a>00106 f.recycle_as_child_of( *<span class="keyword">this</span> );
-<a name="l00107"></a>00107 f.finish_construction( range_, stuff_last_ );
-<a name="l00108"></a>00108 <span class="keywordflow">return</span> &f;
-<a name="l00109"></a>00109 } <span class="keywordflow">else</span> {
-<a name="l00110"></a>00110 n->body = &f;
-<a name="l00111"></a>00111 n->incoming = incoming_;
-<a name="l00112"></a>00112 n->stuff_last = stuff_last_;
-<a name="l00113"></a>00113 <span class="keywordflow">return</span> n;
-<a name="l00114"></a>00114 }
-<a name="l00115"></a>00115 }
-<a name="l00116"></a>00116 <span class="comment">/*override*/</span> task* execute() {
-<a name="l00117"></a>00117 <span class="keywordflow">if</span>( body ) {
-<a name="l00118"></a>00118 <span class="keywordflow">if</span>( incoming )
-<a name="l00119"></a>00119 left_sum->body.reverse_join( incoming->body );
-<a name="l00120"></a>00120 recycle_as_continuation();
-<a name="l00121"></a>00121 sum_node& c = *<span class="keyword">this</span>;
-<a name="l00122"></a>00122 task* b = c.create_child(Range(range,split()),*left_sum,right,left_sum,stuff_last);
-<a name="l00123"></a>00123 task* a = left_is_final ? NULL : c.create_child(range,*body,left,incoming,NULL);
-<a name="l00124"></a>00124 set_ref_count( (a!=NULL)+(b!=NULL) );
-<a name="l00125"></a>00125 body = NULL;
-<a name="l00126"></a>00126 <span class="keywordflow">if</span>( a ) spawn(*b);
-<a name="l00127"></a>00127 <span class="keywordflow">else</span> a = b;
-<a name="l00128"></a>00128 <span class="keywordflow">return</span> a;
-<a name="l00129"></a>00129 } <span class="keywordflow">else</span> {
-<a name="l00130"></a>00130 <span class="keywordflow">return</span> NULL;
-<a name="l00131"></a>00131 }
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133 <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_,<span class="keyword">typename</span> Partitioner_>
-<a name="l00134"></a>00134 <span class="keyword">friend</span> <span class="keyword">class </span>start_scan;
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_>
-<a name="l00137"></a>00137 <span class="keyword">friend</span> <span class="keyword">class </span>finish_scan;
-<a name="l00138"></a>00138 };
-<a name="l00139"></a>00139
-<a name="l00141"></a>00141
-<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00143"></a>00143 <span class="keyword">class </span>finish_scan: <span class="keyword">public</span> task {
-<a name="l00144"></a>00144 <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
-<a name="l00145"></a>00145 <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
-<a name="l00146"></a>00146 final_sum_type** <span class="keyword">const</span> sum;
-<a name="l00147"></a>00147 sum_node_type*& return_slot;
-<a name="l00148"></a>00148 <span class="keyword">public</span>:
-<a name="l00149"></a>00149 final_sum_type* right_zombie;
-<a name="l00150"></a>00150 sum_node_type& result;
-<a name="l00151"></a>00151
-<a name="l00152"></a>00152 <span class="comment">/*override*/</span> task* execute() {
-<a name="l00153"></a>00153 __TBB_ASSERT( result.ref_count()==(result.left!=NULL)+(result.right!=NULL), NULL );
-<a name="l00154"></a>00154 <span class="keywordflow">if</span>( result.left )
-<a name="l00155"></a>00155 result.left_is_final = <span class="keyword">false</span>;
-<a name="l00156"></a>00156 <span class="keywordflow">if</span>( right_zombie && sum )
-<a name="l00157"></a>00157 ((*sum)->body).reverse_join(result.left_sum->body);
-<a name="l00158"></a>00158 __TBB_ASSERT( !return_slot, NULL );
-<a name="l00159"></a>00159 <span class="keywordflow">if</span>( right_zombie || result.right ) {
-<a name="l00160"></a>00160 return_slot = &result;
-<a name="l00161"></a>00161 } <span class="keywordflow">else</span> {
-<a name="l00162"></a>00162 destroy( result );
-<a name="l00163"></a>00163 }
-<a name="l00164"></a>00164 <span class="keywordflow">if</span>( right_zombie && !sum && !result.right ) destroy(*right_zombie);
-<a name="l00165"></a>00165 <span class="keywordflow">return</span> NULL;
-<a name="l00166"></a>00166 }
-<a name="l00167"></a>00167
-<a name="l00168"></a>00168 finish_scan( sum_node_type*& return_slot_, final_sum_type** sum_, sum_node_type& result_ ) :
-<a name="l00169"></a>00169 sum(sum_),
-<a name="l00170"></a>00170 return_slot(return_slot_),
-<a name="l00171"></a>00171 right_zombie(NULL),
-<a name="l00172"></a>00172 result(result_)
-<a name="l00173"></a>00173 {
-<a name="l00174"></a>00174 __TBB_ASSERT( !return_slot, NULL );
-<a name="l00175"></a>00175 }
-<a name="l00176"></a>00176 };
-<a name="l00177"></a>00177
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner=simple_partitioner>
-<a name="l00181"></a>00181 <span class="keyword">class </span>start_scan: <span class="keyword">public</span> task {
-<a name="l00182"></a>00182 <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
-<a name="l00183"></a>00183 <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
-<a name="l00184"></a>00184 final_sum_type* body;
-<a name="l00186"></a>00186 final_sum_type** sum;
-<a name="l00187"></a>00187 sum_node_type** return_slot;
-<a name="l00189"></a>00189 sum_node_type* parent_sum;
-<a name="l00190"></a>00190 <span class="keywordtype">bool</span> is_final;
-<a name="l00191"></a>00191 <span class="keywordtype">bool</span> is_right_child;
-<a name="l00192"></a>00192 Range range;
-<a name="l00193"></a>00193 <span class="keyword">typename</span> Partitioner::partition_type partition;
-<a name="l00194"></a>00194 <span class="comment">/*override*/</span> task* execute();
-<a name="l00195"></a>00195 <span class="keyword">public</span>:
-<a name="l00196"></a>00196 start_scan( sum_node_type*& return_slot_, start_scan& parent_, sum_node_type* parent_sum_ ) :
-<a name="l00197"></a>00197 body(parent_.body),
-<a name="l00198"></a>00198 sum(parent_.sum),
-<a name="l00199"></a>00199 return_slot(&return_slot_),
-<a name="l00200"></a>00200 parent_sum(parent_sum_),
-<a name="l00201"></a>00201 is_final(parent_.is_final),
-<a name="l00202"></a>00202 is_right_child(false),
-<a name="l00203"></a>00203 range(parent_.range,split()),
-<a name="l00204"></a>00204 partition(parent_.partition,split())
-<a name="l00205"></a>00205 {
-<a name="l00206"></a>00206 __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00207"></a>00207 }
-<a name="l00208"></a>00208
-<a name="l00209"></a>00209 start_scan( sum_node_type*& return_slot_, <span class="keyword">const</span> Range& range_, final_sum_type& body_, <span class="keyword">const</span> Partitioner& partitioner_) :
-<a name="l00210"></a>00210 body(&body_),
-<a name="l00211"></a>00211 sum(NULL),
-<a name="l00212"></a>00212 return_slot(&return_slot_),
-<a name="l00213"></a>00213 parent_sum(NULL),
-<a name="l00214"></a>00214 is_final(true),
-<a name="l00215"></a>00215 is_right_child(false),
-<a name="l00216"></a>00216 range(range_),
-<a name="l00217"></a>00217 partition(partitioner_)
-<a name="l00218"></a>00218 {
-<a name="l00219"></a>00219 __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00220"></a>00220 }
-<a name="l00221"></a>00221
-<a name="l00222"></a>00222 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range_, Body& body_, <span class="keyword">const</span> Partitioner& partitioner_ ) {
-<a name="l00223"></a>00223 <span class="keywordflow">if</span>( !range_.empty() ) {
-<a name="l00224"></a>00224 <span class="keyword">typedef</span> internal::start_scan<Range,Body,Partitioner> start_pass1_type;
-<a name="l00225"></a>00225 internal::sum_node<Range,Body>* root = NULL;
-<a name="l00226"></a>00226 <span class="keyword">typedef</span> internal::final_sum<Range,Body> final_sum_type;
-<a name="l00227"></a>00227 final_sum_type* temp_body = <span class="keyword">new</span>(<a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) final_sum_type( body_ );
-<a name="l00228"></a>00228 start_pass1_type& pass1 = *<span class="keyword">new</span>(<a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_pass1_type(
-<a name="l00229"></a>00229 <span class="comment">/*return_slot=*/</span>root,
-<a name="l00230"></a>00230 range_,
-<a name="l00231"></a>00231 *temp_body,
-<a name="l00232"></a>00232 partitioner_ );
-<a name="l00233"></a>00233 <a class="code" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( pass1 );
-<a name="l00234"></a>00234 <span class="keywordflow">if</span>( root ) {
-<a name="l00235"></a>00235 root->body = temp_body;
-<a name="l00236"></a>00236 root->incoming = NULL;
-<a name="l00237"></a>00237 root->stuff_last = &body_;
-<a name="l00238"></a>00238 <a class="code" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *root );
-<a name="l00239"></a>00239 } <span class="keywordflow">else</span> {
-<a name="l00240"></a>00240 body_.assign(temp_body->body);
-<a name="l00241"></a>00241 temp_body->finish_construction( range_, NULL );
-<a name="l00242"></a>00242 temp_body->destroy(*temp_body);
-<a name="l00243"></a>00243 }
-<a name="l00244"></a>00244 }
-<a name="l00245"></a>00245 }
-<a name="l00246"></a>00246 };
-<a name="l00247"></a>00247
-<a name="l00248"></a>00248 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00249"></a>00249 task* start_scan<Range,Body,Partitioner>::execute() {
-<a name="l00250"></a>00250 <span class="keyword">typedef</span> internal::finish_scan<Range,Body> finish_pass1_type;
-<a name="l00251"></a>00251 finish_pass1_type* p = parent_sum ? static_cast<finish_pass1_type*>( parent() ) : NULL;
-<a name="l00252"></a>00252 <span class="comment">// Inspecting p->result.left_sum would ordinarily be a race condition.</span>
-<a name="l00253"></a>00253 <span class="comment">// But we inspect it only if we are not a stolen task, in which case we</span>
-<a name="l00254"></a>00254 <span class="comment">// know that task assigning to p->result.left_sum has completed.</span>
-<a name="l00255"></a>00255 <span class="keywordtype">bool</span> treat_as_stolen = is_right_child && (is_stolen_task() || body!=p->result.left_sum);
-<a name="l00256"></a>00256 <span class="keywordflow">if</span>( treat_as_stolen ) {
-<a name="l00257"></a>00257 <span class="comment">// Invocation is for right child that has been really stolen or needs to be virtually stolen</span>
-<a name="l00258"></a>00258 p->right_zombie = body = <span class="keyword">new</span>( allocate_root() ) final_sum_type(body->body);
-<a name="l00259"></a>00259 is_final = <span class="keyword">false</span>;
-<a name="l00260"></a>00260 }
-<a name="l00261"></a>00261 task* next_task = NULL;
-<a name="l00262"></a>00262 <span class="keywordflow">if</span>( (is_right_child && !treat_as_stolen) || !range.is_divisible() || partition.should_execute_range(*<span class="keyword">this</span>) ) {
-<a name="l00263"></a>00263 <span class="keywordflow">if</span>( is_final )
-<a name="l00264"></a>00264 (body->body)( range, final_scan_tag() );
-<a name="l00265"></a>00265 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( sum )
-<a name="l00266"></a>00266 (body->body)( range, pre_scan_tag() );
-<a name="l00267"></a>00267 <span class="keywordflow">if</span>( sum )
-<a name="l00268"></a>00268 *sum = body;
-<a name="l00269"></a>00269 __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00270"></a>00270 } <span class="keywordflow">else</span> {
-<a name="l00271"></a>00271 sum_node_type* result;
-<a name="l00272"></a>00272 <span class="keywordflow">if</span>( parent_sum )
-<a name="l00273"></a>00273 result = <span class="keyword">new</span>(allocate_additional_child_of(*parent_sum)) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
-<a name="l00274"></a>00274 <span class="keywordflow">else</span>
-<a name="l00275"></a>00275 result = <span class="keyword">new</span>(<a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
-<a name="l00276"></a>00276 finish_pass1_type& c = *<span class="keyword">new</span>( allocate_continuation()) finish_pass1_type(*return_slot,sum,*result);
-<a name="l00277"></a>00277 <span class="comment">// Split off right child</span>
-<a name="l00278"></a>00278 start_scan& b = *<span class="keyword">new</span>( c.allocate_child() ) start_scan( <span class="comment">/*return_slot=*/</span>result->right, *<span class="keyword">this</span>, result );
-<a name="l00279"></a>00279 b.is_right_child = <span class="keyword">true</span>;
-<a name="l00280"></a>00280 <span class="comment">// Left child is recycling of *this. Must recycle this before spawning b, </span>
-<a name="l00281"></a>00281 <span class="comment">// otherwise b might complete and decrement c.ref_count() to zero, which</span>
-<a name="l00282"></a>00282 <span class="comment">// would cause c.execute() to run prematurely.</span>
-<a name="l00283"></a>00283 recycle_as_child_of(c);
-<a name="l00284"></a>00284 c.set_ref_count(2);
-<a name="l00285"></a>00285 c.spawn(b);
-<a name="l00286"></a>00286 sum = &result->left_sum;
-<a name="l00287"></a>00287 return_slot = &result->left;
-<a name="l00288"></a>00288 is_right_child = <span class="keyword">false</span>;
-<a name="l00289"></a>00289 next_task = <span class="keyword">this</span>;
-<a name="l00290"></a>00290 parent_sum = result;
-<a name="l00291"></a>00291 __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00292"></a>00292 }
-<a name="l00293"></a>00293 <span class="keywordflow">return</span> next_task;
-<a name="l00294"></a>00294 }
-<a name="l00295"></a>00295 } <span class="comment">// namespace internal</span>
-<a name="l00297"></a>00297 <span class="comment"></span>
-<a name="l00298"></a>00298 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00299"></a>00299
-<a name="l00317"></a>00317
-<a name="l00319"></a>00319
-<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00321"></a><a class="code" href="a00426.html#ged143f31dd3d96ded02ab3db915b91c7">00321</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body ) {
-<a name="l00322"></a>00322 internal::start_scan<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
-<a name="l00323"></a>00323 }
-<a name="l00324"></a>00324
-<a name="l00326"></a>00326
-<a name="l00327"></a>00327 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00328"></a><a class="code" href="a00426.html#gc9fac8870b2e6365fb337014404529df">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>& partitioner ) {
-<a name="l00329"></a>00329 internal::start_scan<Range,Body,simple_partitioner>::run(range,body,partitioner);
-<a name="l00330"></a>00330 }
-<a name="l00331"></a>00331
-<a name="l00333"></a>00333
-<a name="l00334"></a>00334 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00335"></a><a class="code" href="a00426.html#g62fde400a37bbca1a2fddc8e3d22f556">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00257.html">auto_partitioner</a>& partitioner ) {
-<a name="l00336"></a>00336 internal::start_scan<Range,Body,auto_partitioner>::run(range,body,partitioner);
-<a name="l00337"></a>00337 }
-<a name="l00339"></a>00339
-<a name="l00340"></a>00340 } <span class="comment">// namespace tbb</span>
-<a name="l00341"></a>00341
-<a name="l00342"></a>00342 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_scan_H */</span>
-<a name="l00343"></a>00343
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00567.html b/doc/html/a00567.html
deleted file mode 100644
index 70fffb3..0000000
--- a/doc/html/a00567.html
+++ /dev/null
@@ -1,229 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_sort.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_sort.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_sort_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_sort_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "parallel_for.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <algorithm></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include <iterator></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include <functional></span>
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031
-<a name="l00033"></a>00033 <span class="keyword">namespace </span>internal {
-<a name="l00034"></a>00034
-<a name="l00036"></a>00036
-<a name="l00039"></a>00039 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00040"></a>00040 <span class="keyword">class </span>quick_sort_range: <span class="keyword">private</span> no_assign {
-<a name="l00041"></a>00041
-<a name="l00042"></a>00042 <span class="keyword">inline</span> size_t median_of_three(<span class="keyword">const</span> RandomAccessIterator &array, size_t l, size_t m, size_t r)<span class="keyword"> const </span>{
-<a name="l00043"></a>00043 <span class="keywordflow">return</span> comp(array[l], array[m]) ? ( comp(array[m], array[r]) ? m : ( comp( array[l], array[r]) ? r : l ) )
-<a name="l00044"></a>00044 : ( comp(array[r], array[m]) ? m : ( comp( array[r], array[l] ) ? r : l ) );
-<a name="l00045"></a>00045 }
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="keyword">inline</span> size_t pseudo_median_of_nine( <span class="keyword">const</span> RandomAccessIterator &array, <span class="keyword">const</span> quick_sort_range &range )<span class="keyword"> const </span>{
-<a name="l00048"></a>00048 size_t offset = range.size/8u;
-<a name="l00049"></a>00049 <span class="keywordflow">return</span> median_of_three(array,
-<a name="l00050"></a>00050 median_of_three(array, 0, offset, offset*2),
-<a name="l00051"></a>00051 median_of_three(array, offset*3, offset*4, offset*5),
-<a name="l00052"></a>00052 median_of_three(array, offset*6, offset*7, range.size - 1) );
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 }
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keyword">public</span>:
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 <span class="keyword">static</span> <span class="keyword">const</span> size_t grainsize = 500;
-<a name="l00059"></a>00059 <span class="keyword">const</span> Compare ∁
-<a name="l00060"></a>00060 RandomAccessIterator begin;
-<a name="l00061"></a>00061 size_t size;
-<a name="l00062"></a>00062
-<a name="l00063"></a>00063 quick_sort_range( RandomAccessIterator begin_, size_t size_, <span class="keyword">const</span> Compare &comp_ ) :
-<a name="l00064"></a>00064 comp(comp_), begin(begin_), size(size_) {}
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size==0;}
-<a name="l00067"></a>00067 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size>=grainsize;}
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 quick_sort_range( quick_sort_range& range, split ) : comp(range.comp) {
-<a name="l00070"></a>00070 RandomAccessIterator array = range.begin;
-<a name="l00071"></a>00071 RandomAccessIterator key0 = range.begin;
-<a name="l00072"></a>00072 size_t m = pseudo_median_of_nine(array, range);
-<a name="l00073"></a>00073 <span class="keywordflow">if</span> (m) std::swap ( array[0], array[m] );
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 size_t i=0;
-<a name="l00076"></a>00076 size_t j=range.size;
-<a name="l00077"></a>00077 <span class="comment">// Partition interval [i+1,j-1] with key *key0.</span>
-<a name="l00078"></a>00078 <span class="keywordflow">for</span>(;;) {
-<a name="l00079"></a>00079 __TBB_ASSERT( i<j, NULL );
-<a name="l00080"></a>00080 <span class="comment">// Loop must terminate since array[l]==*key0.</span>
-<a name="l00081"></a>00081 <span class="keywordflow">do</span> {
-<a name="l00082"></a>00082 --j;
-<a name="l00083"></a>00083 __TBB_ASSERT( i<=j, <span class="stringliteral">"bad ordering relation?"</span> );
-<a name="l00084"></a>00084 } <span class="keywordflow">while</span>( comp( *key0, array[j] ));
-<a name="l00085"></a>00085 <span class="keywordflow">do</span> {
-<a name="l00086"></a>00086 __TBB_ASSERT( i<=j, NULL );
-<a name="l00087"></a>00087 <span class="keywordflow">if</span>( i==j ) <span class="keywordflow">goto</span> partition;
-<a name="l00088"></a>00088 ++i;
-<a name="l00089"></a>00089 } <span class="keywordflow">while</span>( comp( array[i],*key0 ));
-<a name="l00090"></a>00090 <span class="keywordflow">if</span>( i==j ) <span class="keywordflow">goto</span> partition;
-<a name="l00091"></a>00091 std::swap( array[i], array[j] );
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093 partition:
-<a name="l00094"></a>00094 <span class="comment">// Put the partition key were it belongs</span>
-<a name="l00095"></a>00095 std::swap( array[j], *key0 );
-<a name="l00096"></a>00096 <span class="comment">// array[l..j) is less or equal to key.</span>
-<a name="l00097"></a>00097 <span class="comment">// array(j..r) is greater or equal to key.</span>
-<a name="l00098"></a>00098 <span class="comment">// array[j] is equal to key</span>
-<a name="l00099"></a>00099 i=j+1;
-<a name="l00100"></a>00100 begin = array+i;
-<a name="l00101"></a>00101 size = range.size-i;
-<a name="l00102"></a>00102 range.size = j;
-<a name="l00103"></a>00103 }
-<a name="l00104"></a>00104 };
-<a name="l00105"></a>00105
-<a name="l00106"></a>00106 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span>
-<a name="l00109"></a>00109 <span class="preprocessor">template<typename RandomAccessIterator, typename Compare></span>
-<a name="l00110"></a>00110 <span class="preprocessor"></span><span class="keyword">class </span>quick_sort_pretest_body : internal::no_assign {
-<a name="l00111"></a>00111 <span class="keyword">const</span> Compare ∁
-<a name="l00112"></a>00112
-<a name="l00113"></a>00113 <span class="keyword">public</span>:
-<a name="l00114"></a>00114 quick_sort_pretest_body(<span class="keyword">const</span> Compare &_comp) : comp(_comp) {}
-<a name="l00115"></a>00115
-<a name="l00116"></a>00116 <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> blocked_range<RandomAccessIterator>& range )<span class="keyword"> const </span>{
-<a name="l00117"></a>00117 task &my_task = <a class="code" href="a00337.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>();
-<a name="l00118"></a>00118 RandomAccessIterator my_end = range.end();
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 <span class="keywordtype">int</span> i = 0;
-<a name="l00121"></a>00121 <span class="keywordflow">for</span> (RandomAccessIterator k = range.begin(); k != my_end; ++k, ++i) {
-<a name="l00122"></a>00122 <span class="keywordflow">if</span> ( i%64 == 0 && my_task.is_cancelled() ) <span class="keywordflow">break</span>;
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <span class="comment">// The k-1 is never out-of-range because the first chunk starts at begin+serial_cutoff+1</span>
-<a name="l00125"></a>00125 <span class="keywordflow">if</span> ( comp( *(k), *(k-1) ) ) {
-<a name="l00126"></a>00126 my_task.cancel_group_execution();
-<a name="l00127"></a>00127 <span class="keywordflow">break</span>;
-<a name="l00128"></a>00128 }
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131
-<a name="l00132"></a>00132 };
-<a name="l00133"></a>00133 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00134"></a>00134
-<a name="l00136"></a>00136
-<a name="l00137"></a>00137 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00138"></a>00138 <span class="keyword">struct </span>quick_sort_body {
-<a name="l00139"></a>00139 <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> quick_sort_range<RandomAccessIterator,Compare>& range )<span class="keyword"> const </span>{
-<a name="l00140"></a>00140 <span class="comment">//SerialQuickSort( range.begin, range.size, range.comp );</span>
-<a name="l00141"></a>00141 std::sort( range.begin, range.begin + range.size, range.comp );
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143 };
-<a name="l00144"></a>00144
-<a name="l00146"></a>00146
-<a name="l00147"></a>00147 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00148"></a>00148 <span class="keywordtype">void</span> parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp ) {
-<a name="l00149"></a>00149 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span> task_group_context my_context;
-<a name="l00151"></a>00151 <span class="keyword">const</span> <span class="keywordtype">int</span> serial_cutoff = 9;
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 __TBB_ASSERT( begin + serial_cutoff < end, <span class="stringliteral">"min_parallel_size is smaller than serial cutoff?"</span> );
-<a name="l00154"></a>00154 RandomAccessIterator k;
-<a name="l00155"></a>00155 <span class="keywordflow">for</span> ( k = begin ; k != begin + serial_cutoff; ++k ) {
-<a name="l00156"></a>00156 <span class="keywordflow">if</span> ( comp( *(k+1), *k ) ) {
-<a name="l00157"></a>00157 <span class="keywordflow">goto</span> do_parallel_quick_sort;
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159 }
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( blocked_range<RandomAccessIterator>(k+1, end),
-<a name="l00162"></a>00162 quick_sort_pretest_body<RandomAccessIterator,Compare>(comp),
-<a name="l00163"></a>00163 auto_partitioner(),
-<a name="l00164"></a>00164 my_context);
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 <span class="keywordflow">if</span> (my_context.is_group_execution_cancelled())
-<a name="l00167"></a>00167 do_parallel_quick_sort:
-<a name="l00168"></a>00168 #endif <span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00169"></a>00169 <a class="code" href="a00426.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ),
-<a name="l00170"></a>00170 quick_sort_body<RandomAccessIterator,Compare>(),
-<a name="l00171"></a>00171 auto_partitioner() );
-<a name="l00172"></a>00172 }
-<a name="l00173"></a>00173
-<a name="l00174"></a>00174 } <span class="comment">// namespace internal</span>
-<a name="l00176"></a>00176 <span class="comment"></span>
-<a name="l00187"></a>00187
-<a name="l00189"></a>00189
-<a name="l00192"></a>00192 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00193"></a><a class="code" href="a00426.html#g49edcf9447cd91a9527a3f8e8512b7aa">00193</a> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp) {
-<a name="l00194"></a>00194 <span class="keyword">const</span> <span class="keywordtype">int</span> min_parallel_size = 500;
-<a name="l00195"></a>00195 <span class="keywordflow">if</span>( end > begin ) {
-<a name="l00196"></a>00196 <span class="keywordflow">if</span> (end - begin < min_parallel_size) {
-<a name="l00197"></a>00197 std::sort(begin, end, comp);
-<a name="l00198"></a>00198 } <span class="keywordflow">else</span> {
-<a name="l00199"></a>00199 internal::parallel_quick_sort(begin, end, comp);
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201 }
-<a name="l00202"></a>00202 }
-<a name="l00203"></a>00203
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator>
-<a name="l00207"></a><a class="code" href="a00426.html#g16c3eb77d0e530834c51ce3857f01012">00207</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) {
-<a name="l00208"></a>00208 <a class="code" href="a00426.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< <span class="keyword">typename</span> std::iterator_traits<RandomAccessIterator>::value_type >() );
-<a name="l00209"></a>00209 }
-<a name="l00210"></a>00210
-<a name="l00212"></a>00212
-<a name="l00213"></a>00213 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00214"></a><a class="code" href="a00426.html#gc7576f82fdedc8a701a6c17ad9415926">00214</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00426.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
-<a name="l00215"></a>00215 <a class="code" href="a00426.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< T >() );
-<a name="l00216"></a>00216 }
-<a name="l00218"></a>00218
-<a name="l00219"></a>00219
-<a name="l00220"></a>00220 } <span class="comment">// namespace tbb</span>
-<a name="l00221"></a>00221
-<a name="l00222"></a>00222 <span class="preprocessor">#endif</span>
-<a name="l00223"></a>00223 <span class="preprocessor"></span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00571.html b/doc/html/a00571.html
deleted file mode 100644
index 7918b93..0000000
--- a/doc/html/a00571.html
+++ /dev/null
@@ -1,196 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_while.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_while.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_while</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_while</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <new></span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00030"></a>00030 <span class="keyword">class </span>parallel_while;
-<a name="l00031"></a>00031
-<a name="l00033"></a>00033 <span class="keyword">namespace </span>internal {
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keyword">template</span><<span class="keyword">typename</span> Stream, <span class="keyword">typename</span> Body> <span class="keyword">class </span>while_task;
-<a name="l00036"></a>00036
-<a name="l00038"></a>00038
-<a name="l00040"></a>00040 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00041"></a>00041 <span class="keyword">class </span>while_iteration_task: <span class="keyword">public</span> task {
-<a name="l00042"></a>00042 <span class="keyword">const</span> Body& my_body;
-<a name="l00043"></a>00043 <span class="keyword">typename</span> Body::argument_type my_value;
-<a name="l00044"></a>00044 <span class="comment">/*override*/</span> task* execute() {
-<a name="l00045"></a>00045 my_body(my_value);
-<a name="l00046"></a>00046 <span class="keywordflow">return</span> NULL;
-<a name="l00047"></a>00047 }
-<a name="l00048"></a>00048 while_iteration_task( <span class="keyword">const</span> <span class="keyword">typename</span> Body::argument_type& value, <span class="keyword">const</span> Body& body ) :
-<a name="l00049"></a>00049 my_body(body), my_value(value)
-<a name="l00050"></a>00050 {}
-<a name="l00051"></a>00051 <span class="keyword">template</span><<span class="keyword">typename</span> Body_> <span class="keyword">friend</span> <span class="keyword">class </span>while_group_task;
-<a name="l00052"></a>00052 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00308.html">tbb::parallel_while</a><Body>;
-<a name="l00053"></a>00053 };
-<a name="l00054"></a>00054
-<a name="l00056"></a>00056
-<a name="l00058"></a>00058 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00059"></a>00059 <span class="keyword">class </span>while_group_task: <span class="keyword">public</span> task {
-<a name="l00060"></a>00060 <span class="keyword">static</span> <span class="keyword">const</span> size_t max_arg_size = 4;
-<a name="l00061"></a>00061 <span class="keyword">const</span> Body& my_body;
-<a name="l00062"></a>00062 size_t size;
-<a name="l00063"></a>00063 <span class="keyword">typename</span> Body::argument_type my_arg[max_arg_size];
-<a name="l00064"></a>00064 while_group_task( <span class="keyword">const</span> Body& body ) : my_body(body), size(0) {}
-<a name="l00065"></a>00065 <span class="comment">/*override*/</span> task* execute() {
-<a name="l00066"></a>00066 <span class="keyword">typedef</span> while_iteration_task<Body> iteration_type;
-<a name="l00067"></a>00067 __TBB_ASSERT( size>0, NULL );
-<a name="l00068"></a>00068 task_list list;
-<a name="l00069"></a>00069 task* t;
-<a name="l00070"></a>00070 size_t k=0;
-<a name="l00071"></a>00071 <span class="keywordflow">for</span>(;;) {
-<a name="l00072"></a>00072 t = <span class="keyword">new</span>( allocate_child() ) iteration_type(my_arg[k],my_body);
-<a name="l00073"></a>00073 <span class="keywordflow">if</span>( ++k==size ) <span class="keywordflow">break</span>;
-<a name="l00074"></a>00074 list.push_back(*t);
-<a name="l00075"></a>00075 }
-<a name="l00076"></a>00076 set_ref_count(<span class="keywordtype">int</span>(k+1));
-<a name="l00077"></a>00077 spawn(list);
-<a name="l00078"></a>00078 spawn_and_wait_for_all(*t);
-<a name="l00079"></a>00079 <span class="keywordflow">return</span> NULL;
-<a name="l00080"></a>00080 }
-<a name="l00081"></a>00081 <span class="keyword">template</span><<span class="keyword">typename</span> Stream, <span class="keyword">typename</span> Body_> <span class="keyword">friend</span> <span class="keyword">class </span>while_task;
-<a name="l00082"></a>00082 };
-<a name="l00083"></a>00083
-<a name="l00085"></a>00085
-<a name="l00087"></a>00087 <span class="keyword">template</span><<span class="keyword">typename</span> Stream, <span class="keyword">typename</span> Body>
-<a name="l00088"></a>00088 <span class="keyword">class </span>while_task: <span class="keyword">public</span> task {
-<a name="l00089"></a>00089 Stream& my_stream;
-<a name="l00090"></a>00090 <span class="keyword">const</span> Body& my_body;
-<a name="l00091"></a>00091 empty_task& my_barrier;
-<a name="l00092"></a>00092 <span class="comment">/*override*/</span> task* execute() {
-<a name="l00093"></a>00093 <span class="keyword">typedef</span> while_group_task<Body> block_type;
-<a name="l00094"></a>00094 block_type& t = *<span class="keyword">new</span>( allocate_additional_child_of(my_barrier) ) block_type(my_body);
-<a name="l00095"></a>00095 size_t k=0;
-<a name="l00096"></a>00096 <span class="keywordflow">while</span>( my_stream.pop_if_present(t.my_arg[k]) ) {
-<a name="l00097"></a>00097 <span class="keywordflow">if</span>( ++k==block_type::max_arg_size ) {
-<a name="l00098"></a>00098 <span class="comment">// There might be more iterations.</span>
-<a name="l00099"></a>00099 recycle_to_reexecute();
-<a name="l00100"></a>00100 <span class="keywordflow">break</span>;
-<a name="l00101"></a>00101 }
-<a name="l00102"></a>00102 }
-<a name="l00103"></a>00103 <span class="keywordflow">if</span>( k==0 ) {
-<a name="l00104"></a>00104 destroy(t);
-<a name="l00105"></a>00105 <span class="keywordflow">return</span> NULL;
-<a name="l00106"></a>00106 } <span class="keywordflow">else</span> {
-<a name="l00107"></a>00107 t.size = k;
-<a name="l00108"></a>00108 <span class="keywordflow">return</span> &t;
-<a name="l00109"></a>00109 }
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111 while_task( Stream& stream, <span class="keyword">const</span> Body& body, empty_task& barrier ) :
-<a name="l00112"></a>00112 my_stream(stream),
-<a name="l00113"></a>00113 my_body(body),
-<a name="l00114"></a>00114 my_barrier(barrier)
-<a name="l00115"></a>00115 {}
-<a name="l00116"></a>00116 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00308.html">tbb::parallel_while</a><Body>;
-<a name="l00117"></a>00117 };
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 } <span class="comment">// namespace internal</span>
-<a name="l00121"></a>00121 <span class="comment"></span>
-<a name="l00123"></a>00123
-<a name="l00128"></a>00128 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00129"></a><a class="code" href="a00308.html">00129</a> <span class="keyword">class </span><a class="code" href="a00308.html">parallel_while</a>: internal::no_copy {
-<a name="l00130"></a>00130 <span class="keyword">public</span>:
-<a name="l00132"></a><a class="code" href="a00308.html#36e26ba3880c7bcf804a97ba0cbe133f">00132</a> <a class="code" href="a00308.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>() : my_body(NULL), my_barrier(NULL) {}
-<a name="l00133"></a>00133
-<a name="l00135"></a><a class="code" href="a00308.html#6fcfc973cc56b79c6d0fbb8a31be7e84">00135</a> <a class="code" href="a00308.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>() {
-<a name="l00136"></a>00136 <span class="keywordflow">if</span>( my_barrier ) {
-<a name="l00137"></a>00137 my_barrier-><a class="code" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(*my_barrier);
-<a name="l00138"></a>00138 my_barrier = NULL;
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140 }
-<a name="l00141"></a>00141
-<a name="l00143"></a><a class="code" href="a00308.html#fa297e53d3af2a101e712bc200233e9c">00143</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Body::argument_type <a class="code" href="a00308.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>;
-<a name="l00144"></a>00144
-<a name="l00146"></a>00146
-<a name="l00149"></a>00149 <span class="keyword">template</span><<span class="keyword">typename</span> Stream>
-<a name="l00150"></a>00150 <span class="keywordtype">void</span> <a class="code" href="a00308.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>( Stream& stream, <span class="keyword">const</span> Body& body );
-<a name="l00151"></a>00151
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <span class="keywordtype">void</span> <a class="code" href="a00308.html#e131c560057a58229992b61eb8dba4c6">add</a>( <span class="keyword">const</span> <a class="code" href="a00308.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>& item );
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156 <span class="keyword">private</span>:
-<a name="l00157"></a>00157 <span class="keyword">const</span> Body* my_body;
-<a name="l00158"></a>00158 <a class="code" href="a00280.html">empty_task</a>* my_barrier;
-<a name="l00159"></a>00159 };
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00162"></a>00162 <span class="keyword">template</span><<span class="keyword">typename</span> Stream>
-<a name="l00163"></a><a class="code" href="a00308.html#b32a0a6e5e09ebb7fad3e6652c19afe5">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00308.html">parallel_while<Body>::run</a>( Stream& stream, <span class="keyword">const</span> Body& body ) {
-<a name="l00164"></a>00164 <span class="keyword">using namespace </span>internal;
-<a name="l00165"></a>00165 <a class="code" href="a00280.html">empty_task</a>& barrier = *<span class="keyword">new</span>( <a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) <a class="code" href="a00280.html">empty_task</a>();
-<a name="l00166"></a>00166 my_body = &body;
-<a name="l00167"></a>00167 my_barrier = &barrier;
-<a name="l00168"></a>00168 my_barrier-><a class="code" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(2);
-<a name="l00169"></a>00169 while_task<Stream,Body>& w = *<span class="keyword">new</span>( my_barrier-><a class="code" href="a00337.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>() ) while_task<Stream,Body>( stream, body, barrier );
-<a name="l00170"></a>00170 my_barrier-><a class="code" href="a00337.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(w);
-<a name="l00171"></a>00171 my_barrier-><a class="code" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(*my_barrier);
-<a name="l00172"></a>00172 my_barrier = NULL;
-<a name="l00173"></a>00173 my_body = NULL;
-<a name="l00174"></a>00174 }
-<a name="l00175"></a>00175
-<a name="l00176"></a>00176 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00177"></a><a class="code" href="a00308.html#e131c560057a58229992b61eb8dba4c6">00177</a> <span class="keywordtype">void</span> <a class="code" href="a00308.html">parallel_while<Body>::add</a>( <span class="keyword">const</span> value_type& item ) {
-<a name="l00178"></a>00178 __TBB_ASSERT(my_barrier,<span class="stringliteral">"attempt to add to parallel_while that is not running"</span>);
-<a name="l00179"></a>00179 <span class="keyword">typedef</span> internal::while_iteration_task<Body> iteration_type;
-<a name="l00180"></a>00180 iteration_type& i = *<span class="keyword">new</span>( task::allocate_additional_child_of(*my_barrier) ) iteration_type(item,*my_body);
-<a name="l00181"></a>00181 <a class="code" href="a00337.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().spawn( i );
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 } <span class="comment">// namespace </span>
-<a name="l00185"></a>00185
-<a name="l00186"></a>00186 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_while */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00575.html b/doc/html/a00575.html
deleted file mode 100644
index 7b9bbe9..0000000
--- a/doc/html/a00575.html
+++ /dev/null
@@ -1,500 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>partitioner.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>partitioner.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_partitioner_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_partitioner_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#ifndef __TBB_INITIAL_CHUNKS</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_INITIAL_CHUNKS 2</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_RANGE_POOL_CAPACITY</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_RANGE_POOL_CAPACITY 8</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_INIT_DEPTH</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_INIT_DEPTH 5</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include "task.h"</span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warnings</span>
-<a name="l00040"></a>00040 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4244)</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span>
-<a name="l00044"></a>00044 <span class="keyword">namespace </span>tbb {
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <span class="keyword">class </span>auto_partitioner;
-<a name="l00047"></a>00047 <span class="keyword">class </span>simple_partitioner;
-<a name="l00048"></a>00048 <span class="keyword">class </span>affinity_partitioner;
-<a name="l00049"></a>00049 <span class="keyword">namespace </span>interface6 {
-<a name="l00050"></a>00050 <span class="keyword">namespace </span>internal {
-<a name="l00051"></a>00051 <span class="keyword">class </span>affinity_partition_type;
-<a name="l00052"></a>00052 }
-<a name="l00053"></a>00053 }
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <span class="keyword">namespace </span>internal {
-<a name="l00056"></a>00056 size_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();
-<a name="l00057"></a>00057
-<a name="l00059"></a><a class="code" href="a00250.html">00059</a> <span class="keyword">class </span><a class="code" href="a00250.html">affinity_partitioner_base_v3</a>: no_copy {
-<a name="l00060"></a>00060 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00249.html">tbb::affinity_partitioner</a>;
-<a name="l00061"></a>00061 <span class="keyword">friend</span> <span class="keyword">class </span>tbb::interface6::internal::affinity_partition_type;
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 affinity_id* my_array;
-<a name="l00066"></a>00066 size_t my_size;
-<a name="l00068"></a>00068 <a class="code" href="a00250.html">affinity_partitioner_base_v3</a>() : my_array(NULL), my_size(0) {}
-<a name="l00070"></a>00070 ~<a class="code" href="a00250.html">affinity_partitioner_base_v3</a>() {resize(0);}
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD resize( <span class="keywordtype">unsigned</span> factor );
-<a name="l00074"></a>00074 };
-<a name="l00075"></a>00075
-<a name="l00077"></a><a class="code" href="a00309.html">00077</a> <span class="keyword">class </span><a class="code" href="a00309.html">partition_type_base</a> {
-<a name="l00078"></a>00078 <span class="keyword">public</span>:
-<a name="l00079"></a>00079 <span class="keywordtype">void</span> set_affinity( <a class="code" href="a00337.html">task</a> & ) {}
-<a name="l00080"></a>00080 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
-<a name="l00081"></a>00081 <a class="code" href="a00337.html">task</a>* continue_after_execute_range() {<span class="keywordflow">return</span> NULL;}
-<a name="l00082"></a>00082 <span class="keywordtype">bool</span> decide_whether_to_delay() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00083"></a>00083 <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span>, <a class="code" href="a00337.html">task</a>& b ) {
-<a name="l00084"></a>00084 task::spawn(b);
-<a name="l00085"></a>00085 }
-<a name="l00086"></a>00086 };
-<a name="l00087"></a>00087
-<a name="l00088"></a>00088 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_scan;
-<a name="l00089"></a>00089
-<a name="l00090"></a>00090 } <span class="comment">// namespace internal</span>
-<a name="l00092"></a>00092 <span class="comment"></span>
-<a name="l00093"></a>00093 <span class="keyword">namespace </span>serial {
-<a name="l00094"></a>00094 <span class="keyword">namespace </span>interface6 {
-<a name="l00095"></a>00095 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_for;
-<a name="l00096"></a>00096 }
-<a name="l00097"></a>00097 }
-<a name="l00098"></a>00098
-<a name="l00099"></a>00099 <span class="keyword">namespace </span>interface6 {
-<a name="l00101"></a>00101 <span class="keyword">namespace </span>internal {
-<a name="l00102"></a>00102 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00103"></a>00103 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_for;
-<a name="l00104"></a>00104 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_reduce;
-<a name="l00105"></a>00105
-<a name="l00107"></a>00107 <span class="keyword">class </span>flag_task: <span class="keyword">public</span> task {
-<a name="l00108"></a>00108 <span class="keyword">public</span>:
-<a name="l00109"></a>00109 <a class="code" href="a00254.html">tbb::atomic<bool></a> child_stolen;
-<a name="l00110"></a>00110 flag_task() { child_stolen = <span class="keyword">false</span>; }
-<a name="l00111"></a>00111 task* execute() { <span class="keywordflow">return</span> NULL; }
-<a name="l00112"></a>00112 };
-<a name="l00113"></a>00113
-<a name="l00115"></a>00115 <span class="keyword">class </span>signal_task: <span class="keyword">public</span> task {
-<a name="l00116"></a>00116 <span class="keyword">public</span>:
-<a name="l00117"></a>00117 task* execute() {
-<a name="l00118"></a>00118 <span class="keywordflow">if</span>( is_stolen_task() ) {
-<a name="l00119"></a>00119 static_cast<flag_task*>(parent())->child_stolen = <span class="keyword">true</span>;
-<a name="l00120"></a>00120 }
-<a name="l00121"></a>00121 <span class="keywordflow">return</span> NULL;
-<a name="l00122"></a>00122 }
-<a name="l00123"></a>00123 };
-<a name="l00124"></a>00124
-<a name="l00128"></a>00128 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> depth_t;
-<a name="l00129"></a>00129
-<a name="l00131"></a>00131 <span class="keyword">template</span> <<span class="keyword">typename</span> T, depth_t MaxCapacity>
-<a name="l00132"></a>00132 <span class="keyword">class </span>range_vector {
-<a name="l00133"></a>00133 depth_t my_head;
-<a name="l00134"></a>00134 depth_t my_tail;
-<a name="l00135"></a>00135 depth_t my_size;
-<a name="l00136"></a>00136 depth_t my_depth[MaxCapacity]; <span class="comment">// relative depths of stored ranges</span>
-<a name="l00137"></a>00137 <a class="code" href="a00253.html">tbb::aligned_space<T, MaxCapacity></a> my_pool;
-<a name="l00138"></a>00138
-<a name="l00139"></a>00139 <span class="keyword">public</span>:
-<a name="l00141"></a>00141 range_vector(<span class="keyword">const</span> T& elem) : my_head(0), my_tail(0), my_size(1) {
-<a name="l00142"></a>00142 my_depth[0] = 0;
-<a name="l00143"></a>00143 <span class="keyword">new</span>( my_pool.begin() ) T(elem);<span class="comment">//TODO: std::move?</span>
-<a name="l00144"></a>00144 }
-<a name="l00145"></a>00145 ~range_vector() {
-<a name="l00146"></a>00146 <span class="keywordflow">while</span>( !empty() ) pop_back();
-<a name="l00147"></a>00147 }
-<a name="l00148"></a>00148 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
-<a name="l00149"></a>00149 depth_t size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
-<a name="l00152"></a>00152 <span class="keywordtype">void</span> split_to_fill(depth_t max_depth) {
-<a name="l00153"></a>00153 <span class="keywordflow">while</span>( my_size < MaxCapacity && my_depth[my_head] < max_depth
-<a name="l00154"></a>00154 && my_pool.begin()[my_head].is_divisible() ) {
-<a name="l00155"></a>00155 depth_t prev = my_head;
-<a name="l00156"></a>00156 my_head = (my_head + 1) % MaxCapacity;
-<a name="l00157"></a>00157 <span class="keyword">new</span>(my_pool.begin()+my_head) T(my_pool.begin()[prev]); <span class="comment">// copy TODO: std::move?</span>
-<a name="l00158"></a>00158 my_pool.begin()[prev].~T(); <span class="comment">// instead of assignment</span>
-<a name="l00159"></a>00159 <span class="keyword">new</span>(my_pool.begin()+prev) T(my_pool.begin()[my_head], split()); <span class="comment">// do 'inverse' split</span>
-<a name="l00160"></a>00160 my_depth[my_head] = ++my_depth[prev];
-<a name="l00161"></a>00161 my_size++;
-<a name="l00162"></a>00162 }
-<a name="l00163"></a>00163 }
-<a name="l00164"></a>00164 <span class="keywordtype">void</span> pop_back() {
-<a name="l00165"></a>00165 __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::pop_back() with empty size"</span>);
-<a name="l00166"></a>00166 my_pool.begin()[my_head].~T();
-<a name="l00167"></a>00167 my_size--;
-<a name="l00168"></a>00168 my_head = (my_head + MaxCapacity - 1) % MaxCapacity;
-<a name="l00169"></a>00169 }
-<a name="l00170"></a>00170 <span class="keywordtype">void</span> pop_front() {
-<a name="l00171"></a>00171 __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::pop_front() with empty size"</span>);
-<a name="l00172"></a>00172 my_pool.begin()[my_tail].~T();
-<a name="l00173"></a>00173 my_size--;
-<a name="l00174"></a>00174 my_tail = (my_tail + 1) % MaxCapacity;
-<a name="l00175"></a>00175 }
-<a name="l00176"></a>00176 T& back() {
-<a name="l00177"></a>00177 __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::back() with empty size"</span>);
-<a name="l00178"></a>00178 <span class="keywordflow">return</span> my_pool.begin()[my_head];
-<a name="l00179"></a>00179 }
-<a name="l00180"></a>00180 T& front() {
-<a name="l00181"></a>00181 __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::front() with empty size"</span>);
-<a name="l00182"></a>00182 <span class="keywordflow">return</span> my_pool.begin()[my_tail];
-<a name="l00183"></a>00183 }
-<a name="l00185"></a>00185 depth_t front_depth() {
-<a name="l00186"></a>00186 __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::front_depth() with empty size"</span>);
-<a name="l00187"></a>00187 <span class="keywordflow">return</span> my_depth[my_tail];
-<a name="l00188"></a>00188 }
-<a name="l00189"></a>00189 };
-<a name="l00190"></a>00190
-<a name="l00192"></a>00192 <span class="keyword">template</span> <<span class="keyword">typename</span> Partition>
-<a name="l00193"></a>00193 <span class="keyword">struct </span>partition_type_base {
-<a name="l00194"></a>00194 <span class="comment">// decision makers</span>
-<a name="l00195"></a>00195 <span class="keywordtype">void</span> set_affinity( task & ) {}
-<a name="l00196"></a>00196 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
-<a name="l00197"></a>00197 <span class="keywordtype">bool</span> check_being_stolen(task &) { <span class="keywordflow">return</span> <span class="keyword">false</span>; } <span class="comment">// part of old should_execute_range()</span>
-<a name="l00198"></a>00198 <span class="keywordtype">bool</span> check_for_demand(task &) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00199"></a>00199 <span class="keywordtype">bool</span> divisions_left() { <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="comment">// part of old should_execute_range()</span>
-<a name="l00200"></a>00200 <span class="keywordtype">bool</span> should_create_trap() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00201"></a>00201 depth_t max_depth() { <span class="keywordflow">return</span> 0; }
-<a name="l00202"></a>00202 <span class="keywordtype">void</span> align_depth(depth_t) { }
-<a name="l00203"></a>00203 <span class="comment">// common function blocks</span>
-<a name="l00204"></a>00204 Partition& derived() { <span class="keywordflow">return</span> *static_cast<Partition*>(<span class="keyword">this</span>); }
-<a name="l00205"></a>00205 <span class="keyword">template</span><<span class="keyword">typename</span> StartType>
-<a name="l00206"></a>00206 flag_task* split_work(StartType &start) {
-<a name="l00207"></a>00207 flag_task* parent_ptr = start.create_continuation(); <span class="comment">// the type here is to express expectation</span>
-<a name="l00208"></a>00208 start.set_parent(parent_ptr);
-<a name="l00209"></a>00209 parent_ptr->set_ref_count(2);
-<a name="l00210"></a>00210 StartType& right_work = *<span class="keyword">new</span>( parent_ptr->allocate_child() ) StartType(start, split());
-<a name="l00211"></a>00211 start.spawn(right_work);
-<a name="l00212"></a>00212 <span class="keywordflow">return</span> parent_ptr;
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214 <span class="keyword">template</span><<span class="keyword">typename</span> StartType, <span class="keyword">typename</span> Range>
-<a name="l00215"></a>00215 <span class="keywordtype">void</span> execute(StartType &start, Range &range) {
-<a name="l00216"></a>00216 <span class="comment">// The algorithm in a few words ([]-denotes calls to decision methods of partitioner):</span>
-<a name="l00217"></a>00217 <span class="comment">// [If this task is stolen, adjust depth and divisions if necessary, set flag].</span>
-<a name="l00218"></a>00218 <span class="comment">// If range is divisible {</span>
-<a name="l00219"></a>00219 <span class="comment">// Spread the work while [initial divisions left];</span>
-<a name="l00220"></a>00220 <span class="comment">// Create trap task [if necessary];</span>
-<a name="l00221"></a>00221 <span class="comment">// }</span>
-<a name="l00222"></a>00222 <span class="comment">// If not divisible or [max depth is reached], execute, else do the range pool part</span>
-<a name="l00223"></a>00223 task* parent_ptr = start.parent();
-<a name="l00224"></a>00224 <span class="keywordflow">if</span>( range.is_divisible() ) {
-<a name="l00225"></a>00225 <span class="keywordflow">if</span>( derived().divisions_left() )
-<a name="l00226"></a>00226 <span class="keywordflow">do</span> parent_ptr = split_work(start); <span class="comment">// split until divisions_left()</span>
-<a name="l00227"></a>00227 <span class="keywordflow">while</span>( range.is_divisible() && derived().divisions_left() );
-<a name="l00228"></a>00228 <span class="keywordflow">if</span>( derived().should_create_trap() ) { <span class="comment">// only for range pool</span>
-<a name="l00229"></a>00229 <span class="keywordflow">if</span>( parent_ptr->ref_count() > 1 ) { <span class="comment">// create new parent if necessary</span>
-<a name="l00230"></a>00230 parent_ptr = start.create_continuation();
-<a name="l00231"></a>00231 start.set_parent(parent_ptr);
-<a name="l00232"></a>00232 } <span class="keywordflow">else</span> __TBB_ASSERT(parent_ptr->ref_count() == 1, NULL);
-<a name="l00233"></a>00233 parent_ptr->set_ref_count(2); <span class="comment">// safe because parent has only one reference</span>
-<a name="l00234"></a>00234 signal_task& right_signal = *<span class="keyword">new</span>( parent_ptr->allocate_child() ) signal_task();
-<a name="l00235"></a>00235 start.spawn(right_signal); <span class="comment">// pure signal is to avoid deep recursion in the end</span>
-<a name="l00236"></a>00236 }
-<a name="l00237"></a>00237 }
-<a name="l00238"></a>00238 <span class="keywordflow">if</span>( !range.is_divisible() || !derived().max_depth() )
-<a name="l00239"></a>00239 start.run_body( range ); <span class="comment">// simple partitioner goes always here</span>
-<a name="l00240"></a>00240 <span class="keywordflow">else</span> { <span class="comment">// do range pool</span>
-<a name="l00241"></a>00241 internal::range_vector<Range, Partition::range_pool_size> range_pool(range);
-<a name="l00242"></a>00242 <span class="keywordflow">do</span> {
-<a name="l00243"></a>00243 range_pool.split_to_fill(derived().max_depth()); <span class="comment">// fill range pool</span>
-<a name="l00244"></a>00244 <span class="keywordflow">if</span>( derived().check_for_demand( start ) ) {
-<a name="l00245"></a>00245 <span class="keywordflow">if</span>( range_pool.size() > 1 ) {
-<a name="l00246"></a>00246 parent_ptr = start.create_continuation();
-<a name="l00247"></a>00247 start.set_parent(parent_ptr);
-<a name="l00248"></a>00248 parent_ptr->set_ref_count(2);
-<a name="l00249"></a>00249 StartType& right_work = *<span class="keyword">new</span>( parent_ptr->allocate_child() ) StartType(start, range_pool.front(), range_pool.front_depth());
-<a name="l00250"></a>00250 start.spawn(right_work);
-<a name="l00251"></a>00251 range_pool.pop_front();
-<a name="l00252"></a>00252 <span class="keywordflow">continue</span>;
-<a name="l00253"></a>00253 }
-<a name="l00254"></a>00254 <span class="keywordflow">if</span>( range_pool.back().is_divisible() ) <span class="comment">// was not enough depth to fork a task</span>
-<a name="l00255"></a>00255 <span class="keywordflow">continue</span>; <span class="comment">// note: check_for_demand() should guarantee increasing max_depth() next time</span>
-<a name="l00256"></a>00256 }
-<a name="l00257"></a>00257 start.run_body( range_pool.back() );
-<a name="l00258"></a>00258 range_pool.pop_back();
-<a name="l00259"></a>00259 } <span class="keywordflow">while</span>( !range_pool.empty() && !start.is_cancelled() );
-<a name="l00260"></a>00260 }
-<a name="l00261"></a>00261 }
-<a name="l00262"></a>00262 };
-<a name="l00263"></a>00263
-<a name="l00265"></a>00265 <span class="keyword">template</span> <<span class="keyword">typename</span> Partition>
-<a name="l00266"></a>00266 <span class="keyword">struct </span>auto_partition_type_base : partition_type_base<Partition> {
-<a name="l00267"></a>00267 size_t my_divisor;
-<a name="l00268"></a>00268 depth_t my_max_depth;
-<a name="l00269"></a>00269 auto_partition_type_base() : my_max_depth(__TBB_INIT_DEPTH) {
-<a name="l00270"></a>00270 my_divisor = tbb::internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4;
-<a name="l00271"></a>00271 __TBB_ASSERT(my_divisor, <span class="stringliteral">"initial value of get_initial_auto_partitioner_divisor() is not valid"</span>);
-<a name="l00272"></a>00272 }
-<a name="l00273"></a>00273 auto_partition_type_base(auto_partition_type_base &src, split) {
-<a name="l00274"></a>00274 my_max_depth = src.my_max_depth;
-<a name="l00275"></a>00275 <span class="preprocessor">#if __TBB_INITIAL_TASK_IMBALANCE</span>
-<a name="l00276"></a>00276 <span class="preprocessor"></span> <span class="keywordflow">if</span>( src.my_divisor <= 1 ) my_divisor = 0;
-<a name="l00277"></a>00277 <span class="keywordflow">else</span> my_divisor = src.my_divisor = (src.my_divisor+1u) / 2u;
-<a name="l00278"></a>00278 <span class="preprocessor">#else</span>
-<a name="l00279"></a>00279 <span class="preprocessor"></span> my_divisor = src.my_divisor / 2u;
-<a name="l00280"></a>00280 src.my_divisor = src.my_divisor - my_divisor; <span class="comment">// TODO: check the effect separately</span>
-<a name="l00281"></a>00281 <span class="keywordflow">if</span>(my_divisor) src.my_max_depth += static_cast<depth_t>(__TBB_Log2(src.my_divisor/my_divisor));
-<a name="l00282"></a>00282 <span class="preprocessor">#endif</span>
-<a name="l00283"></a>00283 <span class="preprocessor"></span> }
-<a name="l00284"></a>00284 <span class="keywordtype">bool</span> check_being_stolen( task &t) { <span class="comment">// part of old should_execute_range()</span>
-<a name="l00285"></a>00285 <span class="keywordflow">if</span>( !my_divisor ) {
-<a name="l00286"></a>00286 my_divisor = 1; <span class="comment">// todo: replace by on-stack flag (partition_state's member)?</span>
-<a name="l00287"></a>00287 <span class="keywordflow">if</span>( t.is_stolen_task() ) {
-<a name="l00288"></a>00288 #<span class="keywordflow">if</span> TBB_USE_EXCEPTIONS
-<a name="l00289"></a>00289 <span class="comment">// RTTI is available, check whether the cast is valid</span>
-<a name="l00290"></a>00290 __TBB_ASSERT(dynamic_cast<flag_task*>(t.parent()), 0);
-<a name="l00291"></a>00291 <span class="comment">// correctness of the cast relies on avoiding the root task for which:</span>
-<a name="l00292"></a>00292 <span class="comment">// - initial value of my_divisor != 0 (protected by separate assertion)</span>
-<a name="l00293"></a>00293 <span class="comment">// - is_stolen_task() always return false for the root task.</span>
-<a name="l00294"></a>00294 <span class="preprocessor">#endif</span>
-<a name="l00295"></a>00295 <span class="preprocessor"></span> static_cast<flag_task*>(t.parent())->child_stolen = <span class="keyword">true</span>;
-<a name="l00296"></a>00296 my_max_depth++;
-<a name="l00297"></a>00297 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299 }
-<a name="l00300"></a>00300 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00301"></a>00301 }
-<a name="l00302"></a>00302 <span class="keywordtype">bool</span> divisions_left() { <span class="comment">// part of old should_execute_range()</span>
-<a name="l00303"></a>00303 <span class="keywordflow">if</span>( my_divisor > 1 ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00304"></a>00304 <span class="keywordflow">if</span>( my_divisor && my_max_depth > 1 ) { <span class="comment">// can split the task and once more internally. TODO: on-stack flag instead</span>
-<a name="l00305"></a>00305 <span class="comment">// keep same fragmentation while splitting for the local task pool</span>
-<a name="l00306"></a>00306 my_max_depth--;
-<a name="l00307"></a>00307 my_divisor = 0;
-<a name="l00308"></a>00308 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00309"></a>00309 } <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311 <span class="keywordtype">bool</span> should_create_trap() {
-<a name="l00312"></a>00312 <span class="keywordflow">return</span> my_divisor > 0;
-<a name="l00313"></a>00313 }
-<a name="l00314"></a>00314 <span class="keywordtype">bool</span> check_for_demand(task &t) {
-<a name="l00315"></a>00315 <span class="keywordflow">if</span>( static_cast<flag_task*>(t.parent())->child_stolen ) {
-<a name="l00316"></a>00316 my_max_depth++;
-<a name="l00317"></a>00317 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00318"></a>00318 } <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00319"></a>00319 }
-<a name="l00320"></a>00320 <span class="keywordtype">void</span> align_depth(depth_t base) {
-<a name="l00321"></a>00321 __TBB_ASSERT(base <= my_max_depth, 0);
-<a name="l00322"></a>00322 my_max_depth -= base;
-<a name="l00323"></a>00323 }
-<a name="l00324"></a>00324 depth_t max_depth() { <span class="keywordflow">return</span> my_max_depth; }
-<a name="l00325"></a>00325 };
-<a name="l00326"></a>00326
-<a name="l00328"></a>00328 <span class="keyword">class </span>affinity_partition_type : <span class="keyword">public</span> auto_partition_type_base<affinity_partition_type> {
-<a name="l00329"></a>00329 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> factor_power = 4;
-<a name="l00330"></a>00330 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> factor = 1<<factor_power;
-<a name="l00331"></a>00331 <span class="keywordtype">bool</span> my_delay;
-<a name="l00332"></a>00332 <span class="keywordtype">unsigned</span> map_begin, map_end, map_mid;
-<a name="l00333"></a>00333 tbb::internal::affinity_id* my_array;
-<a name="l00334"></a>00334 <span class="keywordtype">void</span> set_mid() {
-<a name="l00335"></a>00335 <span class="keywordtype">unsigned</span> d = (map_end - map_begin)/2; <span class="comment">// we could add 1 but it is rather for LIFO affinity</span>
-<a name="l00336"></a>00336 <span class="keywordflow">if</span>( d > factor )
-<a name="l00337"></a>00337 d &= 0u-factor;
-<a name="l00338"></a>00338 map_mid = map_end - d;
-<a name="l00339"></a>00339 }
-<a name="l00340"></a>00340 <span class="keyword">public</span>:
-<a name="l00341"></a>00341 affinity_partition_type( <a class="code" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a>& ap ) {
-<a name="l00342"></a>00342 __TBB_ASSERT( (factor&(factor-1))==0, <span class="stringliteral">"factor must be power of two"</span> );
-<a name="l00343"></a>00343 ap.<a class="code" href="a00250.html#d9122ca5725982c602da44dae0acc603">resize</a>(factor);
-<a name="l00344"></a>00344 my_array = ap.<a class="code" href="a00250.html#8681a00f14b6ad375d63b104c24bef17">my_array</a>;
-<a name="l00345"></a>00345 map_begin = 0;
-<a name="l00346"></a>00346 map_end = unsigned(ap.<a class="code" href="a00250.html#8562953693788ae691865453b1ff3a5d">my_size</a>);
-<a name="l00347"></a>00347 set_mid();
-<a name="l00348"></a>00348 my_delay = <span class="keyword">true</span>;
-<a name="l00349"></a>00349 my_divisor /= __TBB_INITIAL_CHUNKS; <span class="comment">// let exactly P tasks to be distributed across workers</span>
-<a name="l00350"></a>00350 my_max_depth = factor_power+1; <span class="comment">// the first factor_power ranges will be spawned, and >=1 ranges should be left</span>
-<a name="l00351"></a>00351 __TBB_ASSERT( my_max_depth < __TBB_RANGE_POOL_CAPACITY, 0 );
-<a name="l00352"></a>00352 }
-<a name="l00353"></a>00353 affinity_partition_type(affinity_partition_type& p, split)
-<a name="l00354"></a>00354 : auto_partition_type_base<affinity_partition_type>(p, split()), my_array(p.my_array) {
-<a name="l00355"></a>00355 __TBB_ASSERT( p.map_end-p.map_begin<factor || (p.map_end-p.map_begin)%factor==0, NULL );
-<a name="l00356"></a>00356 map_end = p.map_end;
-<a name="l00357"></a>00357 map_begin = p.map_end = p.map_mid;
-<a name="l00358"></a>00358 set_mid(); p.set_mid();
-<a name="l00359"></a>00359 my_delay = p.my_delay;
-<a name="l00360"></a>00360 }
-<a name="l00361"></a>00361 <span class="keywordtype">void</span> set_affinity( task &t ) {
-<a name="l00362"></a>00362 <span class="keywordflow">if</span>( map_begin<map_end )
-<a name="l00363"></a>00363 t.set_affinity( my_array[map_begin] );
-<a name="l00364"></a>00364 }
-<a name="l00365"></a>00365 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> <span class="keywordtype">id</span> ) {
-<a name="l00366"></a>00366 <span class="keywordflow">if</span>( map_begin<map_end )
-<a name="l00367"></a>00367 my_array[map_begin] = id;
-<a name="l00368"></a>00368 }
-<a name="l00369"></a>00369 <span class="keywordtype">bool</span> check_for_demand( task &t ) {
-<a name="l00370"></a>00370 <span class="keywordflow">if</span>( !my_delay ) {
-<a name="l00371"></a>00371 <span class="keywordflow">if</span>( map_mid<map_end ) {
-<a name="l00372"></a>00372 __TBB_ASSERT(my_max_depth>__TBB_Log2(map_end-map_mid), 0);
-<a name="l00373"></a>00373 <span class="keywordflow">return</span> <span class="keyword">true</span>;<span class="comment">// do not do my_max_depth++ here, but be sure my_max_depth is big enough</span>
-<a name="l00374"></a>00374 }
-<a name="l00375"></a>00375 <span class="keywordflow">if</span>( static_cast<flag_task*>(t.parent())->child_stolen ) {
-<a name="l00376"></a>00376 my_max_depth++;
-<a name="l00377"></a>00377 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00378"></a>00378 }
-<a name="l00379"></a>00379 } <span class="keywordflow">else</span> my_delay = <span class="keyword">false</span>;
-<a name="l00380"></a>00380 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00381"></a>00381 }
-<a name="l00382"></a>00382 <span class="keywordtype">bool</span> divisions_left() { <span class="comment">// part of old should_execute_range()</span>
-<a name="l00383"></a>00383 <span class="keywordflow">return</span> my_divisor > 1;
-<a name="l00384"></a>00384 }
-<a name="l00385"></a>00385 <span class="keywordtype">bool</span> should_create_trap() {
-<a name="l00386"></a>00386 <span class="keywordflow">return</span> <span class="keyword">true</span>; <span class="comment">// TODO: rethink for the stage after memorizing level</span>
-<a name="l00387"></a>00387 }
-<a name="l00388"></a>00388 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> range_pool_size = __TBB_RANGE_POOL_CAPACITY;
-<a name="l00389"></a>00389 };
-<a name="l00390"></a>00390
-<a name="l00391"></a>00391 <span class="keyword">class </span>auto_partition_type: <span class="keyword">public</span> auto_partition_type_base<auto_partition_type> {
-<a name="l00392"></a>00392 <span class="keyword">public</span>:
-<a name="l00393"></a>00393 auto_partition_type( <span class="keyword">const</span> auto_partitioner& ) {}
-<a name="l00394"></a>00394 auto_partition_type( auto_partition_type& src, split)
-<a name="l00395"></a>00395 : auto_partition_type_base<auto_partition_type>(src, split()) {}
-<a name="l00396"></a>00396 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> range_pool_size = __TBB_RANGE_POOL_CAPACITY;
-<a name="l00397"></a>00397 };
-<a name="l00398"></a>00398
-<a name="l00399"></a>00399 <span class="keyword">class </span>simple_partition_type: <span class="keyword">public</span> partition_type_base<simple_partition_type> {
-<a name="l00400"></a>00400 <span class="keyword">public</span>:
-<a name="l00401"></a>00401 simple_partition_type( <span class="keyword">const</span> simple_partitioner& ) {}
-<a name="l00402"></a>00402 simple_partition_type( <span class="keyword">const</span> simple_partition_type&, split ) {}
-<a name="l00404"></a>00404 <span class="keyword">template</span><<span class="keyword">typename</span> StartType, <span class="keyword">typename</span> Range>
-<a name="l00405"></a>00405 <span class="keywordtype">void</span> execute(StartType &start, Range &range) {
-<a name="l00406"></a>00406 <span class="keywordflow">while</span>( range.is_divisible() )
-<a name="l00407"></a>00407 split_work( start );
-<a name="l00408"></a>00408 start.run_body( range );
-<a name="l00409"></a>00409 }
-<a name="l00410"></a>00410 <span class="comment">//static const unsigned range_pool_size = 1; - not necessary because execute() is overridden</span>
-<a name="l00411"></a>00411 };
-<a name="l00412"></a>00412
-<a name="l00414"></a>00414 <span class="keyword">class </span>old_auto_partition_type: <span class="keyword">public</span> tbb::internal::partition_type_base {
-<a name="l00415"></a>00415 size_t num_chunks;
-<a name="l00416"></a>00416 <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
-<a name="l00417"></a>00417 <span class="keyword">public</span>:
-<a name="l00418"></a>00418 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> task &t) {
-<a name="l00419"></a>00419 <span class="keywordflow">if</span>( num_chunks<VICTIM_CHUNKS && t.is_stolen_task() )
-<a name="l00420"></a>00420 num_chunks = VICTIM_CHUNKS;
-<a name="l00421"></a>00421 <span class="keywordflow">return</span> num_chunks==1;
-<a name="l00422"></a>00422 }
-<a name="l00423"></a>00423 old_auto_partition_type( <span class="keyword">const</span> auto_partitioner& )
-<a name="l00424"></a>00424 : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}
-<a name="l00425"></a>00425 old_auto_partition_type( <span class="keyword">const</span> affinity_partitioner& )
-<a name="l00426"></a>00426 : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}
-<a name="l00427"></a>00427 old_auto_partition_type( old_auto_partition_type& pt, split ) {
-<a name="l00428"></a>00428 num_chunks = pt.num_chunks = (pt.num_chunks+1u) / 2u;
-<a name="l00429"></a>00429 }
-<a name="l00430"></a>00430 };
-<a name="l00431"></a>00431
-<a name="l00432"></a>00432 } <span class="comment">// namespace interfaceX::internal</span>
-<a name="l00434"></a>00434 <span class="comment"></span>} <span class="comment">// namespace interfaceX</span>
-<a name="l00435"></a>00435
-<a name="l00437"></a>00437
-<a name="l00439"></a><a class="code" href="a00329.html">00439</a> <span class="keyword">class </span><a class="code" href="a00329.html">simple_partitioner</a> {
-<a name="l00440"></a>00440 <span class="keyword">public</span>:
-<a name="l00441"></a>00441 <a class="code" href="a00329.html">simple_partitioner</a>() {}
-<a name="l00442"></a>00442 <span class="keyword">private</span>:
-<a name="l00443"></a>00443 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>serial::interface6::start_for;
-<a name="l00444"></a>00444 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_for;
-<a name="l00445"></a>00445 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_reduce;
-<a name="l00446"></a>00446 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00447"></a>00447 <span class="comment">// backward compatibility</span>
-<a name="l00448"></a>00448 <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
-<a name="l00449"></a>00449 <span class="keyword">public</span>:
-<a name="l00450"></a>00450 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00337.html">task</a>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00451"></a>00451 partition_type( <span class="keyword">const</span> <a class="code" href="a00329.html">simple_partitioner</a>& ) {}
-<a name="l00452"></a>00452 partition_type( <span class="keyword">const</span> partition_type&, <a class="code" href="a00335.html">split</a> ) {}
-<a name="l00453"></a>00453 };
-<a name="l00454"></a>00454 <span class="comment">// new implementation just extends existing interface</span>
-<a name="l00455"></a>00455 <span class="keyword">typedef</span> interface6::internal::simple_partition_type task_partition_type;
-<a name="l00456"></a>00456 };
-<a name="l00457"></a>00457
-<a name="l00459"></a>00459
-<a name="l00462"></a><a class="code" href="a00257.html">00462</a> <span class="keyword">class </span><a class="code" href="a00257.html">auto_partitioner</a> {
-<a name="l00463"></a>00463 <span class="keyword">public</span>:
-<a name="l00464"></a>00464 <a class="code" href="a00257.html">auto_partitioner</a>() {}
-<a name="l00465"></a>00465
-<a name="l00466"></a>00466 <span class="keyword">private</span>:
-<a name="l00467"></a>00467 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>serial::interface6::start_for;
-<a name="l00468"></a>00468 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_for;
-<a name="l00469"></a>00469 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_reduce;
-<a name="l00470"></a>00470 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00471"></a>00471 <span class="comment">// backward compatibility</span>
-<a name="l00472"></a>00472 <span class="keyword">typedef</span> interface6::internal::old_auto_partition_type partition_type;
-<a name="l00473"></a>00473 <span class="comment">// new implementation just extends existing interface</span>
-<a name="l00474"></a>00474 <span class="keyword">typedef</span> interface6::internal::auto_partition_type task_partition_type;
-<a name="l00475"></a>00475 };
-<a name="l00476"></a>00476
-<a name="l00478"></a><a class="code" href="a00249.html">00478</a> <span class="keyword">class </span><a class="code" href="a00249.html">affinity_partitioner</a>: internal::affinity_partitioner_base_v3 {
-<a name="l00479"></a>00479 <span class="keyword">public</span>:
-<a name="l00480"></a>00480 <a class="code" href="a00249.html">affinity_partitioner</a>() {}
-<a name="l00481"></a>00481
-<a name="l00482"></a>00482 <span class="keyword">private</span>:
-<a name="l00483"></a>00483 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>serial::interface6::start_for;
-<a name="l00484"></a>00484 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_for;
-<a name="l00485"></a>00485 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_reduce;
-<a name="l00486"></a>00486 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00487"></a>00487 <span class="comment">// backward compatibility - for parallel_scan only</span>
-<a name="l00488"></a>00488 <span class="keyword">typedef</span> interface6::internal::old_auto_partition_type partition_type;
-<a name="l00489"></a>00489 <span class="comment">// new implementation just extends existing interface</span>
-<a name="l00490"></a>00490 <span class="keyword">typedef</span> interface6::internal::affinity_partition_type task_partition_type;
-<a name="l00491"></a>00491 };
-<a name="l00492"></a>00492
-<a name="l00493"></a>00493 } <span class="comment">// namespace tbb</span>
-<a name="l00494"></a>00494
-<a name="l00495"></a>00495 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4244 is back</span>
-<a name="l00498"></a>00498 <span class="preprocessor"></span><span class="preprocessor">#undef __TBB_INITIAL_CHUNKS</span>
-<a name="l00499"></a>00499 <span class="preprocessor"></span><span class="preprocessor">#undef __TBB_RANGE_POOL_CAPACITY</span>
-<a name="l00500"></a>00500 <span class="preprocessor"></span><span class="preprocessor">#undef __TBB_INIT_DEPTH</span>
-<a name="l00501"></a>00501 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_partitioner_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00587.html b/doc/html/a00587.html
deleted file mode 100644
index afc137a..0000000
--- a/doc/html/a00587.html
+++ /dev/null
@@ -1,612 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>pipeline.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>pipeline.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_pipeline_H </span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_pipeline_H </span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "task.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include <cstddef></span>
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="preprocessor">#if !TBB_IMPLEMENT_CPP0X</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#include <type_traits></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#endif</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span>
-<a name="l00033"></a>00033 <span class="keyword">namespace </span>tbb {
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keyword">class </span>pipeline;
-<a name="l00036"></a>00036 <span class="keyword">class </span>filter;
-<a name="l00037"></a>00037
-<a name="l00039"></a>00039 <span class="keyword">namespace </span>internal {
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="comment">// The argument for PIPELINE_VERSION should be an integer between 2 and 9</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#define __TBB_PIPELINE_VERSION(x) (unsigned char)(x-2)<<1</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span>
-<a name="l00044"></a>00044 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Token;
-<a name="l00045"></a>00045 <span class="keyword">typedef</span> <span class="keywordtype">long</span> tokendiff_t;
-<a name="l00046"></a>00046 <span class="keyword">class </span>stage_task;
-<a name="l00047"></a>00047 <span class="keyword">class </span>input_buffer;
-<a name="l00048"></a>00048 <span class="keyword">class </span>pipeline_root_task;
-<a name="l00049"></a>00049 <span class="keyword">class </span>pipeline_cleaner;
-<a name="l00050"></a>00050
-<a name="l00051"></a>00051 } <span class="comment">// namespace internal</span>
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 <span class="keyword">namespace </span>interface6 {
-<a name="l00054"></a>00054 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U> <span class="keyword">class </span>filter_t;
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keyword">namespace </span>internal {
-<a name="l00057"></a>00057 <span class="keyword">class </span>pipeline_proxy;
-<a name="l00058"></a>00058 }
-<a name="l00059"></a>00059 }
-<a name="l00060"></a>00060
-<a name="l00062"></a>00062
-<a name="l00064"></a>00064
-<a name="l00065"></a><a class="code" href="a00282.html">00065</a> <span class="keyword">class </span><a class="code" href="a00282.html">filter</a>: internal::no_copy {
-<a name="l00066"></a>00066 <span class="keyword">private</span>:
-<a name="l00068"></a>00068 <span class="keyword">static</span> <a class="code" href="a00282.html">filter</a>* not_in_pipeline() {<span class="keywordflow">return</span> reinterpret_cast<filter*>(intptr_t(-1));}
-<a name="l00069"></a>00069 <span class="keyword">protected</span>:
-<a name="l00071"></a><a class="code" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">00071</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> = 0x1;
-<a name="l00072"></a>00072
-<a name="l00074"></a>00074
-<a name="l00076"></a><a class="code" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">00076</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a> = 0x1<<4;
-<a name="l00077"></a>00077
-<a name="l00079"></a><a class="code" href="a00282.html#dd6a6e7210efc9bcaf2c5e08767d92b5">00079</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00282.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> = 0x1<<5;
-<a name="l00080"></a>00080
-<a name="l00082"></a><a class="code" href="a00282.html#bdd02a434a6e7499dd1e8f43aae96793">00082</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00282.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> = 0x1<<6;
-<a name="l00083"></a>00083
-<a name="l00085"></a><a class="code" href="a00282.html#f17200974c33be21f42a5f00893de028">00085</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00282.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a> =
-<a name="l00086"></a>00086 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00087"></a>00087 <span class="preprocessor"></span> 0x0;
-<a name="l00088"></a>00088 <span class="preprocessor">#else</span>
-<a name="l00089"></a>00089 <span class="preprocessor"></span> 0x1<<7;
-<a name="l00090"></a>00090 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00091"></a>00091
-<a name="l00092"></a>00092 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> current_version = __TBB_PIPELINE_VERSION(5);
-<a name="l00093"></a>00093 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> version_mask = 0x7<<1; <span class="comment">// bits 1-3 are for version</span>
-<a name="l00094"></a>00094 <span class="keyword">public</span>:
-<a name="l00095"></a>00095 <span class="keyword">enum</span> mode {
-<a name="l00097"></a>00097 parallel = current_version | <a class="code" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>,
-<a name="l00099"></a>00099 serial_in_order = current_version | <a class="code" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>,
-<a name="l00101"></a>00101 serial_out_of_order = current_version | <a class="code" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> | <a class="code" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>,
-<a name="l00103"></a>00103 serial = serial_in_order
-<a name="l00104"></a>00104 };
-<a name="l00105"></a>00105 <span class="keyword">protected</span>:
-<a name="l00106"></a>00106 <a class="code" href="a00282.html">filter</a>( <span class="keywordtype">bool</span> is_serial_ ) :
-<a name="l00107"></a>00107 next_filter_in_pipeline(not_in_pipeline()),
-<a name="l00108"></a>00108 my_input_buffer(NULL),
-<a name="l00109"></a>00109 my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | <a class="code" href="a00282.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
-<a name="l00110"></a>00110 prev_filter_in_pipeline(not_in_pipeline()),
-<a name="l00111"></a>00111 my_pipeline(NULL),
-<a name="l00112"></a>00112 next_segment(NULL)
-<a name="l00113"></a>00113 {}
-<a name="l00114"></a>00114
-<a name="l00115"></a>00115 filter( mode filter_mode ) :
-<a name="l00116"></a>00116 next_filter_in_pipeline(not_in_pipeline()),
-<a name="l00117"></a>00117 my_input_buffer(NULL),
-<a name="l00118"></a>00118 my_filter_mode(static_cast<unsigned char>(filter_mode | <a class="code" href="a00282.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
-<a name="l00119"></a>00119 prev_filter_in_pipeline(not_in_pipeline()),
-<a name="l00120"></a>00120 my_pipeline(NULL),
-<a name="l00121"></a>00121 next_segment(NULL)
-<a name="l00122"></a>00122 {}
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <span class="comment">// signal end-of-input for concrete_filters</span>
-<a name="l00125"></a>00125 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set_end_of_input();
-<a name="l00126"></a>00126
-<a name="l00127"></a>00127 <span class="keyword">public</span>:
-<a name="l00129"></a><a class="code" href="a00282.html#fcfec27656a69ff2072802ac001e936f">00129</a> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>()<span class="keyword"> const </span>{
-<a name="l00130"></a>00130 <span class="keywordflow">return</span> bool( my_filter_mode & <a class="code" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> );
-<a name="l00131"></a>00131 }
-<a name="l00132"></a>00132
-<a name="l00134"></a><a class="code" href="a00282.html#cd53206c4795ef2df5df26b795caf692">00134</a> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>()<span class="keyword"> const </span>{
-<a name="l00135"></a>00135 <span class="keywordflow">return</span> (my_filter_mode & (<a class="code" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>|<a class="code" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>))==<a class="code" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>;
-<a name="l00136"></a>00136 }
-<a name="l00137"></a>00137
-<a name="l00139"></a><a class="code" href="a00282.html#15c29cae5d237e6d63dbfe5c94af89d5">00139</a> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>()<span class="keyword"> const </span>{
-<a name="l00140"></a>00140 <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00282.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> )==filter_is_bound;
-<a name="l00141"></a>00141 }
-<a name="l00142"></a>00142
-<a name="l00144"></a><a class="code" href="a00282.html#8ec4dfe053e94a2349d56781ddea8477">00144</a> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>() {
-<a name="l00145"></a>00145 <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00282.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> ) == filter_may_emit_null;
-<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147
-<a name="l00149"></a>00149
-<a name="l00150"></a>00150 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* <a class="code" href="a00282.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>( <span class="keywordtype">void</span>* item ) = 0;
-<a name="l00151"></a>00151
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00282.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>();
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00158"></a>00158 <span class="preprocessor"></span>
-<a name="l00160"></a><a class="code" href="a00282.html#56275eb889c77c4807967133e21401bd">00160</a> <span class="preprocessor"> virtual void finalize( void* </span><span class="comment">/*item*/</span> ) {};
-<a name="l00161"></a>00161 <span class="preprocessor">#endif</span>
-<a name="l00162"></a>00162 <span class="preprocessor"></span>
-<a name="l00163"></a>00163 <span class="keyword">private</span>:
-<a name="l00165"></a>00165 <a class="code" href="a00282.html">filter</a>* next_filter_in_pipeline;
-<a name="l00166"></a>00166
-<a name="l00168"></a>00168 <span class="comment">// (pipeline has not yet reached end_of_input or this filter has not yet</span>
-<a name="l00169"></a>00169 <span class="comment">// seen the last token produced by input_filter)</span>
-<a name="l00170"></a>00170 <span class="keywordtype">bool</span> has_more_work();
-<a name="l00171"></a>00171
-<a name="l00173"></a>00173
-<a name="l00174"></a>00174 internal::input_buffer* my_input_buffer;
-<a name="l00175"></a>00175
-<a name="l00176"></a>00176 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
-<a name="l00177"></a>00177 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00178"></a>00178 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00310.html">pipeline</a>;
-<a name="l00179"></a>00179 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00348.html">thread_bound_filter</a>;
-<a name="l00180"></a>00180
-<a name="l00182"></a>00182 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_filter_mode;
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185 <a class="code" href="a00282.html">filter</a>* prev_filter_in_pipeline;
-<a name="l00186"></a>00186
-<a name="l00188"></a>00188 <a class="code" href="a00310.html">pipeline</a>* my_pipeline;
-<a name="l00189"></a>00189
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 <a class="code" href="a00282.html">filter</a>* next_segment;
-<a name="l00193"></a>00193 };
-<a name="l00194"></a>00194
-<a name="l00196"></a>00196
-<a name="l00197"></a><a class="code" href="a00348.html">00197</a> <span class="keyword">class </span><a class="code" href="a00348.html">thread_bound_filter</a>: <span class="keyword">public</span> <a class="code" href="a00282.html">filter</a> {
-<a name="l00198"></a>00198 <span class="keyword">public</span>:
-<a name="l00199"></a>00199 <span class="keyword">enum</span> result_type {
-<a name="l00200"></a>00200 <span class="comment">// item was processed</span>
-<a name="l00201"></a>00201 success,
-<a name="l00202"></a>00202 <span class="comment">// item is currently not available</span>
-<a name="l00203"></a>00203 item_not_available,
-<a name="l00204"></a>00204 <span class="comment">// there are no more items to process</span>
-<a name="l00205"></a>00205 end_of_stream
-<a name="l00206"></a>00206 };
-<a name="l00207"></a>00207 <span class="keyword">protected</span>:
-<a name="l00208"></a>00208 <a class="code" href="a00348.html">thread_bound_filter</a>(mode filter_mode):
-<a name="l00209"></a>00209 <a class="code" href="a00282.html">filter</a>(static_cast<mode>(filter_mode | <a class="code" href="a00282.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter::filter_is_bound</a>))
-<a name="l00210"></a>00210 {}
-<a name="l00211"></a>00211 <span class="keyword">public</span>:
-<a name="l00213"></a>00213
-<a name="l00218"></a>00218 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00348.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>();
-<a name="l00219"></a>00219
-<a name="l00221"></a>00221
-<a name="l00225"></a>00225 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00348.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>();
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 <span class="keyword">private</span>:
-<a name="l00229"></a>00229 result_type internal_process_item(<span class="keywordtype">bool</span> is_blocking);
-<a name="l00230"></a>00230 };
-<a name="l00231"></a>00231
-<a name="l00233"></a>00233
-<a name="l00234"></a><a class="code" href="a00310.html">00234</a> <span class="keyword">class </span><a class="code" href="a00310.html">pipeline</a> {
-<a name="l00235"></a>00235 <span class="keyword">public</span>:
-<a name="l00237"></a>00237 __TBB_EXPORTED_METHOD <a class="code" href="a00310.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>();
-<a name="l00238"></a>00238
-<a name="l00241"></a>00241 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00310.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>();
-<a name="l00242"></a>00242
-<a name="l00244"></a>00244 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00310.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>( <a class="code" href="a00282.html">filter</a>& filter_ );
-<a name="l00245"></a>00245
-<a name="l00247"></a>00247 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00310.html#f627616049b3fe36801f37ee40403ef8">run</a>( size_t max_number_of_live_tokens );
-<a name="l00248"></a>00248
-<a name="l00249"></a>00249 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00251"></a>00251 <span class="preprocessor"> void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );</span>
-<a name="l00252"></a>00252 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00253"></a>00253 <span class="preprocessor"></span>
-<a name="l00255"></a>00255 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00310.html#2c84aef5b834b555ee220b176e25931e">clear</a>();
-<a name="l00256"></a>00256
-<a name="l00257"></a>00257 <span class="keyword">private</span>:
-<a name="l00258"></a>00258 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
-<a name="l00259"></a>00259 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00260"></a>00260 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00282.html">filter</a>;
-<a name="l00261"></a>00261 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00348.html">thread_bound_filter</a>;
-<a name="l00262"></a>00262 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_cleaner;
-<a name="l00263"></a>00263 <span class="keyword">friend</span> <span class="keyword">class </span>tbb::interface6::internal::pipeline_proxy;
-<a name="l00264"></a>00264
-<a name="l00266"></a>00266 <a class="code" href="a00282.html">filter</a>* filter_list;
-<a name="l00267"></a>00267
-<a name="l00269"></a>00269 <a class="code" href="a00282.html">filter</a>* filter_end;
-<a name="l00270"></a>00270
-<a name="l00272"></a>00272 <a class="code" href="a00337.html">task</a>* end_counter;
-<a name="l00273"></a>00273
-<a name="l00275"></a>00275 <a class="code" href="a00254.html">atomic<internal::Token></a> input_tokens;
-<a name="l00276"></a>00276
-<a name="l00278"></a>00278 <a class="code" href="a00254.html">atomic<internal::Token></a> token_counter;
-<a name="l00279"></a>00279
-<a name="l00281"></a>00281 <span class="keywordtype">bool</span> end_of_input;
-<a name="l00282"></a>00282
-<a name="l00284"></a>00284 <span class="keywordtype">bool</span> has_thread_bound_filters;
-<a name="l00285"></a>00285
-<a name="l00287"></a>00287 <span class="keywordtype">void</span> remove_filter( <a class="code" href="a00282.html">filter</a>& filter_ );
-<a name="l00288"></a>00288
-<a name="l00290"></a>00290 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD inject_token( <a class="code" href="a00337.html">task</a>& <span class="keyword">self</span> );
-<a name="l00291"></a>00291
-<a name="l00292"></a>00292 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00294"></a>00294 <span class="preprocessor"> void clear_filters();</span>
-<a name="l00295"></a>00295 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00296"></a>00296 <span class="preprocessor"></span>};
-<a name="l00297"></a>00297
-<a name="l00298"></a>00298 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00299"></a>00299 <span class="comment">// Support for lambda-friendly parallel_pipeline interface</span>
-<a name="l00300"></a>00300 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00301"></a>00301
-<a name="l00302"></a>00302 <span class="keyword">namespace </span>interface6 {
-<a name="l00303"></a>00303
-<a name="l00304"></a>00304 <span class="keyword">namespace </span>internal {
-<a name="l00305"></a>00305 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body> <span class="keyword">class </span>concrete_filter;
-<a name="l00306"></a>00306 }
-<a name="l00307"></a>00307
-<a name="l00309"></a><a class="code" href="a00285.html">00309</a> <span class="keyword">class </span><a class="code" href="a00285.html">flow_control</a> {
-<a name="l00310"></a>00310 <span class="keywordtype">bool</span> is_pipeline_stopped;
-<a name="l00311"></a>00311 <a class="code" href="a00285.html">flow_control</a>() { is_pipeline_stopped = <span class="keyword">false</span>; }
-<a name="l00312"></a>00312 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concrete_filter;
-<a name="l00313"></a>00313 <span class="keyword">public</span>:
-<a name="l00314"></a>00314 <span class="keywordtype">void</span> stop() { is_pipeline_stopped = <span class="keyword">true</span>; }
-<a name="l00315"></a>00315 };
-<a name="l00316"></a>00316
-<a name="l00318"></a>00318 <span class="keyword">namespace </span>internal {
-<a name="l00319"></a>00319
-<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_large_object {<span class="keyword">enum</span> { value = <span class="keyword">sizeof</span>(T) > <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *) }; };
-<a name="l00321"></a>00321
-<a name="l00322"></a>00322 <span class="preprocessor">#if TBB_IMPLEMENT_CPP0X</span>
-<a name="l00323"></a>00323 <span class="preprocessor"></span><span class="comment">// cannot use SFINAE in current compilers. Explicitly list the types we wish to be</span>
-<a name="l00324"></a>00324 <span class="comment">// placed as-is in the pipeline input_buffers.</span>
-<a name="l00325"></a>00325 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_trivially_copyable { <span class="keyword">enum</span> { value = <span class="keyword">false</span> }; };
-<a name="l00326"></a>00326 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_trivially_copyable <T*> { <span class="keyword">enum</span> { value = <span class="keyword">true</span> }; };
-<a name="l00327"></a>00327 <span class="keyword">template</span><> <span class="keyword">struct </span>tbb_trivially_copyable <short> { <span class="keyword">enum</span> { value = <span class="keyword">true</span> }; };
-<a name="l00328"></a>00328 <span class="keyword">template</span><> <span class="keyword">struct </span>tbb_trivially_copyable <unsigned short> { <span class="keyword">enum</span> { value = <span class="keyword">true</span> }; };
-<a name="l00329"></a>00329 <span class="keyword">template</span><> <span class="keyword">struct </span>tbb_trivially_copyable <int> { <span class="keyword">enum</span> { value = !tbb_large_object<int>::value }; };
-<a name="l00330"></a>00330 <span class="keyword">template</span><> <span class="keyword">struct </span>tbb_trivially_copyable <unsigned int> { <span class="keyword">enum</span> { value = !tbb_large_object<int>::value }; };
-<a name="l00331"></a>00331 <span class="keyword">template</span><> <span class="keyword">struct </span>tbb_trivially_copyable <long> { <span class="keyword">enum</span> { value = !tbb_large_object<long>::value }; };
-<a name="l00332"></a>00332 <span class="keyword">template</span><> <span class="keyword">struct </span>tbb_trivially_copyable <unsigned long> { <span class="keyword">enum</span> { value = !tbb_large_object<long>::value }; };
-<a name="l00333"></a>00333 <span class="keyword">template</span><> <span class="keyword">struct </span>tbb_trivially_copyable <float> { <span class="keyword">enum</span> { value = !tbb_large_object<float>::value }; };
-<a name="l00334"></a>00334 <span class="keyword">template</span><> <span class="keyword">struct </span>tbb_trivially_copyable <double> { <span class="keyword">enum</span> { value = !tbb_large_object<double>::value }; };
-<a name="l00335"></a>00335 <span class="preprocessor">#else</span>
-<a name="l00336"></a>00336 <span class="preprocessor"></span><span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__</span>
-<a name="l00337"></a>00337 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_trivially_copyable { <span class="keyword">enum</span> { value = std::has_trivial_copy_constructor<T>::value }; };
-<a name="l00338"></a>00338 <span class="preprocessor">#else</span>
-<a name="l00339"></a>00339 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_trivially_copyable { <span class="keyword">enum</span> { value = std::is_trivially_copyable<T>::value }; };
-<a name="l00340"></a>00340 <span class="preprocessor">#endif //</span>
-<a name="l00341"></a>00341 <span class="preprocessor"></span><span class="preprocessor">#endif // __TBB_USE_CPP0X</span>
-<a name="l00342"></a>00342 <span class="preprocessor"></span>
-<a name="l00343"></a>00343 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>is_large_object {<span class="keyword">enum</span> { value = tbb_large_object<T>::value || !tbb_trivially_copyable<T>::value }; };
-<a name="l00344"></a>00344
-<a name="l00345"></a>00345 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keywordtype">bool</span>> <span class="keyword">class </span>token_helper;
-<a name="l00346"></a>00346
-<a name="l00347"></a>00347 <span class="comment">// large object helper (uses tbb_allocator)</span>
-<a name="l00348"></a>00348 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00349"></a>00349 <span class="keyword">class </span>token_helper<T, true> {
-<a name="l00350"></a>00350 <span class="keyword">public</span>:
-<a name="l00351"></a>00351 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00343.html">tbb::tbb_allocator<T></a> allocator;
-<a name="l00352"></a>00352 <span class="keyword">typedef</span> T* pointer;
-<a name="l00353"></a>00353 <span class="keyword">typedef</span> T value_type;
-<a name="l00354"></a>00354 <span class="keyword">static</span> pointer create_token(<span class="keyword">const</span> value_type & source) {
-<a name="l00355"></a>00355 pointer output_t = allocator().allocate(1);
-<a name="l00356"></a>00356 <span class="keywordflow">return</span> <span class="keyword">new</span> (output_t) T(source);
-<a name="l00357"></a>00357 }
-<a name="l00358"></a>00358 <span class="keyword">static</span> value_type & token(pointer & t) { <span class="keywordflow">return</span> *t;}
-<a name="l00359"></a>00359 <span class="keyword">static</span> <span class="keywordtype">void</span> * cast_to_void_ptr(pointer ref) { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *) ref; }
-<a name="l00360"></a>00360 <span class="keyword">static</span> pointer cast_from_void_ptr(<span class="keywordtype">void</span> * ref) { <span class="keywordflow">return</span> (pointer)ref; }
-<a name="l00361"></a>00361 <span class="keyword">static</span> <span class="keywordtype">void</span> destroy_token(pointer token) {
-<a name="l00362"></a>00362 allocator().destroy(token);
-<a name="l00363"></a>00363 allocator().deallocate(token,1);
-<a name="l00364"></a>00364 }
-<a name="l00365"></a>00365 };
-<a name="l00366"></a>00366
-<a name="l00367"></a>00367 <span class="comment">// pointer specialization</span>
-<a name="l00368"></a>00368 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00369"></a>00369 <span class="keyword">class </span>token_helper<T*, <span class="keyword">false</span> > {
-<a name="l00370"></a>00370 <span class="keyword">public</span>:
-<a name="l00371"></a>00371 <span class="keyword">typedef</span> T* pointer;
-<a name="l00372"></a>00372 <span class="keyword">typedef</span> T* value_type;
-<a name="l00373"></a>00373 <span class="keyword">static</span> pointer create_token(<span class="keyword">const</span> value_type & source) { <span class="keywordflow">return</span> source; }
-<a name="l00374"></a>00374 <span class="keyword">static</span> value_type & token(pointer & t) { <span class="keywordflow">return</span> t;}
-<a name="l00375"></a>00375 <span class="keyword">static</span> <span class="keywordtype">void</span> * cast_to_void_ptr(pointer ref) { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)ref; }
-<a name="l00376"></a>00376 <span class="keyword">static</span> pointer cast_from_void_ptr(<span class="keywordtype">void</span> * ref) { <span class="keywordflow">return</span> (pointer)ref; }
-<a name="l00377"></a>00377 <span class="keyword">static</span> <span class="keywordtype">void</span> destroy_token( pointer <span class="comment">/*token*/</span>) {}
-<a name="l00378"></a>00378 };
-<a name="l00379"></a>00379
-<a name="l00380"></a>00380 <span class="comment">// small object specialization (converts void* to the correct type, passes objects directly.)</span>
-<a name="l00381"></a>00381 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00382"></a>00382 <span class="keyword">class </span>token_helper<T, false> {
-<a name="l00383"></a>00383 <span class="keyword">typedef</span> <span class="keyword">union </span>{
-<a name="l00384"></a>00384 T actual_value;
-<a name="l00385"></a>00385 <span class="keywordtype">void</span> * void_overlay;
-<a name="l00386"></a>00386 } type_to_void_ptr_map;
-<a name="l00387"></a>00387 <span class="keyword">public</span>:
-<a name="l00388"></a>00388 <span class="keyword">typedef</span> T pointer; <span class="comment">// not really a pointer in this case.</span>
-<a name="l00389"></a>00389 <span class="keyword">typedef</span> T value_type;
-<a name="l00390"></a>00390 <span class="keyword">static</span> pointer create_token(<span class="keyword">const</span> value_type & source) {
-<a name="l00391"></a>00391 <span class="keywordflow">return</span> source; }
-<a name="l00392"></a>00392 <span class="keyword">static</span> value_type & token(pointer & t) { <span class="keywordflow">return</span> t;}
-<a name="l00393"></a>00393 <span class="keyword">static</span> <span class="keywordtype">void</span> * cast_to_void_ptr(pointer ref) {
-<a name="l00394"></a>00394 type_to_void_ptr_map mymap;
-<a name="l00395"></a>00395 mymap.void_overlay = NULL;
-<a name="l00396"></a>00396 mymap.actual_value = ref;
-<a name="l00397"></a>00397 <span class="keywordflow">return</span> mymap.void_overlay;
-<a name="l00398"></a>00398 }
-<a name="l00399"></a>00399 <span class="keyword">static</span> pointer cast_from_void_ptr(<span class="keywordtype">void</span> * ref) {
-<a name="l00400"></a>00400 type_to_void_ptr_map mymap;
-<a name="l00401"></a>00401 mymap.void_overlay = ref;
-<a name="l00402"></a>00402 <span class="keywordflow">return</span> mymap.actual_value;
-<a name="l00403"></a>00403 }
-<a name="l00404"></a>00404 <span class="keyword">static</span> <span class="keywordtype">void</span> destroy_token( pointer <span class="comment">/*token*/</span>) {}
-<a name="l00405"></a>00405 };
-<a name="l00406"></a>00406
-<a name="l00407"></a>00407 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
-<a name="l00408"></a>00408 <span class="keyword">class </span>concrete_filter: <span class="keyword">public</span> tbb::filter {
-<a name="l00409"></a>00409 <span class="keyword">const</span> Body& my_body;
-<a name="l00410"></a>00410 <span class="keyword">typedef</span> token_helper<T,is_large_object<T>::value > t_helper;
-<a name="l00411"></a>00411 <span class="keyword">typedef</span> <span class="keyword">typename</span> t_helper::pointer t_pointer;
-<a name="l00412"></a>00412 <span class="keyword">typedef</span> token_helper<U,is_large_object<U>::value > u_helper;
-<a name="l00413"></a>00413 <span class="keyword">typedef</span> <span class="keyword">typename</span> u_helper::pointer u_pointer;
-<a name="l00414"></a>00414
-<a name="l00415"></a>00415 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>* input) {
-<a name="l00416"></a>00416 t_pointer temp_input = t_helper::cast_from_void_ptr(input);
-<a name="l00417"></a>00417 u_pointer output_u = u_helper::create_token(my_body(t_helper::token(temp_input)));
-<a name="l00418"></a>00418 t_helper::destroy_token(temp_input);
-<a name="l00419"></a>00419 <span class="keywordflow">return</span> u_helper::cast_to_void_ptr(output_u);
-<a name="l00420"></a>00420 }
-<a name="l00421"></a>00421
-<a name="l00422"></a>00422 <span class="keyword">public</span>:
-<a name="l00423"></a>00423 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
-<a name="l00424"></a>00424 };
-<a name="l00425"></a>00425
-<a name="l00426"></a>00426 <span class="comment">// input </span>
-<a name="l00427"></a>00427 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
-<a name="l00428"></a>00428 <span class="keyword">class </span>concrete_filter<void,U,Body>: <span class="keyword">public</span> filter {
-<a name="l00429"></a>00429 <span class="keyword">const</span> Body& my_body;
-<a name="l00430"></a>00430 <span class="keyword">typedef</span> token_helper<U, is_large_object<U>::value > u_helper;
-<a name="l00431"></a>00431 <span class="keyword">typedef</span> <span class="keyword">typename</span> u_helper::pointer u_pointer;
-<a name="l00432"></a>00432
-<a name="l00433"></a>00433 <span class="comment">/*override*/</span><span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>*) {
-<a name="l00434"></a>00434 flow_control control;
-<a name="l00435"></a>00435 u_pointer output_u = u_helper::create_token(my_body(control));
-<a name="l00436"></a>00436 <span class="keywordflow">if</span>(control.is_pipeline_stopped) {
-<a name="l00437"></a>00437 u_helper::destroy_token(output_u);
-<a name="l00438"></a>00438 set_end_of_input();
-<a name="l00439"></a>00439 <span class="keywordflow">return</span> NULL;
-<a name="l00440"></a>00440 }
-<a name="l00441"></a>00441 <span class="keywordflow">return</span> u_helper::cast_to_void_ptr(output_u);
-<a name="l00442"></a>00442 }
-<a name="l00443"></a>00443
-<a name="l00444"></a>00444 <span class="keyword">public</span>:
-<a name="l00445"></a>00445 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) :
-<a name="l00446"></a>00446 filter(static_cast<tbb::filter::mode>(filter_mode | filter_may_emit_null)),
-<a name="l00447"></a>00447 my_body(body)
-<a name="l00448"></a>00448 {}
-<a name="l00449"></a>00449 };
-<a name="l00450"></a>00450
-<a name="l00451"></a>00451 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Body>
-<a name="l00452"></a>00452 <span class="keyword">class </span>concrete_filter<T,void,Body>: <span class="keyword">public</span> filter {
-<a name="l00453"></a>00453 <span class="keyword">const</span> Body& my_body;
-<a name="l00454"></a>00454 <span class="keyword">typedef</span> token_helper<T, is_large_object<T>::value > t_helper;
-<a name="l00455"></a>00455 <span class="keyword">typedef</span> <span class="keyword">typename</span> t_helper::pointer t_pointer;
-<a name="l00456"></a>00456
-<a name="l00457"></a>00457 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>* input) {
-<a name="l00458"></a>00458 t_pointer temp_input = t_helper::cast_from_void_ptr(input);
-<a name="l00459"></a>00459 my_body(t_helper::token(temp_input));
-<a name="l00460"></a>00460 t_helper::destroy_token(temp_input);
-<a name="l00461"></a>00461 <span class="keywordflow">return</span> NULL;
-<a name="l00462"></a>00462 }
-<a name="l00463"></a>00463 <span class="keyword">public</span>:
-<a name="l00464"></a>00464 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
-<a name="l00465"></a>00465 };
-<a name="l00466"></a>00466
-<a name="l00467"></a>00467 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00468"></a>00468 <span class="keyword">class </span>concrete_filter<void,void,Body>: <span class="keyword">public</span> filter {
-<a name="l00469"></a>00469 <span class="keyword">const</span> Body& my_body;
-<a name="l00470"></a>00470
-<a name="l00472"></a>00472 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>*) {
-<a name="l00473"></a>00473 flow_control control;
-<a name="l00474"></a>00474 my_body(control);
-<a name="l00475"></a>00475 <span class="keywordtype">void</span>* output = control.is_pipeline_stopped ? NULL : (<span class="keywordtype">void</span>*)(intptr_t)-1;
-<a name="l00476"></a>00476 <span class="keywordflow">return</span> output;
-<a name="l00477"></a>00477 }
-<a name="l00478"></a>00478 <span class="keyword">public</span>:
-<a name="l00479"></a>00479 concrete_filter(filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
-<a name="l00480"></a>00480 };
-<a name="l00481"></a>00481
-<a name="l00483"></a>00483
-<a name="l00484"></a>00484 <span class="keyword">class </span>pipeline_proxy {
-<a name="l00485"></a>00485 <a class="code" href="a00310.html">tbb::pipeline</a> my_pipe;
-<a name="l00486"></a>00486 <span class="keyword">public</span>:
-<a name="l00487"></a>00487 pipeline_proxy( <span class="keyword">const</span> filter_t<void,void>& filter_chain );
-<a name="l00488"></a>00488 ~pipeline_proxy() {
-<a name="l00489"></a>00489 <span class="keywordflow">while</span>( filter* f = my_pipe.filter_list )
-<a name="l00490"></a>00490 <span class="keyword">delete</span> f; <span class="comment">// filter destructor removes it from the pipeline</span>
-<a name="l00491"></a>00491 }
-<a name="l00492"></a>00492 <a class="code" href="a00310.html">tbb::pipeline</a>* operator->() { <span class="keywordflow">return</span> &my_pipe; }
-<a name="l00493"></a>00493 };
-<a name="l00494"></a>00494
-<a name="l00496"></a>00496
-<a name="l00497"></a>00497 <span class="keyword">class </span>filter_node: tbb::internal::no_copy {
-<a name="l00499"></a>00499 <a class="code" href="a00254.html">tbb::atomic<intptr_t></a> ref_count;
-<a name="l00500"></a>00500 <span class="keyword">protected</span>:
-<a name="l00501"></a>00501 filter_node() {
-<a name="l00502"></a>00502 ref_count = 0;
-<a name="l00503"></a>00503 <span class="preprocessor">#ifdef __TBB_TEST_FILTER_NODE_COUNT</span>
-<a name="l00504"></a>00504 <span class="preprocessor"></span> ++(__TBB_TEST_FILTER_NODE_COUNT);
-<a name="l00505"></a>00505 <span class="preprocessor">#endif</span>
-<a name="l00506"></a>00506 <span class="preprocessor"></span> }
-<a name="l00507"></a>00507 <span class="keyword">public</span>:
-<a name="l00509"></a>00509 <span class="keyword">virtual</span> <span class="keywordtype">void</span> add_to( pipeline& ) = 0;
-<a name="l00511"></a>00511 <span class="keywordtype">void</span> add_ref() {++ref_count;}
-<a name="l00513"></a>00513 <span class="keywordtype">void</span> remove_ref() {
-<a name="l00514"></a>00514 __TBB_ASSERT(ref_count>0,<span class="stringliteral">"ref_count underflow"</span>);
-<a name="l00515"></a>00515 <span class="keywordflow">if</span>( --ref_count==0 )
-<a name="l00516"></a>00516 <span class="keyword">delete</span> <span class="keyword">this</span>;
-<a name="l00517"></a>00517 }
-<a name="l00518"></a>00518 <span class="keyword">virtual</span> ~filter_node() {
-<a name="l00519"></a>00519 <span class="preprocessor">#ifdef __TBB_TEST_FILTER_NODE_COUNT</span>
-<a name="l00520"></a>00520 <span class="preprocessor"></span> --(__TBB_TEST_FILTER_NODE_COUNT);
-<a name="l00521"></a>00521 <span class="preprocessor">#endif</span>
-<a name="l00522"></a>00522 <span class="preprocessor"></span> }
-<a name="l00523"></a>00523 };
-<a name="l00524"></a>00524
-<a name="l00526"></a>00526 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
-<a name="l00527"></a>00527 <span class="keyword">class </span>filter_node_leaf: <span class="keyword">public</span> filter_node {
-<a name="l00528"></a>00528 <span class="keyword">const</span> tbb::filter::mode mode;
-<a name="l00529"></a>00529 <span class="keyword">const</span> Body body;
-<a name="l00530"></a>00530 <span class="comment">/*override*/</span><span class="keywordtype">void</span> add_to( pipeline& p ) {
-<a name="l00531"></a>00531 concrete_filter<T,U,Body>* f = <span class="keyword">new</span> concrete_filter<T,U,Body>(mode,body);
-<a name="l00532"></a>00532 p.add_filter( *f );
-<a name="l00533"></a>00533 }
-<a name="l00534"></a>00534 <span class="keyword">public</span>:
-<a name="l00535"></a>00535 filter_node_leaf( tbb::filter::mode m, <span class="keyword">const</span> Body& b ) : mode(m), body(b) {}
-<a name="l00536"></a>00536 };
-<a name="l00537"></a>00537
-<a name="l00539"></a>00539 <span class="keyword">class </span>filter_node_join: <span class="keyword">public</span> filter_node {
-<a name="l00540"></a>00540 <span class="keyword">friend</span> <span class="keyword">class </span>filter_node; <span class="comment">// to suppress GCC 3.2 warnings</span>
-<a name="l00541"></a>00541 filter_node& left;
-<a name="l00542"></a>00542 filter_node& right;
-<a name="l00543"></a>00543 <span class="comment">/*override*/</span>~filter_node_join() {
-<a name="l00544"></a>00544 left.remove_ref();
-<a name="l00545"></a>00545 right.remove_ref();
-<a name="l00546"></a>00546 }
-<a name="l00547"></a>00547 <span class="comment">/*override*/</span><span class="keywordtype">void</span> add_to( pipeline& p ) {
-<a name="l00548"></a>00548 left.add_to(p);
-<a name="l00549"></a>00549 right.add_to(p);
-<a name="l00550"></a>00550 }
-<a name="l00551"></a>00551 <span class="keyword">public</span>:
-<a name="l00552"></a>00552 filter_node_join( filter_node& x, filter_node& y ) : left(x), right(y) {
-<a name="l00553"></a>00553 left.add_ref();
-<a name="l00554"></a>00554 right.add_ref();
-<a name="l00555"></a>00555 }
-<a name="l00556"></a>00556 };
-<a name="l00557"></a>00557
-<a name="l00558"></a>00558 } <span class="comment">// namespace internal</span>
-<a name="l00560"></a>00560 <span class="comment"></span>
-<a name="l00562"></a>00562 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
-<a name="l00563"></a><a class="code" href="a00283.html#85c2892eff1fddcd06e28911e75838bd">00563</a> <a class="code" href="a00283.html">filter_t<T,U></a> make_filter(tbb::filter::mode mode, <span class="keyword">const</span> Body& body) {
-<a name="l00564"></a>00564 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body);
-<a name="l00565"></a>00565 }
-<a name="l00566"></a>00566
-<a name="l00567"></a>00567 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V, <span class="keyword">typename</span> U>
-<a name="l00568"></a>00568 <a class="code" href="a00283.html">filter_t<T,U></a> operator& (<span class="keyword">const</span> <a class="code" href="a00283.html">filter_t<T,V></a>& left, <span class="keyword">const</span> <a class="code" href="a00283.html">filter_t<V,U></a>& right) {
-<a name="l00569"></a>00569 __TBB_ASSERT(left.<a class="code" href="a00283.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as left argument of '&'"</span>);
-<a name="l00570"></a>00570 __TBB_ASSERT(right.<a class="code" href="a00283.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as right argument of '&'"</span>);
-<a name="l00571"></a>00571 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_join(*left.<a class="code" href="a00283.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,*right.<a class="code" href="a00283.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>);
-<a name="l00572"></a>00572 }
-<a name="l00573"></a>00573
-<a name="l00575"></a>00575 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00576"></a><a class="code" href="a00283.html">00576</a> <span class="keyword">class </span><a class="code" href="a00283.html">filter_t</a> {
-<a name="l00577"></a>00577 <span class="keyword">typedef</span> internal::filter_node filter_node;
-<a name="l00578"></a>00578 filter_node* root;
-<a name="l00579"></a>00579 <a class="code" href="a00283.html">filter_t</a>( filter_node* root_ ) : root(root_) {
-<a name="l00580"></a>00580 root->add_ref();
-<a name="l00581"></a>00581 }
-<a name="l00582"></a>00582 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_proxy;
-<a name="l00583"></a>00583 <span class="keyword">template</span><<span class="keyword">typename</span> T_, <span class="keyword">typename</span> U_, <span class="keyword">typename</span> Body>
-<a name="l00584"></a>00584 <span class="keyword">friend</span> <a class="code" href="a00283.html">filter_t<T_,U_></a> <a class="code" href="a00283.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, <span class="keyword">const</span> Body& );
-<a name="l00585"></a>00585 <span class="keyword">template</span><<span class="keyword">typename</span> T_, <span class="keyword">typename</span> V_, <span class="keyword">typename</span> U_>
-<a name="l00586"></a>00586 <span class="keyword">friend</span> <a class="code" href="a00283.html">filter_t<T_,U_></a> operator& (<span class="keyword">const</span> <a class="code" href="a00283.html">filter_t<T_,V_></a>& , <span class="keyword">const</span> <a class="code" href="a00283.html">filter_t<V_,U_></a>& );
-<a name="l00587"></a>00587 <span class="keyword">public</span>:
-<a name="l00588"></a>00588 <a class="code" href="a00283.html">filter_t</a>() : root(NULL) {}
-<a name="l00589"></a>00589 <a class="code" href="a00283.html">filter_t</a>( <span class="keyword">const</span> <a class="code" href="a00283.html">filter_t<T,U></a>& rhs ) : root(rhs.<a class="code" href="a00283.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>) {
-<a name="l00590"></a>00590 <span class="keywordflow">if</span>( root ) root->add_ref();
-<a name="l00591"></a>00591 }
-<a name="l00592"></a>00592 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00593"></a>00593 <a class="code" href="a00283.html">filter_t</a>( tbb::filter::mode mode, <span class="keyword">const</span> Body& body ) :
-<a name="l00594"></a>00594 root( <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body) ) {
-<a name="l00595"></a>00595 root->add_ref();
-<a name="l00596"></a>00596 }
-<a name="l00597"></a>00597
-<a name="l00598"></a>00598 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00283.html">filter_t<T,U></a>& rhs ) {
-<a name="l00599"></a>00599 <span class="comment">// Order of operations below carefully chosen so that reference counts remain correct</span>
-<a name="l00600"></a>00600 <span class="comment">// in unlikely event that remove_ref throws exception.</span>
-<a name="l00601"></a>00601 filter_node* old = root;
-<a name="l00602"></a>00602 root = rhs.<a class="code" href="a00283.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>;
-<a name="l00603"></a>00603 <span class="keywordflow">if</span>( root ) root->add_ref();
-<a name="l00604"></a>00604 <span class="keywordflow">if</span>( old ) old->remove_ref();
-<a name="l00605"></a>00605 }
-<a name="l00606"></a>00606 ~<a class="code" href="a00283.html">filter_t</a>() {
-<a name="l00607"></a>00607 <span class="keywordflow">if</span>( root ) root->remove_ref();
-<a name="l00608"></a>00608 }
-<a name="l00609"></a>00609 <span class="keywordtype">void</span> clear() {
-<a name="l00610"></a>00610 <span class="comment">// Like operator= with filter_t() on right side.</span>
-<a name="l00611"></a>00611 <span class="keywordflow">if</span>( root ) {
-<a name="l00612"></a>00612 filter_node* old = root;
-<a name="l00613"></a>00613 root = NULL;
-<a name="l00614"></a>00614 old->remove_ref();
-<a name="l00615"></a>00615 }
-<a name="l00616"></a>00616 }
-<a name="l00617"></a>00617 };
-<a name="l00618"></a>00618
-<a name="l00619"></a>00619 <span class="keyword">inline</span> internal::pipeline_proxy::pipeline_proxy( <span class="keyword">const</span> <a class="code" href="a00283.html">filter_t<void,void></a>& filter_chain ) : my_pipe() {
-<a name="l00620"></a>00620 __TBB_ASSERT( filter_chain.<a class="code" href="a00283.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>, <span class="stringliteral">"cannot apply parallel_pipeline to default-constructed filter_t"</span> );
-<a name="l00621"></a>00621 filter_chain.<a class="code" href="a00283.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>->add_to(my_pipe);
-<a name="l00622"></a>00622 }
-<a name="l00623"></a>00623
-<a name="l00624"></a>00624 <span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_pipeline(size_t max_number_of_live_tokens, <span class="keyword">const</span> <a class="code" href="a00283.html">filter_t<void,void></a>& filter_chain
-<a name="l00625"></a>00625 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00626"></a>00626 , <a class="code" href="a00339.html">tbb::task_group_context</a>& context
-<a name="l00627"></a>00627 #endif
-<a name="l00628"></a>00628 ) {
-<a name="l00629"></a>00629 internal::pipeline_proxy pipe(filter_chain);
-<a name="l00630"></a>00630 <span class="comment">// tbb::pipeline::run() is called via the proxy</span>
-<a name="l00631"></a>00631 pipe->run(max_number_of_live_tokens
-<a name="l00632"></a>00632 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00633"></a>00633 , context
-<a name="l00634"></a>00634 #endif
-<a name="l00635"></a>00635 );
-<a name="l00636"></a>00636 }
-<a name="l00637"></a>00637
-<a name="l00638"></a>00638 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00639"></a>00639 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_pipeline(size_t max_number_of_live_tokens, <span class="keyword">const</span> filter_t<void,void>& filter_chain) {
-<a name="l00640"></a>00640 <a class="code" href="a00339.html">tbb::task_group_context</a> context;
-<a name="l00641"></a>00641 parallel_pipeline(max_number_of_live_tokens, filter_chain, context);
-<a name="l00642"></a>00642 }
-<a name="l00643"></a>00643 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00644"></a>00644 <span class="preprocessor"></span>
-<a name="l00645"></a>00645 } <span class="comment">// interface6</span>
-<a name="l00646"></a>00646
-<a name="l00647"></a>00647 <span class="keyword">using</span> interface6::flow_control;
-<a name="l00648"></a>00648 <span class="keyword">using</span> interface6::filter_t;
-<a name="l00649"></a>00649 <span class="keyword">using</span> interface6::make_filter;
-<a name="l00650"></a>00650 <span class="keyword">using</span> interface6::parallel_pipeline;
-<a name="l00651"></a>00651
-<a name="l00652"></a>00652 } <span class="comment">// tbb</span>
-<a name="l00653"></a>00653
-<a name="l00654"></a>00654 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_pipeline_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00603.html b/doc/html/a00603.html
deleted file mode 100644
index 08d218c..0000000
--- a/doc/html/a00603.html
+++ /dev/null
@@ -1,136 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>queuing_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>queuing_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
-<a name="l00042"></a>00042
-<a name="l00044"></a>00044
-<a name="l00045"></a><a class="code" href="a00314.html">00045</a> <span class="keyword">class </span><a class="code" href="a00314.html">queuing_mutex</a> {
-<a name="l00046"></a>00046 <span class="keyword">public</span>:
-<a name="l00048"></a><a class="code" href="a00314.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a> <a class="code" href="a00314.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>() {
-<a name="l00049"></a>00049 q_tail = NULL;
-<a name="l00050"></a>00050 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span> internal_construct();
-<a name="l00052"></a>00052 <span class="preprocessor">#endif</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span> }
-<a name="l00054"></a>00054
-<a name="l00056"></a>00056
-<a name="l00058"></a><a class="code" href="a00315.html">00058</a> <span class="keyword">class </span><a class="code" href="a00315.html">scoped_lock</a>: internal::no_copy {
-<a name="l00060"></a>00060 <span class="keywordtype">void</span> initialize() {
-<a name="l00061"></a>00061 <a class="code" href="a00301.html">mutex</a> = NULL;
-<a name="l00062"></a>00062 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span> internal::poison_pointer(next);
-<a name="l00064"></a>00064 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00065"></a>00065 }
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">public</span>:
-<a name="l00069"></a>00069
-<a name="l00070"></a><a class="code" href="a00315.html#db0fa3967491014572e24d6607bdc971">00070</a> <a class="code" href="a00315.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
-<a name="l00071"></a>00071
-<a name="l00073"></a><a class="code" href="a00315.html#9b51ef972f5618ac17caadb58841ab6d">00073</a> <a class="code" href="a00315.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00314.html">queuing_mutex</a>& m ) {
-<a name="l00074"></a>00074 initialize();
-<a name="l00075"></a>00075 <a class="code" href="a00315.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
-<a name="l00076"></a>00076 }
-<a name="l00077"></a>00077
-<a name="l00079"></a><a class="code" href="a00315.html#ac2c576a93570957d694192a5f491443">00079</a> <a class="code" href="a00315.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
-<a name="l00080"></a>00080 <span class="keywordflow">if</span>( <a class="code" href="a00301.html">mutex</a> ) <a class="code" href="a00315.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00081"></a>00081 }
-<a name="l00082"></a>00082
-<a name="l00084"></a>00084 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00315.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00314.html">queuing_mutex</a>& m );
-<a name="l00085"></a>00085
-<a name="l00087"></a>00087 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00315.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00314.html">queuing_mutex</a>& m );
-<a name="l00088"></a>00088
-<a name="l00090"></a>00090 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00315.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00091"></a>00091
-<a name="l00092"></a>00092 <span class="keyword">private</span>:
-<a name="l00094"></a>00094 <a class="code" href="a00314.html">queuing_mutex</a>* <a class="code" href="a00301.html">mutex</a>;
-<a name="l00095"></a>00095
-<a name="l00097"></a>00097 <a class="code" href="a00315.html">scoped_lock</a> *next;
-<a name="l00098"></a>00098
-<a name="l00100"></a>00100
-<a name="l00103"></a>00103 uintptr_t going;
-<a name="l00104"></a>00104 };
-<a name="l00105"></a>00105
-<a name="l00106"></a>00106 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 <span class="comment">// Mutex traits</span>
-<a name="l00109"></a>00109 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00110"></a>00110 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00111"></a>00111 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00112"></a>00112
-<a name="l00113"></a>00113 <span class="keyword">private</span>:
-<a name="l00115"></a>00115 <a class="code" href="a00254.html">atomic<scoped_lock*></a> q_tail;
-<a name="l00116"></a>00116
-<a name="l00117"></a>00117 };
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 } <span class="comment">// namespace tbb</span>
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00604.html b/doc/html/a00604.html
deleted file mode 100644
index c7351ca..0000000
--- a/doc/html/a00604.html
+++ /dev/null
@@ -1,166 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>queuing_rw_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>queuing_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_rw_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_rw_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
-<a name="l00042"></a>00042
-<a name="l00044"></a>00044
-<a name="l00047"></a><a class="code" href="a00316.html">00047</a> <span class="keyword">class </span><a class="code" href="a00316.html">queuing_rw_mutex</a> {
-<a name="l00048"></a>00048 <span class="keyword">public</span>:
-<a name="l00050"></a><a class="code" href="a00316.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a> <a class="code" href="a00316.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>() {
-<a name="l00051"></a>00051 q_tail = NULL;
-<a name="l00052"></a>00052 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span> internal_construct();
-<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span> }
-<a name="l00056"></a>00056
-<a name="l00058"></a><a class="code" href="a00316.html#1ba73e3d95cfdf8323880bc623af9099">00058</a> <a class="code" href="a00316.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>() {
-<a name="l00059"></a>00059 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span> __TBB_ASSERT( !q_tail, <span class="stringliteral">"destruction of an acquired mutex"</span>);
-<a name="l00061"></a>00061 <span class="preprocessor">#endif</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span> }
-<a name="l00063"></a>00063
-<a name="l00065"></a>00065
-<a name="l00067"></a><a class="code" href="a00317.html">00067</a> <span class="keyword">class </span><a class="code" href="a00317.html">scoped_lock</a>: internal::no_copy {
-<a name="l00069"></a>00069 <span class="keywordtype">void</span> initialize() {
-<a name="l00070"></a>00070 my_mutex = NULL;
-<a name="l00071"></a>00071 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span> my_state = 0xFF; <span class="comment">// Set to invalid state</span>
-<a name="l00073"></a>00073 internal::poison_pointer(my_next);
-<a name="l00074"></a>00074 internal::poison_pointer(my_prev);
-<a name="l00075"></a>00075 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00076"></a>00076 }
-<a name="l00077"></a>00077
-<a name="l00078"></a>00078 <span class="keyword">public</span>:
-<a name="l00080"></a>00080
-<a name="l00081"></a><a class="code" href="a00317.html#c62e365be7bcbba091c9ea7454a4d22c">00081</a> <a class="code" href="a00317.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
-<a name="l00082"></a>00082
-<a name="l00084"></a><a class="code" href="a00317.html#fbb8798792d3aebb136c46fc63d2529e">00084</a> <a class="code" href="a00317.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00316.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
-<a name="l00085"></a>00085 initialize();
-<a name="l00086"></a>00086 <a class="code" href="a00317.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088
-<a name="l00090"></a><a class="code" href="a00317.html#32c7d67a660d23ebbaab1a1d2826d31a">00090</a> <a class="code" href="a00317.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
-<a name="l00091"></a>00091 <span class="keywordflow">if</span>( my_mutex ) <a class="code" href="a00317.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093
-<a name="l00095"></a>00095 <span class="keywordtype">void</span> <a class="code" href="a00317.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00316.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00096"></a>00096
-<a name="l00098"></a>00098 <span class="keywordtype">bool</span> <a class="code" href="a00317.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00316.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00099"></a>00099
-<a name="l00101"></a>00101 <span class="keywordtype">void</span> <a class="code" href="a00317.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00102"></a>00102
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keywordtype">bool</span> <a class="code" href="a00317.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
-<a name="l00106"></a>00106
-<a name="l00108"></a>00108 <span class="keywordtype">bool</span> <a class="code" href="a00317.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="keyword">private</span>:
-<a name="l00112"></a>00112 <a class="code" href="a00316.html">queuing_rw_mutex</a>* my_mutex;
-<a name="l00113"></a>00113
-<a name="l00115"></a>00115 <a class="code" href="a00317.html">scoped_lock</a> *__TBB_atomic my_prev, *__TBB_atomic my_next;
-<a name="l00116"></a>00116
-<a name="l00117"></a>00117 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state_t;
-<a name="l00118"></a>00118
-<a name="l00120"></a>00120 <a class="code" href="a00254.html">atomic<state_t></a> my_state;
-<a name="l00121"></a>00121
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_atomic my_going;
-<a name="l00125"></a>00125
-<a name="l00127"></a>00127 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_internal_lock;
-<a name="l00128"></a>00128
-<a name="l00130"></a>00130 <span class="keywordtype">void</span> acquire_internal_lock();
-<a name="l00131"></a>00131
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="keywordtype">bool</span> try_acquire_internal_lock();
-<a name="l00135"></a>00135
-<a name="l00137"></a>00137 <span class="keywordtype">void</span> release_internal_lock();
-<a name="l00138"></a>00138
-<a name="l00140"></a>00140 <span class="keywordtype">void</span> wait_for_release_of_internal_lock();
-<a name="l00141"></a>00141
-<a name="l00143"></a>00143 <span class="keywordtype">void</span> unblock_or_wait_on_internal_lock( uintptr_t );
-<a name="l00144"></a>00144 };
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 <span class="comment">// Mutex traits</span>
-<a name="l00149"></a>00149 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;
-<a name="l00150"></a>00150 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00151"></a>00151 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 <span class="keyword">private</span>:
-<a name="l00155"></a>00155 <a class="code" href="a00254.html">atomic<scoped_lock*></a> q_tail;
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 };
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 __TBB_DEFINE_PROFILING_SET_NAME(queuing_rw_mutex)
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 } <span class="comment">// namespace tbb</span>
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_rw_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00605.html b/doc/html/a00605.html
deleted file mode 100644
index af7240d..0000000
--- a/doc/html/a00605.html
+++ /dev/null
@@ -1,179 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>reader_writer_lock.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>reader_writer_lock.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_reader_writer_lock_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_reader_writer_lock_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_thread.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>interface5 {
-<a name="l00031"></a>00031
-<a name="l00034"></a><a class="code" href="a00318.html">00034</a> <span class="keyword">class </span><a class="code" href="a00318.html">reader_writer_lock</a> : tbb::internal::no_copy {
-<a name="l00035"></a>00035 <span class="keyword">public</span>:
-<a name="l00036"></a>00036 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00319.html">scoped_lock</a>;
-<a name="l00037"></a>00037 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00320.html">scoped_lock_read</a>;
-<a name="l00039"></a>00039
-<a name="l00074"></a><a class="code" href="a00318.html#6f921f0d7c1812ceb5674418c8b6ccaf">00074</a> <span class="keyword">enum</span> <a class="code" href="a00318.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { waiting_nonblocking, waiting, active, invalid };
-<a name="l00075"></a>00075
-<a name="l00077"></a><a class="code" href="a00318.html#c1431c4293e777efd9aab9a95c2a46e1">00077</a> <a class="code" href="a00318.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>() {
-<a name="l00078"></a>00078 internal_construct();
-<a name="l00079"></a>00079 }
-<a name="l00080"></a>00080
-<a name="l00082"></a><a class="code" href="a00318.html#5135f64f7b7339017f33d956445edbee">00082</a> <a class="code" href="a00318.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>() {
-<a name="l00083"></a>00083 internal_destroy();
-<a name="l00084"></a>00084 }
-<a name="l00085"></a>00085
-<a name="l00087"></a>00087
-<a name="l00089"></a><a class="code" href="a00319.html">00089</a> <span class="keyword">class </span><a class="code" href="a00319.html">scoped_lock</a> : tbb::internal::no_copy {
-<a name="l00090"></a>00090 <span class="keyword">public</span>:
-<a name="l00091"></a>00091 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00318.html">reader_writer_lock</a>;
-<a name="l00092"></a>00092
-<a name="l00094"></a><a class="code" href="a00319.html#cf19f20e082887c1bb0ba6b0911c3583">00094</a> <a class="code" href="a00319.html">scoped_lock</a>(<a class="code" href="a00318.html">reader_writer_lock</a>& <a class="code" href="a00318.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00095"></a>00095 internal_construct(<a class="code" href="a00318.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
-<a name="l00096"></a>00096 }
-<a name="l00097"></a>00097
-<a name="l00099"></a><a class="code" href="a00319.html#70246e0260493625ff956fa5926fc71f">00099</a> <a class="code" href="a00319.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
-<a name="l00100"></a>00100 internal_destroy();
-<a name="l00101"></a>00101 }
-<a name="l00102"></a>00102
-<a name="l00103"></a>00103 <span class="keywordtype">void</span>* operator new(size_t s) {
-<a name="l00104"></a>00104 <span class="keywordflow">return</span> tbb::internal::allocate_via_handler_v3(s);
-<a name="l00105"></a>00105 }
-<a name="l00106"></a>00106 <span class="keywordtype">void</span> operator delete(<span class="keywordtype">void</span>* p) {
-<a name="l00107"></a>00107 tbb::internal::deallocate_via_handler_v3(p);
-<a name="l00108"></a>00108 }
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="keyword">private</span>:
-<a name="l00112"></a>00112 <a class="code" href="a00318.html">reader_writer_lock</a> *<a class="code" href="a00301.html">mutex</a>;
-<a name="l00114"></a>00114 scoped_lock* next;
-<a name="l00116"></a>00116 <a class="code" href="a00254.html">atomic<status_t></a> status;
-<a name="l00117"></a>00117
-<a name="l00119"></a>00119 scoped_lock();
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00318.html">reader_writer_lock</a>&);
-<a name="l00122"></a>00122 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00123"></a>00123 };
-<a name="l00124"></a>00124
-<a name="l00126"></a><a class="code" href="a00320.html">00126</a> <span class="keyword">class </span><a class="code" href="a00320.html">scoped_lock_read</a> : tbb::internal::no_copy {
-<a name="l00127"></a>00127 <span class="keyword">public</span>:
-<a name="l00128"></a>00128 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00318.html">reader_writer_lock</a>;
-<a name="l00129"></a>00129
-<a name="l00131"></a><a class="code" href="a00320.html#87ab0dc8f7216e6ba0f7acd6aec33064">00131</a> <a class="code" href="a00320.html">scoped_lock_read</a>(<a class="code" href="a00318.html">reader_writer_lock</a>& <a class="code" href="a00318.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00132"></a>00132 internal_construct(<a class="code" href="a00318.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
-<a name="l00133"></a>00133 }
-<a name="l00134"></a>00134
-<a name="l00136"></a><a class="code" href="a00320.html#bd21c5f3d555d64d1de8658e15bf4966">00136</a> <a class="code" href="a00320.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>() {
-<a name="l00137"></a>00137 internal_destroy();
-<a name="l00138"></a>00138 }
-<a name="l00139"></a>00139
-<a name="l00140"></a>00140 <span class="keywordtype">void</span>* operator new(size_t s) {
-<a name="l00141"></a>00141 <span class="keywordflow">return</span> tbb::internal::allocate_via_handler_v3(s);
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143 <span class="keywordtype">void</span> operator delete(<span class="keywordtype">void</span>* p) {
-<a name="l00144"></a>00144 tbb::internal::deallocate_via_handler_v3(p);
-<a name="l00145"></a>00145 }
-<a name="l00146"></a>00146
-<a name="l00147"></a>00147 <span class="keyword">private</span>:
-<a name="l00149"></a>00149 <a class="code" href="a00318.html">reader_writer_lock</a> *<a class="code" href="a00301.html">mutex</a>;
-<a name="l00151"></a>00151 scoped_lock_read *next;
-<a name="l00153"></a>00153 <a class="code" href="a00254.html">atomic<status_t></a> status;
-<a name="l00154"></a>00154
-<a name="l00156"></a>00156 scoped_lock_read();
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00318.html">reader_writer_lock</a>&);
-<a name="l00159"></a>00159 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00160"></a>00160 };
-<a name="l00161"></a>00161
-<a name="l00163"></a>00163
-<a name="l00168"></a>00168 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00318.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>();
-<a name="l00169"></a>00169
-<a name="l00171"></a>00171
-<a name="l00175"></a>00175 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00318.html#721eb173e154ab38292273e9266a9b07">try_lock</a>();
-<a name="l00176"></a>00176
-<a name="l00178"></a>00178
-<a name="l00182"></a>00182 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00318.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>();
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185
-<a name="l00187"></a>00187 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00318.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>();
-<a name="l00188"></a>00188
-<a name="l00190"></a>00190 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00318.html#5113b32689305599b2c36b5831547704">unlock</a>();
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 <span class="keyword">private</span>:
-<a name="l00193"></a>00193 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00194"></a>00194 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00195"></a>00195
-<a name="l00197"></a>00197
-<a name="l00198"></a>00198 <span class="keywordtype">bool</span> start_write(scoped_lock *);
-<a name="l00200"></a>00200 <span class="keywordtype">void</span> set_next_writer(scoped_lock *w);
-<a name="l00202"></a>00202 <span class="keywordtype">void</span> end_write(scoped_lock *);
-<a name="l00204"></a>00204 <span class="keywordtype">bool</span> is_current_writer();
-<a name="l00205"></a>00205
-<a name="l00207"></a>00207
-<a name="l00208"></a>00208 <span class="keywordtype">void</span> start_read(scoped_lock_read *);
-<a name="l00210"></a>00210 <span class="keywordtype">void</span> unblock_readers();
-<a name="l00212"></a>00212 <span class="keywordtype">void</span> end_read();
-<a name="l00213"></a>00213
-<a name="l00215"></a>00215 atomic<scoped_lock_read*> reader_head;
-<a name="l00217"></a>00217 atomic<scoped_lock*> writer_head;
-<a name="l00219"></a>00219 atomic<scoped_lock*> writer_tail;
-<a name="l00221"></a>00221 tbb_thread::id my_current_writer;
-<a name="l00223"></a>00223 atomic<uintptr_t> rdr_count_and_flags; <span class="comment">// used with __TBB_AtomicOR, which assumes uintptr_t</span>
-<a name="l00224"></a>00224 };
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 } <span class="comment">// namespace interface5</span>
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 <span class="keyword">using</span> interface5::reader_writer_lock;
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 } <span class="comment">// namespace tbb</span>
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_reader_writer_lock_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00606.html b/doc/html/a00606.html
deleted file mode 100644
index ee3dea0..0000000
--- a/doc/html/a00606.html
+++ /dev/null
@@ -1,241 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>recursive_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>recursive_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_recursive_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_recursive_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#else</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="preprocessor">#include <new></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keyword">namespace </span>tbb {
-<a name="l00037"></a>00037
-<a name="l00039"></a><a class="code" href="a00322.html">00039</a> <span class="keyword">class </span><a class="code" href="a00322.html">recursive_mutex</a> {
-<a name="l00040"></a>00040 <span class="keyword">public</span>:
-<a name="l00042"></a><a class="code" href="a00322.html#d2fceb7f95c24a8cd1457d4527e4b8c6">00042</a> <a class="code" href="a00322.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>() {
-<a name="l00043"></a>00043 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span> internal_construct();
-<a name="l00045"></a>00045 <span class="preprocessor">#else</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span> InitializeCriticalSection(&impl);
-<a name="l00048"></a>00048 <span class="preprocessor"> #else</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span> pthread_mutexattr_t mtx_attr;
-<a name="l00050"></a>00050 <span class="keywordtype">int</span> error_code = pthread_mutexattr_init( &mtx_attr );
-<a name="l00051"></a>00051 <span class="keywordflow">if</span>( error_code )
-<a name="l00052"></a>00052 tbb::internal::handle_perror(error_code,<span class="stringliteral">"recursive_mutex: pthread_mutexattr_init failed"</span>);
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 pthread_mutexattr_settype( &mtx_attr, PTHREAD_MUTEX_RECURSIVE );
-<a name="l00055"></a>00055 error_code = pthread_mutex_init( &impl, &mtx_attr );
-<a name="l00056"></a>00056 <span class="keywordflow">if</span>( error_code )
-<a name="l00057"></a>00057 tbb::internal::handle_perror(error_code,<span class="stringliteral">"recursive_mutex: pthread_mutex_init failed"</span>);
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 pthread_mutexattr_destroy( &mtx_attr );
-<a name="l00060"></a>00060 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64*/</span>
-<a name="l00061"></a>00061 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00062"></a>00062 };
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 ~<a class="code" href="a00322.html">recursive_mutex</a>() {
-<a name="l00065"></a>00065 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00066"></a>00066 <span class="preprocessor"></span> internal_destroy();
-<a name="l00067"></a>00067 <span class="preprocessor">#else</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00069"></a>00069 <span class="preprocessor"></span> DeleteCriticalSection(&impl);
-<a name="l00070"></a>00070 <span class="preprocessor"> #else</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span> pthread_mutex_destroy(&impl);
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00074"></a>00074 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00075"></a>00075 };
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 <span class="keyword">class </span>scoped_lock;
-<a name="l00078"></a>00078 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00079"></a>00079
-<a name="l00081"></a>00081
-<a name="l00083"></a><a class="code" href="a00323.html">00083</a> <span class="keyword">class </span><a class="code" href="a00323.html">scoped_lock</a>: internal::no_copy {
-<a name="l00084"></a>00084 <span class="keyword">public</span>:
-<a name="l00086"></a><a class="code" href="a00323.html#d82d4d36fbf9727a493d26ae50855fe7">00086</a> <a class="code" href="a00323.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>() : my_mutex(NULL) {};
-<a name="l00087"></a>00087
-<a name="l00089"></a><a class="code" href="a00323.html#dec17713c4c1321ac8fec66816d0c602">00089</a> <a class="code" href="a00323.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>( <a class="code" href="a00322.html">recursive_mutex</a>& <a class="code" href="a00301.html">mutex</a> ) {
-<a name="l00090"></a>00090 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span> my_mutex = &mutex;
-<a name="l00092"></a>00092 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00093"></a>00093 <a class="code" href="a00323.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( mutex );
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095
-<a name="l00097"></a><a class="code" href="a00323.html#c1197ffb8f3cd9d4fed71d7e06265b7c">00097</a> <a class="code" href="a00323.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>() {
-<a name="l00098"></a>00098 <span class="keywordflow">if</span>( my_mutex )
-<a name="l00099"></a>00099 <a class="code" href="a00323.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>();
-<a name="l00100"></a>00100 }
-<a name="l00101"></a>00101
-<a name="l00103"></a><a class="code" href="a00323.html#7fb04da37cccf8c99b1f9102d9074f9a">00103</a> <span class="keywordtype">void</span> <a class="code" href="a00323.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( <a class="code" href="a00322.html">recursive_mutex</a>& <a class="code" href="a00301.html">mutex</a> ) {
-<a name="l00104"></a>00104 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span> internal_acquire( mutex );
-<a name="l00106"></a>00106 <span class="preprocessor">#else</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span> my_mutex = &mutex;
-<a name="l00108"></a>00108 mutex.<a class="code" href="a00322.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>();
-<a name="l00109"></a>00109 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111
-<a name="l00113"></a><a class="code" href="a00323.html#36bfc3e93e3ef6340abef4901444d340">00113</a> <span class="keywordtype">bool</span> <a class="code" href="a00323.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>( <a class="code" href="a00322.html">recursive_mutex</a>& <a class="code" href="a00301.html">mutex</a> ) {
-<a name="l00114"></a>00114 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal_try_acquire( mutex );
-<a name="l00116"></a>00116 <span class="preprocessor">#else</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00322.html#86e719b0afee25704af11ab97694d240">try_lock</a>();
-<a name="l00118"></a>00118 <span class="keywordflow">if</span>( result )
-<a name="l00119"></a>00119 my_mutex = &mutex;
-<a name="l00120"></a>00120 <span class="keywordflow">return</span> result;
-<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00122"></a>00122 }
-<a name="l00123"></a>00123
-<a name="l00125"></a><a class="code" href="a00323.html#ac480ea0e9d5ea0345a67d57008b6263">00125</a> <span class="keywordtype">void</span> <a class="code" href="a00323.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>() {
-<a name="l00126"></a>00126 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span> internal_release();
-<a name="l00128"></a>00128 <span class="preprocessor">#else</span>
-<a name="l00129"></a>00129 <span class="preprocessor"></span> my_mutex-><a class="code" href="a00322.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>();
-<a name="l00130"></a>00130 my_mutex = NULL;
-<a name="l00131"></a>00131 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="keyword">private</span>:
-<a name="l00136"></a>00136 <a class="code" href="a00322.html">recursive_mutex</a>* my_mutex;
-<a name="l00137"></a>00137
-<a name="l00139"></a>00139 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00322.html">recursive_mutex</a>& m );
-<a name="l00140"></a>00140
-<a name="l00142"></a>00142 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00322.html">recursive_mutex</a>& m );
-<a name="l00143"></a>00143
-<a name="l00145"></a>00145 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
-<a name="l00146"></a>00146
-<a name="l00147"></a>00147 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00322.html">recursive_mutex</a>;
-<a name="l00148"></a>00148 };
-<a name="l00149"></a>00149
-<a name="l00150"></a>00150 <span class="comment">// Mutex traits</span>
-<a name="l00151"></a>00151 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00152"></a>00152 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">true</span>;
-<a name="l00153"></a>00153 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">false</span>;
-<a name="l00154"></a>00154
-<a name="l00155"></a>00155 <span class="comment">// C++0x compatibility interface</span>
-<a name="l00156"></a>00156
-<a name="l00158"></a><a class="code" href="a00322.html#4c342c69d47f4bb0b393535dee4015d6">00158</a> <span class="keywordtype">void</span> <a class="code" href="a00322.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>() {
-<a name="l00159"></a>00159 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00160"></a>00160 <span class="preprocessor"></span> <a class="code" href="a00253.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00161"></a>00161 <span class="keyword">new</span>(tmp.<a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00323.html">scoped_lock</a>(*<span class="keyword">this</span>);
-<a name="l00162"></a>00162 <span class="preprocessor">#else</span>
-<a name="l00163"></a>00163 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span> EnterCriticalSection(&impl);
-<a name="l00165"></a>00165 <span class="preprocessor"> #else</span>
-<a name="l00166"></a>00166 <span class="preprocessor"></span> pthread_mutex_lock(&impl);
-<a name="l00167"></a>00167 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00168"></a>00168 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00169"></a>00169 }
-<a name="l00170"></a>00170
-<a name="l00172"></a>00172
-<a name="l00173"></a><a class="code" href="a00322.html#86e719b0afee25704af11ab97694d240">00173</a> <span class="keywordtype">bool</span> <a class="code" href="a00322.html#86e719b0afee25704af11ab97694d240">try_lock</a>() {
-<a name="l00174"></a>00174 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00175"></a>00175 <span class="preprocessor"></span> <a class="code" href="a00253.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00176"></a>00176 <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00323.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
-<a name="l00177"></a>00177 <span class="preprocessor">#else </span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00179"></a>00179 <span class="preprocessor"></span> <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
-<a name="l00180"></a>00180 <span class="preprocessor"> #else</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span> <span class="keywordflow">return</span> pthread_mutex_trylock(&impl)==0;
-<a name="l00182"></a>00182 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00183"></a>00183 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00184"></a>00184 }
-<a name="l00185"></a>00185
-<a name="l00187"></a><a class="code" href="a00322.html#f0a96e26b7f074588dc31e32524856ae">00187</a> <span class="keywordtype">void</span> <a class="code" href="a00322.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>() {
-<a name="l00188"></a>00188 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00189"></a>00189 <span class="preprocessor"></span> <a class="code" href="a00253.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00190"></a>00190 <a class="code" href="a00323.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00191"></a>00191 s.<a class="code" href="a00323.html#3efd10a49e2435ea5215b49907f93ba2">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00192"></a>00192 s.<a class="code" href="a00323.html#43ed37cec508072e53a52113c8040137">internal_release</a>();
-<a name="l00193"></a>00193 <span class="preprocessor">#else</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span> LeaveCriticalSection(&impl);
-<a name="l00196"></a>00196 <span class="preprocessor"> #else</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span> pthread_mutex_unlock(&impl);
-<a name="l00198"></a>00198 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00199"></a>00199 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201
-<a name="l00203"></a>00203 <span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00204"></a><a class="code" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">00204</a> <span class="preprocessor"></span> <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>;
-<a name="l00205"></a>00205 <span class="preprocessor"> #else</span>
-<a name="l00206"></a>00206 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_mutex_t* <a class="code" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>;
-<a name="l00207"></a>00207 <span class="preprocessor"> #endif</span>
-<a name="l00208"></a>00208 <span class="preprocessor"></span> <a class="code" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>) &impl; }
-<a name="l00209"></a>00209
-<a name="l00210"></a>00210 <span class="keyword">private</span>:
-<a name="l00211"></a>00211 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00212"></a>00212 <span class="preprocessor"></span> CRITICAL_SECTION impl;
-<a name="l00213"></a>00213 <span class="keyword">enum</span> state_t {
-<a name="l00214"></a>00214 INITIALIZED=0x1234,
-<a name="l00215"></a>00215 DESTROYED=0x789A,
-<a name="l00216"></a>00216 } state;
-<a name="l00217"></a>00217 <span class="preprocessor">#else</span>
-<a name="l00218"></a>00218 <span class="preprocessor"></span> pthread_mutex_t impl;
-<a name="l00219"></a>00219 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00220"></a>00220
-<a name="l00222"></a>00222 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00223"></a>00223
-<a name="l00225"></a>00225 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00226"></a>00226 };
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 __TBB_DEFINE_PROFILING_SET_NAME(recursive_mutex)
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 } <span class="comment">// namespace tbb </span>
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_recursive_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00607.html b/doc/html/a00607.html
deleted file mode 100644
index b4b9673..0000000
--- a/doc/html/a00607.html
+++ /dev/null
@@ -1,137 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>runtime_loader.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>runtime_loader.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_runtime_loader_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_runtime_loader_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if ! TBB_PREVIEW_RUNTIME_LOADER</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor"> #error Set TBB_PREVIEW_RUNTIME_LOADER to include runtime_loader.h</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb/tbb_stddef.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include <climits></span>
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor"> #if ! __TBB_NO_IMPLICIT_LINKAGE</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor"> #ifdef _DEBUG</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment( linker, "/nodefaultlib:tbb_debug.lib" )</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment( linker, "/defaultlib:tbbproxy_debug.lib" )</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment( linker, "/nodefaultlib:tbb.lib" )</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment( linker, "/defaultlib:tbbproxy.lib" )</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span>
-<a name="l00043"></a>00043 <span class="keyword">namespace </span>tbb {
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="keyword">namespace </span>interface6 {
-<a name="l00046"></a>00046
-<a name="l00048"></a>00048
-<a name="l00085"></a><a class="code" href="a00324.html">00085</a> <span class="keyword">class </span><a class="code" href="a00324.html">runtime_loader</a> : tbb::internal::no_copy {
-<a name="l00086"></a>00086
-<a name="l00087"></a>00087 <span class="keyword">public</span>:
-<a name="l00088"></a>00088
-<a name="l00090"></a><a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcb">00090</a> <span class="keyword">enum</span> <a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> {
-<a name="l00091"></a>00091 <a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a>,
-<a name="l00092"></a>00092 <a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a>,
-<a name="l00093"></a><a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">00093</a> <a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a>
-<a name="l00094"></a>00094 }; <span class="comment">// error_mode</span>
-<a name="l00095"></a>00095
-<a name="l00097"></a><a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde018789">00097</a> <span class="keyword">enum</span> <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a> {
-<a name="l00098"></a>00098 <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a>,
-<a name="l00099"></a>00099 <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a>,
-<a name="l00100"></a>00100 <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a>,
-<a name="l00101"></a>00101 <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a>,
-<a name="l00102"></a>00102 <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a>,
-<a name="l00103"></a><a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">00103</a> <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a>
-<a name="l00104"></a>00104 }; <span class="comment">// error_code</span>
-<a name="l00105"></a>00105
-<a name="l00107"></a>00107 <a class="code" href="a00324.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a>( <a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode = <a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a> );
-<a name="l00108"></a>00108
-<a name="l00110"></a>00110
-<a name="l00115"></a>00115 <a class="code" href="a00324.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a>(
-<a name="l00116"></a>00116 <span class="keywordtype">char</span> <span class="keyword">const</span> * path[],
-<a name="l00117"></a>00117 <span class="keywordtype">int</span> min_ver = TBB_INTERFACE_VERSION,
-<a name="l00118"></a>00118 <span class="keywordtype">int</span> max_ver = INT_MAX,
-<a name="l00119"></a>00119 <a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode = <a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a>
-<a name="l00120"></a>00120 );
-<a name="l00121"></a>00121
-<a name="l00123"></a>00123 <a class="code" href="a00324.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a>();
-<a name="l00124"></a>00124
-<a name="l00126"></a>00126
-<a name="l00150"></a>00150 <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a>
-<a name="l00151"></a>00151 <a class="code" href="a00324.html#5f3f6f1683386705a6931acae45f0862">load</a>(
-<a name="l00152"></a>00152 <span class="keywordtype">char</span> <span class="keyword">const</span> * path[],
-<a name="l00153"></a>00153 <span class="keywordtype">int</span> min_ver = TBB_INTERFACE_VERSION,
-<a name="l00154"></a>00154 <span class="keywordtype">int</span> max_ver = INT_MAX
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156 );
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158
-<a name="l00160"></a>00160
-<a name="l00163"></a>00163 <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a> <a class="code" href="a00324.html#78d938ed2e54d38dd38d6609e6c60389">status</a>();
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="keyword">private</span>:
-<a name="l00166"></a>00166
-<a name="l00167"></a>00167 <a class="code" href="a00324.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> <span class="keyword">const</span> my_mode;
-<a name="l00168"></a>00168 <a class="code" href="a00324.html#6831be91cdc64e57e565ce0dde018789">error_code</a> my_status;
-<a name="l00169"></a>00169 <span class="keywordtype">bool</span> my_loaded;
-<a name="l00170"></a>00170
-<a name="l00171"></a>00171 }; <span class="comment">// class runtime_loader</span>
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 } <span class="comment">// namespace interface6</span>
-<a name="l00174"></a>00174
-<a name="l00175"></a>00175 <span class="keyword">using</span> interface6::runtime_loader;
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 } <span class="comment">// namespace tbb</span>
-<a name="l00178"></a>00178
-<a name="l00179"></a>00179 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_runtime_loader_H */</span>
-<a name="l00180"></a>00180
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00608.html b/doc/html/a00608.html
deleted file mode 100644
index bac772f..0000000
--- a/doc/html/a00608.html
+++ /dev/null
@@ -1,275 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>scalable_allocator.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>scalable_allocator.h</h1><a href="a00392.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_scalable_allocator_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_scalable_allocator_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <stddef.h></span> <span class="comment">/* Need ptrdiff_t and size_t from here. */</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#if !_MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include <stdint.h></span> <span class="comment">/* Need intptr_t from here. */</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#endif</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span>
-<a name="l00030"></a>00030 <span class="preprocessor">#if !defined(__cplusplus) && __ICC==1100</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 991)</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span>
-<a name="l00035"></a>00035 <span class="preprocessor">#ifdef __cplusplus</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
-<a name="l00037"></a>00037 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="preprocessor">#if _MSC_VER >= 1400</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC __cdecl</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span>
-<a name="l00047"></a>00047 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00428.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size);
-<a name="l00048"></a>00048
-<a name="l00051"></a>00051 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00428.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (<span class="keywordtype">void</span>* ptr);
-<a name="l00052"></a>00052
-<a name="l00055"></a>00055 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00428.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size);
-<a name="l00056"></a>00056
-<a name="l00059"></a>00059 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00428.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size);
-<a name="l00060"></a>00060
-<a name="l00063"></a>00063 <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00428.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (<span class="keywordtype">void</span>** memptr, size_t alignment, size_t size);
-<a name="l00064"></a>00064
-<a name="l00067"></a>00067 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00428.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment);
-<a name="l00068"></a>00068
-<a name="l00071"></a>00071 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00428.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size, size_t alignment);
-<a name="l00072"></a>00072
-<a name="l00075"></a>00075 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00428.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (<span class="keywordtype">void</span>* ptr);
-<a name="l00076"></a>00076
-<a name="l00081"></a>00081 size_t __TBB_EXPORTED_FUNC <a class="code" href="a00428.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (<span class="keywordtype">void</span>* ptr);
-<a name="l00082"></a>00082
-<a name="l00083"></a>00083 <span class="preprocessor">#ifdef __cplusplus</span>
-<a name="l00084"></a>00084 <span class="preprocessor"></span>} <span class="comment">/* extern "C" */</span>
-<a name="l00085"></a>00085 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
-<a name="l00086"></a>00086
-<a name="l00087"></a>00087 <span class="preprocessor">#ifdef __cplusplus</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span>
-<a name="l00089"></a><a class="code" href="a00411.html">00089</a> <span class="keyword">namespace </span>rml {
-<a name="l00090"></a>00090 <span class="keyword">class </span>MemoryPool;
-<a name="l00091"></a>00091
-<a name="l00092"></a>00092 <span class="keyword">typedef</span> <span class="keywordtype">void</span> *(*rawAllocType)(intptr_t pool_id, size_t &bytes);
-<a name="l00093"></a>00093 <span class="keyword">typedef</span> int (*rawFreeType)(intptr_t pool_id, <span class="keywordtype">void</span>* raw_ptr, size_t raw_bytes);
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <span class="comment">/*</span>
-<a name="l00096"></a>00096 <span class="comment">MemPoolPolicy extension must be compatible with such structure fields layout</span>
-<a name="l00097"></a>00097 <span class="comment"></span>
-<a name="l00098"></a>00098 <span class="comment">struct MemPoolPolicy {</span>
-<a name="l00099"></a>00099 <span class="comment"> rawAllocType pAlloc;</span>
-<a name="l00100"></a>00100 <span class="comment"> rawFreeType pFree;</span>
-<a name="l00101"></a>00101 <span class="comment"> size_t granularity; // granularity of pAlloc allocations</span>
-<a name="l00102"></a>00102 <span class="comment">};</span>
-<a name="l00103"></a>00103 <span class="comment">*/</span>
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keyword">struct </span>MemPoolPolicy {
-<a name="l00106"></a>00106 <span class="keyword">enum</span> {
-<a name="l00107"></a>00107 VERSION = 1
-<a name="l00108"></a>00108 };
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 rawAllocType pAlloc;
-<a name="l00111"></a>00111 rawFreeType pFree;
-<a name="l00112"></a>00112 <span class="comment">// granularity of pAlloc allocations. 0 means default used.</span>
-<a name="l00113"></a>00113 size_t granularity;
-<a name="l00114"></a>00114 <span class="keywordtype">int</span> version;
-<a name="l00115"></a>00115 <span class="comment">// all memory consumed at 1st pAlloc call and never returned,</span>
-<a name="l00116"></a>00116 <span class="comment">// no more pAlloc calls after 1st</span>
-<a name="l00117"></a>00117 <span class="keywordtype">unsigned</span> fixedPool : 1,
-<a name="l00118"></a>00118 <span class="comment">// memory consumed but returned only at pool termination</span>
-<a name="l00119"></a>00119 keepAllMemory : 1,
-<a name="l00120"></a>00120 reserved : 30;
-<a name="l00121"></a>00121
-<a name="l00122"></a>00122 MemPoolPolicy(rawAllocType pAlloc_, rawFreeType pFree_,
-<a name="l00123"></a>00123 size_t granularity_ = 0, <span class="keywordtype">bool</span> fixedPool_ = <span class="keyword">false</span>,
-<a name="l00124"></a>00124 <span class="keywordtype">bool</span> keepAllMemory_ = <span class="keyword">false</span>) :
-<a name="l00125"></a>00125 pAlloc(pAlloc_), pFree(pFree_), granularity(granularity_), version(VERSION),
-<a name="l00126"></a>00126 fixedPool(fixedPool_), keepAllMemory(keepAllMemory_),
-<a name="l00127"></a>00127 reserved(0) {}
-<a name="l00128"></a>00128 };
-<a name="l00129"></a>00129
-<a name="l00130"></a>00130 <span class="keyword">enum</span> MemPoolError {
-<a name="l00131"></a>00131 POOL_OK, <span class="comment">// pool created successfully</span>
-<a name="l00132"></a>00132 INVALID_POLICY, <span class="comment">// invalid policy parameters found</span>
-<a name="l00133"></a>00133 UNSUPPORTED_POLICY, <span class="comment">// requested pool policy is not supported by allocator library</span>
-<a name="l00134"></a>00134 NO_MEMORY <span class="comment">// lack of memory during pool creation</span>
-<a name="l00135"></a>00135 };
-<a name="l00136"></a>00136
-<a name="l00137"></a>00137 MemPoolError pool_create_v1(intptr_t pool_id, <span class="keyword">const</span> MemPoolPolicy *policy,
-<a name="l00138"></a>00138 rml::MemoryPool **pool);
-<a name="l00139"></a>00139
-<a name="l00140"></a>00140 <span class="keywordtype">bool</span> pool_destroy(MemoryPool* memPool);
-<a name="l00141"></a>00141 <span class="keywordtype">void</span> *pool_malloc(MemoryPool* memPool, size_t size);
-<a name="l00142"></a>00142 <span class="keywordtype">void</span> *pool_realloc(MemoryPool* memPool, <span class="keywordtype">void</span> *object, size_t size);
-<a name="l00143"></a>00143 <span class="keywordtype">void</span> *pool_aligned_malloc(MemoryPool* mPool, size_t size, size_t alignment);
-<a name="l00144"></a>00144 <span class="keywordtype">void</span> *pool_aligned_realloc(MemoryPool* mPool, <span class="keywordtype">void</span> *ptr, size_t size, size_t alignment);
-<a name="l00145"></a>00145 <span class="keywordtype">bool</span> pool_reset(MemoryPool* memPool);
-<a name="l00146"></a>00146 <span class="keywordtype">bool</span> pool_free(MemoryPool *memPool, <span class="keywordtype">void</span> *object);
-<a name="l00147"></a>00147 }
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 <span class="preprocessor">#include <new></span> <span class="comment">/* To use new with the placement argument */</span>
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 <span class="comment">/* Ensure that including this header does not cause implicit linkage with TBB */</span>
-<a name="l00152"></a>00152 <span class="preprocessor">#ifndef __TBB_NO_IMPLICIT_LINKAGE</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00154"></a>00154 <span class="preprocessor"></span><span class="preprocessor"> #include "tbb_stddef.h"</span>
-<a name="l00155"></a>00155 <span class="preprocessor"> #undef __TBB_NO_IMPLICIT_LINKAGE</span>
-<a name="l00156"></a>00156 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00157"></a>00157 <span class="preprocessor"></span><span class="preprocessor"> #include "tbb_stddef.h"</span>
-<a name="l00158"></a>00158 <span class="preprocessor">#endif</span>
-<a name="l00159"></a>00159 <span class="preprocessor"></span>
-<a name="l00160"></a>00160 <span class="preprocessor">#if __TBB_CPP11_RVALUE_REF_PRESENT && !__TBB_CPP11_STD_FORWARD_BROKEN</span>
-<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor"> #include <utility></span> <span class="comment">// std::forward</span>
-<a name="l00162"></a>00162 <span class="preprocessor">#endif</span>
-<a name="l00163"></a>00163 <span class="preprocessor"></span>
-<a name="l00164"></a>00164 <span class="keyword">namespace </span>tbb {
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
-<a name="l00168"></a>00168 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00169"></a>00169 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span>
-<a name="l00173"></a>00173
-<a name="l00176"></a>00176 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00177"></a><a class="code" href="a00325.html">00177</a> <span class="keyword">class </span><a class="code" href="a00325.html">scalable_allocator</a> {
-<a name="l00178"></a>00178 <span class="keyword">public</span>:
-<a name="l00179"></a>00179 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
-<a name="l00180"></a>00180 <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00181"></a>00181 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00182"></a>00182 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00183"></a>00183 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00184"></a>00184 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00185"></a>00185 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00186"></a>00186 <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00187"></a>00187 <span class="keyword">typedef</span> <a class="code" href="a00325.html">scalable_allocator<U></a> other;
-<a name="l00188"></a>00188 };
-<a name="l00189"></a>00189
-<a name="l00190"></a>00190 <a class="code" href="a00325.html">scalable_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00191"></a>00191 <a class="code" href="a00325.html">scalable_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00325.html">scalable_allocator</a>& ) <span class="keywordflow">throw</span>() {}
-<a name="l00192"></a>00192 <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00325.html">scalable_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00325.html">scalable_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00195"></a>00195 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00196"></a>00196
-<a name="l00198"></a><a class="code" href="a00325.html#726b1586d05d44665a36e1c7b2699bfd">00198</a> pointer <a class="code" href="a00325.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> =0 ) {
-<a name="l00199"></a>00199 <span class="keywordflow">return</span> static_cast<pointer>( <a class="code" href="a00428.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a>( n * <span class="keyword">sizeof</span>(value_type) ) );
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201
-<a name="l00203"></a><a class="code" href="a00325.html#f806a238c18cbcfb531e1e0a0d2ec59d">00203</a> <span class="keywordtype">void</span> <a class="code" href="a00325.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>( pointer p, size_type ) {
-<a name="l00204"></a>00204 <a class="code" href="a00428.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
-<a name="l00205"></a>00205 }
-<a name="l00206"></a>00206
-<a name="l00208"></a><a class="code" href="a00325.html#880e766f1d913988c21973dbdd874fd5">00208</a> size_type <a class="code" href="a00325.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const throw() {
-<a name="l00209"></a>00209 size_type absolutemax = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
-<a name="l00210"></a>00210 <span class="keywordflow">return</span> (absolutemax > 0 ? absolutemax : 1);
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212 <span class="preprocessor">#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00213"></a>00213 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span>... Args>
-<a name="l00214"></a>00214 <span class="keywordtype">void</span> construct(pointer p, Args&&... args)
-<a name="l00215"></a>00215 <span class="preprocessor">#if __TBB_CPP11_STD_FORWARD_BROKEN</span>
-<a name="l00216"></a>00216 <span class="preprocessor"></span> { ::new((<span class="keywordtype">void</span> *)p) T((args)...); }
-<a name="l00217"></a>00217 <span class="preprocessor"> #else</span>
-<a name="l00218"></a>00218 <span class="preprocessor"></span> { ::new((<span class="keywordtype">void</span> *)p) T(std::forward<Args>(args)...); }
-<a name="l00219"></a>00219 <span class="preprocessor">#endif</span>
-<a name="l00220"></a>00220 <span class="preprocessor"></span><span class="preprocessor">#else // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00221"></a>00221 <span class="preprocessor"></span> <span class="keywordtype">void</span> construct( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
-<a name="l00222"></a>00222 <span class="preprocessor">#endif // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00223"></a>00223 <span class="preprocessor"></span> <span class="keywordtype">void</span> destroy( pointer p ) {p->~value_type();}
-<a name="l00224"></a>00224 };
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00228"></a>00228 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00229"></a>00229 <span class="preprocessor"></span>
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 <span class="keyword">template</span><>
-<a name="l00233"></a><a class="code" href="a00326.html">00233</a> <span class="keyword">class </span><a class="code" href="a00325.html">scalable_allocator</a><void> {
-<a name="l00234"></a>00234 <span class="keyword">public</span>:
-<a name="l00235"></a>00235 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00236"></a>00236 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00237"></a>00237 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00238"></a>00238 <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00239"></a>00239 <span class="keyword">typedef</span> <a class="code" href="a00325.html">scalable_allocator<U></a> other;
-<a name="l00240"></a>00240 };
-<a name="l00241"></a>00241 };
-<a name="l00242"></a>00242
-<a name="l00243"></a>00243 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00244"></a>00244 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00325.html">scalable_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00325.html">scalable_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00245"></a>00245
-<a name="l00246"></a>00246 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00247"></a>00247 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> scalable_allocator<T>&, <span class="keyword">const</span> scalable_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00248"></a>00248
-<a name="l00249"></a>00249 } <span class="comment">// namespace tbb</span>
-<a name="l00250"></a>00250
-<a name="l00251"></a>00251 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00252"></a>00252 <span class="preprocessor"></span><span class="preprocessor"> #if (__TBB_BUILD || __TBBMALLOC_BUILD) && !defined(__TBBMALLOC_NO_IMPLICIT_LINKAGE)</span>
-<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor"> #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00254"></a>00254 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00255"></a>00255 <span class="preprocessor"></span>
-<a name="l00256"></a>00256 <span class="preprocessor"> #if !__TBBMALLOC_NO_IMPLICIT_LINKAGE</span>
-<a name="l00257"></a>00257 <span class="preprocessor"></span><span class="preprocessor"> #ifdef _DEBUG</span>
-<a name="l00258"></a>00258 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, "tbbmalloc_debug.lib")</span>
-<a name="l00259"></a>00259 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00260"></a>00260 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, "tbbmalloc.lib")</span>
-<a name="l00261"></a>00261 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00262"></a>00262 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00263"></a>00263 <span class="preprocessor"></span>
-<a name="l00264"></a>00264
-<a name="l00265"></a>00265 <span class="preprocessor">#endif</span>
-<a name="l00266"></a>00266 <span class="preprocessor"></span>
-<a name="l00267"></a>00267 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
-<a name="l00268"></a>00268
-<a name="l00269"></a>00269 <span class="preprocessor">#if !defined(__cplusplus) && __ICC==1100</span>
-<a name="l00270"></a>00270 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00271"></a>00271 <span class="preprocessor"></span><span class="preprocessor">#endif // ICC 11.0 warning 991 is back</span>
-<a name="l00272"></a>00272 <span class="preprocessor"></span>
-<a name="l00273"></a>00273 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_scalable_allocator_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00611.html b/doc/html/a00611.html
deleted file mode 100644
index 5a8b6e3..0000000
--- a/doc/html/a00611.html
+++ /dev/null
@@ -1,192 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>spin_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>spin_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_spin_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_spin_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <cstddef></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <new></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">namespace </span>tbb {
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034
-<a name="l00039"></a><a class="code" href="a00331.html">00039</a> <span class="keyword">class </span><a class="code" href="a00331.html">spin_mutex</a> {
-<a name="l00041"></a>00041 __TBB_atomic_flag flag;
-<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <span class="keyword">public</span>:
-<a name="l00045"></a>00045
-<a name="l00046"></a><a class="code" href="a00331.html#3d8fb44644fd8d41ada1fbeba7409be3">00046</a> <a class="code" href="a00331.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>() : flag(0) {
-<a name="l00047"></a>00047 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span> internal_construct();
-<a name="l00049"></a>00049 <span class="preprocessor">#endif</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span> }
-<a name="l00051"></a>00051
-<a name="l00053"></a><a class="code" href="a00332.html">00053</a> <span class="keyword">class </span><a class="code" href="a00332.html">scoped_lock</a> : internal::no_copy {
-<a name="l00054"></a>00054 <span class="keyword">private</span>:
-<a name="l00056"></a>00056 <a class="code" href="a00331.html">spin_mutex</a>* my_mutex;
-<a name="l00057"></a>00057
-<a name="l00059"></a>00059 __TBB_Flag my_unlock_value;
-<a name="l00060"></a>00060
-<a name="l00062"></a>00062 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00331.html">spin_mutex</a>& m );
-<a name="l00063"></a>00063
-<a name="l00065"></a>00065 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00331.html">spin_mutex</a>& m );
-<a name="l00066"></a>00066
-<a name="l00068"></a>00068 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
-<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00331.html">spin_mutex</a>;
-<a name="l00071"></a>00071
-<a name="l00072"></a>00072 <span class="keyword">public</span>:
-<a name="l00074"></a><a class="code" href="a00332.html#29ae680ae7f5e685c2e15535b9c855b3">00074</a> <a class="code" href="a00332.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>() : my_mutex(NULL), my_unlock_value(0) {}
-<a name="l00075"></a>00075
-<a name="l00077"></a><a class="code" href="a00332.html#5ce6807050a9e8f87bcb4a65dccb12ef">00077</a> <a class="code" href="a00332.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>( <a class="code" href="a00331.html">spin_mutex</a>& m ) {
-<a name="l00078"></a>00078 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00079"></a>00079 <span class="preprocessor"></span> my_mutex=NULL;
-<a name="l00080"></a>00080 internal_acquire(m);
-<a name="l00081"></a>00081 <span class="preprocessor">#else</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span> my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00331.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>);
-<a name="l00083"></a>00083 my_mutex=&m;
-<a name="l00084"></a>00084 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/</span>
-<a name="l00085"></a>00085 }
-<a name="l00086"></a>00086
-<a name="l00088"></a><a class="code" href="a00332.html#3ee3c338732b1f64b0b32a757807a30d">00088</a> <span class="keywordtype">void</span> <a class="code" href="a00332.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>( <a class="code" href="a00331.html">spin_mutex</a>& m ) {
-<a name="l00089"></a>00089 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span> internal_acquire(m);
-<a name="l00091"></a>00091 <span class="preprocessor">#else</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span> my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00331.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>);
-<a name="l00093"></a>00093 my_mutex = &m;
-<a name="l00094"></a>00094 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/</span>
-<a name="l00095"></a>00095 }
-<a name="l00096"></a>00096
-<a name="l00098"></a>00098
-<a name="l00099"></a><a class="code" href="a00332.html#9297ec188534b45dc0ca48f2f39a0501">00099</a> <span class="keywordtype">bool</span> <a class="code" href="a00332.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>( <a class="code" href="a00331.html">spin_mutex</a>& m ) {
-<a name="l00100"></a>00100 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal_try_acquire(m);
-<a name="l00102"></a>00102 <span class="preprocessor">#else</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = __TBB_TryLockByte(m.<a class="code" href="a00331.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>);
-<a name="l00104"></a>00104 <span class="keywordflow">if</span>( result ) {
-<a name="l00105"></a>00105 my_unlock_value = 0;
-<a name="l00106"></a>00106 my_mutex = &m;
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108 <span class="keywordflow">return</span> result;
-<a name="l00109"></a>00109 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/</span>
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111
-<a name="l00113"></a><a class="code" href="a00332.html#eeb615e68e963e6bf8d9c11402d0ce8e">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00332.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>() {
-<a name="l00114"></a>00114 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span> internal_release();
-<a name="l00116"></a>00116 <span class="preprocessor">#else</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span> __TBB_UnlockByte(my_mutex-><a class="code" href="a00331.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>, my_unlock_value);
-<a name="l00118"></a>00118 my_mutex = NULL;
-<a name="l00119"></a>00119 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00120"></a>00120 }
-<a name="l00121"></a>00121
-<a name="l00123"></a><a class="code" href="a00332.html#ac6fa425d1f06c56d8b70abc51aac844">00123</a> <a class="code" href="a00332.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>() {
-<a name="l00124"></a>00124 <span class="keywordflow">if</span>( my_mutex ) {
-<a name="l00125"></a>00125 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span> internal_release();
-<a name="l00127"></a>00127 <span class="preprocessor">#else</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span> __TBB_UnlockByte(my_mutex-><a class="code" href="a00331.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>, my_unlock_value);
-<a name="l00129"></a>00129 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131 }
-<a name="l00132"></a>00132 };
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 <span class="comment">// Mutex traits</span>
-<a name="l00137"></a>00137 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00138"></a>00138 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00139"></a>00139 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">false</span>;
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="comment">// ISO C++0x compatibility methods</span>
-<a name="l00142"></a>00142
-<a name="l00144"></a><a class="code" href="a00331.html#4f748989e19b6045e3a2d2ee73626a28">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00331.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>() {
-<a name="l00145"></a>00145 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span> <a class="code" href="a00253.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00147"></a>00147 <span class="keyword">new</span>(tmp.<a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00332.html">scoped_lock</a>(*<span class="keyword">this</span>);
-<a name="l00148"></a>00148 <span class="preprocessor">#else</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span> __TBB_LockByte(flag);
-<a name="l00150"></a>00150 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS*/</span>
-<a name="l00151"></a>00151 }
-<a name="l00152"></a>00152
-<a name="l00154"></a>00154
-<a name="l00155"></a><a class="code" href="a00331.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">00155</a> <span class="keywordtype">bool</span> <a class="code" href="a00331.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>() {
-<a name="l00156"></a>00156 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00157"></a>00157 <span class="preprocessor"></span> <a class="code" href="a00253.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00158"></a>00158 <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00332.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
-<a name="l00159"></a>00159 <span class="preprocessor">#else</span>
-<a name="l00160"></a>00160 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_TryLockByte(flag);
-<a name="l00161"></a>00161 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS*/</span>
-<a name="l00162"></a>00162 }
-<a name="l00163"></a>00163
-<a name="l00165"></a><a class="code" href="a00331.html#0e843ee6265f57f27d228ba91e7308ef">00165</a> <span class="keywordtype">void</span> <a class="code" href="a00331.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>() {
-<a name="l00166"></a>00166 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span> <a class="code" href="a00253.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00168"></a>00168 <a class="code" href="a00332.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00253.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00169"></a>00169 s.<a class="code" href="a00332.html#d968921bed018503214f36e09007ee7b">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00170"></a>00170 s.<a class="code" href="a00332.html#96af1c1af58988d527102379c3d4c831">my_unlock_value</a> = 0;
-<a name="l00171"></a>00171 s.<a class="code" href="a00332.html#8f4d19aa2d6d112034d281eed0dab5fa">internal_release</a>();
-<a name="l00172"></a>00172 <span class="preprocessor">#else</span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span> __TBB_store_with_release(flag, 0);
-<a name="l00174"></a>00174 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
-<a name="l00175"></a>00175 }
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00178"></a>00178 };
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 __TBB_DEFINE_PROFILING_SET_NAME(spin_mutex)
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 } <span class="comment">// namespace tbb</span>
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_spin_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00612.html b/doc/html/a00612.html
deleted file mode 100644
index 19d61ed..0000000
--- a/doc/html/a00612.html
+++ /dev/null
@@ -1,216 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>spin_rw_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>spin_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_spin_rw_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_spin_rw_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">class </span>spin_rw_mutex_v3;
-<a name="l00031"></a>00031 <span class="keyword">typedef</span> spin_rw_mutex_v3 spin_rw_mutex;
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034
-<a name="l00035"></a><a class="code" href="a00333.html">00035</a> <span class="keyword">class </span><a class="code" href="a00333.html">spin_rw_mutex_v3</a> {
-<a name="l00037"></a>00037
-<a name="l00039"></a>00039 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_acquire_writer();
-<a name="l00040"></a>00040
-<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release_writer();
-<a name="l00044"></a>00044
-<a name="l00046"></a>00046 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire_reader();
-<a name="l00047"></a>00047
-<a name="l00049"></a>00049 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_upgrade();
-<a name="l00050"></a>00050
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_downgrade();
-<a name="l00054"></a>00054
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release_reader();
-<a name="l00057"></a>00057
-<a name="l00059"></a>00059 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire_writer();
-<a name="l00060"></a>00060
-<a name="l00062"></a>00062 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire_reader();
-<a name="l00063"></a>00063
-<a name="l00065"></a>00065 <span class="keyword">public</span>:
-<a name="l00067"></a><a class="code" href="a00333.html#61332b2756de89f3f5f69310cbb6e70c">00067</a> <a class="code" href="a00333.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>() : state(0) {
-<a name="l00068"></a>00068 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00069"></a>00069 <span class="preprocessor"></span> internal_construct();
-<a name="l00070"></a>00070 <span class="preprocessor">#endif</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span> }
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00075"></a><a class="code" href="a00333.html#9a815fb2759e55072ed413f1b6970cf3">00075</a> <span class="preprocessor"> ~spin_rw_mutex_v3() {</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span> __TBB_ASSERT( !state, <span class="stringliteral">"destruction of an acquired mutex"</span>);
-<a name="l00077"></a>00077 };
-<a name="l00078"></a>00078 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00079"></a>00079
-<a name="l00081"></a>00081
-<a name="l00083"></a><a class="code" href="a00334.html">00083</a> <span class="keyword">class </span><a class="code" href="a00334.html">scoped_lock</a> : internal::no_copy {
-<a name="l00084"></a>00084 <span class="keyword">public</span>:
-<a name="l00086"></a>00086
-<a name="l00087"></a><a class="code" href="a00334.html#d6ea60dee5563f702379bf5e51aa8806">00087</a> <a class="code" href="a00334.html">scoped_lock</a>() : <a class="code" href="a00301.html">mutex</a>(NULL), is_writer(false) {}
-<a name="l00088"></a>00088
-<a name="l00090"></a><a class="code" href="a00334.html#42a92d4f8fdde425b111cfa8a9228071">00090</a> <a class="code" href="a00334.html">scoped_lock</a>( <a class="code" href="a00333.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) : <a class="code" href="a00301.html">mutex</a>(NULL) {
-<a name="l00091"></a>00091 <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>(m, write);
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093
-<a name="l00095"></a><a class="code" href="a00334.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">00095</a> <a class="code" href="a00319.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
-<a name="l00096"></a>00096 <span class="keywordflow">if</span>( <a class="code" href="a00301.html">mutex</a> ) <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
-<a name="l00097"></a>00097 }
-<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00334.html#b0b646ec5be02a127d159bbb7ca65353">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00333.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00101"></a>00101 __TBB_ASSERT( !<a class="code" href="a00301.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
-<a name="l00102"></a>00102 is_writer = write;
-<a name="l00103"></a>00103 <a class="code" href="a00301.html">mutex</a> = &m;
-<a name="l00104"></a>00104 <span class="keywordflow">if</span>( write ) <a class="code" href="a00301.html">mutex</a>->internal_acquire_writer();
-<a name="l00105"></a>00105 <span class="keywordflow">else</span> <a class="code" href="a00301.html">mutex</a>->internal_acquire_reader();
-<a name="l00106"></a>00106 }
-<a name="l00107"></a>00107
-<a name="l00109"></a>00109
-<a name="l00110"></a><a class="code" href="a00334.html#3f0b1e3f2efab63336400348bd070226">00110</a> <span class="keywordtype">bool</span> upgrade_to_writer() {
-<a name="l00111"></a>00111 __TBB_ASSERT( <a class="code" href="a00301.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00112"></a>00112 __TBB_ASSERT( !is_writer, <span class="stringliteral">"not a reader"</span> );
-<a name="l00113"></a>00113 is_writer = <span class="keyword">true</span>;
-<a name="l00114"></a>00114 <span class="keywordflow">return</span> <a class="code" href="a00301.html">mutex</a>->internal_upgrade();
-<a name="l00115"></a>00115 }
-<a name="l00116"></a>00116
-<a name="l00118"></a><a class="code" href="a00334.html#61b14d00a78185c9b2d206ebfc379124">00118</a> <span class="keywordtype">void</span> <a class="code" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00119"></a>00119 __TBB_ASSERT( <a class="code" href="a00301.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00120"></a>00120 <a class="code" href="a00333.html">spin_rw_mutex</a> *m = <a class="code" href="a00301.html">mutex</a>;
-<a name="l00121"></a>00121 <a class="code" href="a00301.html">mutex</a> = NULL;
-<a name="l00122"></a>00122 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00123"></a>00123 <span class="preprocessor"></span> <span class="keywordflow">if</span>( is_writer ) m->internal_release_writer();
-<a name="l00124"></a>00124 <span class="keywordflow">else</span> m->internal_release_reader();
-<a name="l00125"></a>00125 <span class="preprocessor">#else</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span> <span class="keywordflow">if</span>( is_writer ) __TBB_AtomicAND( &m-><a class="code" href="a00333.html#621b900d5fef23d2e401aabcbb777c76">state</a>, READERS );
-<a name="l00127"></a>00127 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &m-><a class="code" href="a00333.html#621b900d5fef23d2e401aabcbb777c76">state</a>, -(intptr_t)ONE_READER);
-<a name="l00128"></a>00128 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130
-<a name="l00132"></a><a class="code" href="a00334.html#c2c2c38a08cb9080e87099fac3e5bc94">00132</a> <span class="keywordtype">bool</span> downgrade_to_reader() {
-<a name="l00133"></a>00133 __TBB_ASSERT( <a class="code" href="a00301.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00134"></a>00134 __TBB_ASSERT( is_writer, <span class="stringliteral">"not a writer"</span> );
-<a name="l00135"></a>00135 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span> <a class="code" href="a00301.html">mutex</a>->internal_downgrade();
-<a name="l00137"></a>00137 <span class="preprocessor">#else</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span> __TBB_FetchAndAddW( &<a class="code" href="a00301.html">mutex</a>->state, ((intptr_t)ONE_READER-WRITER));
-<a name="l00139"></a>00139 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00140"></a>00140 is_writer = <span class="keyword">false</span>;
-<a name="l00141"></a>00141 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143
-<a name="l00145"></a><a class="code" href="a00334.html#9879626968d9b9a04cd2ec0fb2e84ae1">00145</a> <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00333.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00146"></a>00146 __TBB_ASSERT( !<a class="code" href="a00301.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
-<a name="l00147"></a>00147 <span class="keywordtype">bool</span> result;
-<a name="l00148"></a>00148 is_writer = write;
-<a name="l00149"></a>00149 result = write? m.internal_try_acquire_writer()
-<a name="l00150"></a>00150 : m.internal_try_acquire_reader();
-<a name="l00151"></a>00151 <span class="keywordflow">if</span>( result )
-<a name="l00152"></a>00152 <a class="code" href="a00301.html">mutex</a> = &m;
-<a name="l00153"></a>00153 <span class="keywordflow">return</span> result;
-<a name="l00154"></a>00154 }
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156 <span class="keyword">protected</span>:
-<a name="l00158"></a><a class="code" href="a00334.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">00158</a> <a class="code" href="a00333.html">spin_rw_mutex</a>* <a class="code" href="a00301.html">mutex</a>;
-<a name="l00159"></a>00159
-<a name="l00161"></a>00161
-<a name="l00162"></a><a class="code" href="a00334.html#6b5a7c3c67a36b05c4df8410d32627d8">00162</a> <span class="keywordtype">bool</span> is_writer;
-<a name="l00163"></a>00163 };
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="comment">// Mutex traits</span>
-<a name="l00166"></a>00166 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;
-<a name="l00167"></a>00167 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00168"></a>00168 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">false</span>;
-<a name="l00169"></a>00169
-<a name="l00170"></a>00170 <span class="comment">// ISO C++0x compatibility methods</span>
-<a name="l00171"></a>00171
-<a name="l00173"></a><a class="code" href="a00333.html#4007d6e1523dbc3c2bb7f889ab789a8a">00173</a> <span class="keywordtype">void</span> lock() {internal_acquire_writer();}
-<a name="l00174"></a>00174
-<a name="l00176"></a>00176
-<a name="l00177"></a><a class="code" href="a00333.html#088bb256be794cc47d3b83791632fdfc">00177</a> <span class="keywordtype">bool</span> try_lock() {<span class="keywordflow">return</span> internal_try_acquire_writer();}
-<a name="l00178"></a>00178
-<a name="l00180"></a><a class="code" href="a00333.html#f9f52ead2098eb5fb12da59d5ae53b55">00180</a> <span class="keywordtype">void</span> unlock() {
-<a name="l00181"></a>00181 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) internal_release_writer();
-<a name="l00183"></a>00183 <span class="keywordflow">else</span> internal_release_reader();
-<a name="l00184"></a>00184 <span class="preprocessor">#else</span>
-<a name="l00185"></a>00185 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) __TBB_AtomicAND( &state, READERS );
-<a name="l00186"></a>00186 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &state, -(intptr_t)ONE_READER);
-<a name="l00187"></a>00187 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00188"></a>00188 }
-<a name="l00189"></a>00189
-<a name="l00190"></a>00190 <span class="comment">// Methods for reader locks that resemble ISO C++0x compatibility methods.</span>
-<a name="l00191"></a>00191
-<a name="l00193"></a><a class="code" href="a00333.html#13f799708ac4ca437a16be202e263e18">00193</a> <span class="keywordtype">void</span> lock_read() {internal_acquire_reader();}
-<a name="l00194"></a>00194
-<a name="l00196"></a>00196
-<a name="l00197"></a><a class="code" href="a00333.html#b8667415869013f840d976aa406d385a">00197</a> <span class="keywordtype">bool</span> try_lock_read() {<span class="keywordflow">return</span> internal_try_acquire_reader();}
-<a name="l00198"></a>00198
-<a name="l00199"></a>00199 <span class="keyword">private</span>:
-<a name="l00200"></a>00200 <span class="keyword">typedef</span> intptr_t state_t;
-<a name="l00201"></a>00201 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER = 1;
-<a name="l00202"></a>00202 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER_PENDING = 2;
-<a name="l00203"></a>00203 <span class="keyword">static</span> <span class="keyword">const</span> state_t READERS = ~(WRITER | WRITER_PENDING);
-<a name="l00204"></a>00204 <span class="keyword">static</span> <span class="keyword">const</span> state_t ONE_READER = 4;
-<a name="l00205"></a>00205 <span class="keyword">static</span> <span class="keyword">const</span> state_t BUSY = WRITER | READERS;
-<a name="l00207"></a>00207
-<a name="l00210"></a>00210 state_t state;
-<a name="l00211"></a>00211
-<a name="l00212"></a>00212 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00213"></a>00213 };
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215 __TBB_DEFINE_PROFILING_SET_NAME(spin_rw_mutex)
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 } <span class="comment">// namespace tbb</span>
-<a name="l00218"></a>00218
-<a name="l00219"></a>00219 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_spin_rw_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00613.html b/doc/html/a00613.html
deleted file mode 100644
index 17b567e..0000000
--- a/doc/html/a00613.html
+++ /dev/null
@@ -1,733 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>task.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>task.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_task_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_task_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <climits></span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">typedef</span> <span class="keyword">struct </span>___itt_caller *__itt_caller;
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="keyword">class </span>task;
-<a name="l00033"></a>00033 <span class="keyword">class </span>task_list;
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="keyword">class </span>task_group_context;
-<a name="l00037"></a>00037 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="comment">// MSVC does not allow taking the address of a member that was defined</span>
-<a name="l00040"></a>00040 <span class="comment">// privately in task_base and made public in class task via a using declaration.</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3)</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TASK_BASE_ACCESS public</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TASK_BASE_ACCESS private</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span>
-<a name="l00047"></a>00047 <span class="keyword">namespace </span>internal {
-<a name="l00048"></a>00048
-<a name="l00049"></a>00049 <span class="keyword">class </span>allocate_additional_child_of_proxy: no_assign {
-<a name="l00051"></a>00051 task* <span class="keyword">self</span>;
-<a name="l00052"></a>00052 task& parent;
-<a name="l00053"></a>00053 <span class="keyword">public</span>:
-<a name="l00054"></a>00054 <span class="keyword">explicit</span> allocate_additional_child_of_proxy( task& parent_ ) : self(NULL), parent(parent_) {}
-<a name="l00055"></a>00055 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00057"></a>00057 };
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 }
-<a name="l00060"></a>00060
-<a name="l00061"></a>00061 <span class="keyword">namespace </span>interface5 {
-<a name="l00062"></a>00062 <span class="keyword">namespace </span>internal {
-<a name="l00064"></a>00064
-<a name="l00069"></a><a class="code" href="a00338.html">00069</a> <span class="keyword">class </span><a class="code" href="a00338.html">task_base</a>: tbb::internal::no_copy {
-<a name="l00070"></a>00070 __TBB_TASK_BASE_ACCESS:
-<a name="l00071"></a>00071 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00337.html">tbb::task</a>;
-<a name="l00072"></a>00072
-<a name="l00074"></a>00074 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00337.html">task</a>& t );
-<a name="l00075"></a>00075
-<a name="l00077"></a>00077 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00341.html">task_list</a>& list );
-<a name="l00078"></a>00078
-<a name="l00080"></a>00080
-<a name="l00082"></a>00082 <span class="keyword">static</span> tbb::internal::allocate_additional_child_of_proxy allocate_additional_child_of( <a class="code" href="a00337.html">task</a>& t ) {
-<a name="l00083"></a>00083 <span class="keywordflow">return</span> tbb::internal::allocate_additional_child_of_proxy(t);
-<a name="l00084"></a>00084 }
-<a name="l00085"></a>00085
-<a name="l00087"></a>00087
-<a name="l00091"></a>00091 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>( <a class="code" href="a00337.html">task</a>& victim );
-<a name="l00092"></a>00092 };
-<a name="l00093"></a>00093 } <span class="comment">// internal</span>
-<a name="l00094"></a>00094 } <span class="comment">// interface5</span>
-<a name="l00095"></a>00095
-<a name="l00097"></a>00097 <span class="keyword">namespace </span>internal {
-<a name="l00098"></a>00098
-<a name="l00099"></a>00099 <span class="keyword">class </span>scheduler: no_copy {
-<a name="l00100"></a>00100 <span class="keyword">public</span>:
-<a name="l00102"></a>00102 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00337.html">task</a>& first, <a class="code" href="a00337.html">task</a>*& next ) = 0;
-<a name="l00103"></a>00103
-<a name="l00105"></a>00105 <span class="keyword">virtual</span> <span class="keywordtype">void</span> wait_for_all( <a class="code" href="a00337.html">task</a>& parent, <a class="code" href="a00337.html">task</a>* child ) = 0;
-<a name="l00106"></a>00106
-<a name="l00108"></a>00108 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00337.html">task</a>& first, <a class="code" href="a00337.html">task</a>*& next ) = 0;
-<a name="l00109"></a>00109
-<a name="l00111"></a>00111 <span class="comment">// Have to have it just to shut up overzealous compilation warnings</span>
-<a name="l00112"></a>00112 <span class="keyword">virtual</span> ~scheduler() = 0;
-<a name="l00113"></a>00113
-<a name="l00115"></a>00115 <span class="keyword">virtual</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00337.html">task</a>& t, <span class="keywordtype">void</span>* reserved ) = 0;
-<a name="l00116"></a>00116 };
-<a name="l00117"></a>00117
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 <span class="keyword">typedef</span> intptr_t reference_count;
-<a name="l00121"></a>00121
-<a name="l00123"></a>00123 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> affinity_id;
-<a name="l00124"></a>00124
-<a name="l00125"></a>00125 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span> <span class="keyword">class </span>generic_scheduler;
-<a name="l00127"></a>00127
-<a name="l00128"></a>00128 <span class="keyword">struct </span>context_list_node_t {
-<a name="l00129"></a>00129 context_list_node_t *my_prev,
-<a name="l00130"></a>00130 *my_next;
-<a name="l00131"></a>00131 };
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="keyword">class </span>allocate_root_with_context_proxy: no_assign {
-<a name="l00134"></a>00134 task_group_context& my_context;
-<a name="l00135"></a>00135 <span class="keyword">public</span>:
-<a name="l00136"></a>00136 allocate_root_with_context_proxy ( task_group_context& ctx ) : my_context(ctx) {}
-<a name="l00137"></a>00137 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00138"></a>00138 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00139"></a>00139 };
-<a name="l00140"></a>00140 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00141"></a>00141
-<a name="l00142"></a>00142 <span class="keyword">class </span>allocate_root_proxy: no_assign {
-<a name="l00143"></a>00143 <span class="keyword">public</span>:
-<a name="l00144"></a>00144 <span class="keyword">static</span> task& __TBB_EXPORTED_FUNC allocate( size_t size );
-<a name="l00145"></a>00145 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC free( task& );
-<a name="l00146"></a>00146 };
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 <span class="keyword">class </span>allocate_continuation_proxy: no_assign {
-<a name="l00149"></a>00149 <span class="keyword">public</span>:
-<a name="l00150"></a>00150 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00151"></a>00151 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00152"></a>00152 };
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <span class="keyword">class </span>allocate_child_proxy: no_assign {
-<a name="l00155"></a>00155 <span class="keyword">public</span>:
-<a name="l00156"></a>00156 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00157"></a>00157 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00158"></a>00158 };
-<a name="l00159"></a>00159
-<a name="l00161"></a>00161
-<a name="l00172"></a>00172 <span class="keyword">class </span>task_prefix {
-<a name="l00173"></a>00173 <span class="keyword">private</span>:
-<a name="l00174"></a>00174 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00337.html">tbb::task</a>;
-<a name="l00175"></a>00175 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00338.html">tbb::interface5::internal::task_base</a>;
-<a name="l00176"></a>00176 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00341.html">tbb::task_list</a>;
-<a name="l00177"></a>00177 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00178"></a>00178 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00179"></a>00179 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00180"></a>00180 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00181"></a>00181 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00182"></a>00182
-<a name="l00183"></a>00183 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00185"></a>00185 <span class="preprocessor"></span>
-<a name="l00188"></a>00188 <span class="preprocessor"> task_group_context *context;</span>
-<a name="l00189"></a>00189 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00190"></a>00190
-<a name="l00192"></a>00192
-<a name="l00197"></a>00197 scheduler* origin;
-<a name="l00198"></a>00198
-<a name="l00199"></a>00199 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
-<a name="l00200"></a>00200 <span class="preprocessor"></span> <span class="keyword">union </span>{
-<a name="l00201"></a>00201 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00203"></a>00203
-<a name="l00205"></a>00205 scheduler* owner;
-<a name="l00206"></a>00206
-<a name="l00207"></a>00207 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
-<a name="l00209"></a>00209 <span class="preprocessor"></span>
-<a name="l00210"></a>00210 <span class="preprocessor"> task* next_offloaded;</span>
-<a name="l00211"></a>00211 <span class="preprocessor"></span> };
-<a name="l00212"></a>00212 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00213"></a>00213
-<a name="l00215"></a>00215
-<a name="l00218"></a>00218 <a class="code" href="a00337.html">tbb::task</a>* parent;
-<a name="l00219"></a>00219
-<a name="l00221"></a>00221
-<a name="l00225"></a>00225 __TBB_atomic reference_count ref_count;
-<a name="l00226"></a>00226
-<a name="l00228"></a>00228
-<a name="l00230"></a>00230 <span class="keywordtype">int</span> depth;
-<a name="l00231"></a>00231
-<a name="l00233"></a>00233
-<a name="l00234"></a>00234 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state;
-<a name="l00235"></a>00235
-<a name="l00237"></a>00237
-<a name="l00243"></a>00243 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> extra_state;
-<a name="l00244"></a>00244
-<a name="l00245"></a>00245 affinity_id affinity;
-<a name="l00246"></a>00246
-<a name="l00248"></a>00248 <a class="code" href="a00337.html">tbb::task</a>* next;
-<a name="l00249"></a>00249
-<a name="l00251"></a>00251 <a class="code" href="a00337.html">tbb::task</a>& task() {<span class="keywordflow">return</span> *reinterpret_cast<tbb::task*>(<span class="keyword">this</span>+1);}
-<a name="l00252"></a>00252 };
-<a name="l00253"></a>00253
-<a name="l00254"></a>00254 } <span class="comment">// namespace internal</span>
-<a name="l00256"></a>00256 <span class="comment"></span>
-<a name="l00257"></a>00257 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00258"></a>00258 <span class="preprocessor"></span>
-<a name="l00259"></a>00259 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
-<a name="l00260"></a>00260 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
-<a name="l00261"></a>00261 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> priority_stride_v4 = INT_MAX / 4;
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263
-<a name="l00264"></a>00264 <span class="keyword">enum</span> priority_t {
-<a name="l00265"></a>00265 priority_normal = internal::priority_stride_v4 * 2,
-<a name="l00266"></a>00266 priority_low = priority_normal - internal::priority_stride_v4,
-<a name="l00267"></a>00267 priority_high = priority_normal + internal::priority_stride_v4
-<a name="l00268"></a>00268 };
-<a name="l00269"></a>00269
-<a name="l00270"></a>00270 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00271"></a>00271
-<a name="l00272"></a>00272 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00273"></a>00273 <span class="preprocessor"></span> <span class="keyword">class </span>tbb_exception;
-<a name="l00274"></a>00274 <span class="preprocessor">#else</span>
-<a name="l00275"></a>00275 <span class="preprocessor"></span> <span class="keyword">namespace </span>internal {
-<a name="l00276"></a>00276 <span class="keyword">class </span>tbb_exception_ptr;
-<a name="l00277"></a>00277 }
-<a name="l00278"></a>00278 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00279"></a>00279
-<a name="l00280"></a>00280 <span class="keyword">class </span>task_scheduler_init;
-<a name="l00281"></a>00281
-<a name="l00283"></a>00283
-<a name="l00303"></a><a class="code" href="a00340.html">00303</a> <span class="keyword">class </span><a class="code" href="a00339.html">task_group_context</a> : internal::no_copy {
-<a name="l00304"></a>00304 <span class="keyword">private</span>:
-<a name="l00305"></a>00305 <span class="keyword">friend</span> <span class="keyword">class </span>internal::generic_scheduler;
-<a name="l00306"></a>00306 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00342.html">task_scheduler_init</a>;
-<a name="l00307"></a>00307
-<a name="l00308"></a>00308 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00309"></a>00309 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00345.html">tbb_exception</a> <a class="code" href="a00345.html">exception_container_type</a>;
-<a name="l00310"></a>00310 <span class="preprocessor">#else</span>
-<a name="l00311"></a>00311 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00346.html">internal::tbb_exception_ptr</a> <a class="code" href="a00345.html">exception_container_type</a>;
-<a name="l00312"></a>00312 <span class="preprocessor">#endif</span>
-<a name="l00313"></a>00313 <span class="preprocessor"></span>
-<a name="l00314"></a>00314 <span class="keyword">enum</span> version_traits_word_layout {
-<a name="l00315"></a>00315 traits_offset = 16,
-<a name="l00316"></a>00316 version_mask = 0xFFFF,
-<a name="l00317"></a>00317 traits_mask = 0xFFFFul << traits_offset
-<a name="l00318"></a>00318 };
-<a name="l00319"></a>00319
-<a name="l00320"></a>00320 <span class="keyword">public</span>:
-<a name="l00321"></a>00321 <span class="keyword">enum</span> kind_type {
-<a name="l00322"></a>00322 isolated,
-<a name="l00323"></a>00323 bound
-<a name="l00324"></a>00324 };
-<a name="l00325"></a>00325
-<a name="l00326"></a>00326 <span class="keyword">enum</span> traits_type {
-<a name="l00327"></a>00327 exact_exception = 0x0001ul << traits_offset,
-<a name="l00328"></a>00328 concurrent_wait = 0x0004ul << traits_offset,
-<a name="l00329"></a>00329 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00330"></a>00330 <span class="preprocessor"></span> default_traits = 0
-<a name="l00331"></a>00331 <span class="preprocessor">#else</span>
-<a name="l00332"></a>00332 <span class="preprocessor"></span> default_traits = exact_exception
-<a name="l00333"></a>00333 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00334"></a>00334 };
-<a name="l00335"></a>00335
-<a name="l00336"></a>00336 <span class="keyword">private</span>:
-<a name="l00337"></a>00337 <span class="keyword">enum</span> state {
-<a name="l00338"></a>00338 may_have_children = 1
-<a name="l00339"></a>00339 };
-<a name="l00340"></a>00340
-<a name="l00341"></a>00341 <span class="keyword">union </span>{
-<a name="l00343"></a>00343 kind_type my_kind;
-<a name="l00344"></a>00344 uintptr_t _my_kind_aligner;
-<a name="l00345"></a>00345 };
-<a name="l00346"></a>00346
-<a name="l00348"></a>00348 <a class="code" href="a00339.html">task_group_context</a> *my_parent;
-<a name="l00349"></a>00349
-<a name="l00351"></a>00351
-<a name="l00353"></a>00353 internal::context_list_node_t my_node;
-<a name="l00354"></a>00354
-<a name="l00356"></a>00356 __itt_caller itt_caller;
-<a name="l00357"></a>00357
-<a name="l00359"></a>00359
-<a name="l00362"></a>00362 <span class="keywordtype">char</span> _leading_padding[internal::NFS_MaxLineSize
-<a name="l00363"></a>00363 - 2 * <span class="keyword">sizeof</span>(uintptr_t)- <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*) - <span class="keyword">sizeof</span>(internal::context_list_node_t)
-<a name="l00364"></a>00364 - <span class="keyword">sizeof</span>(__itt_caller)];
-<a name="l00365"></a>00365
-<a name="l00367"></a>00367 uintptr_t my_cancellation_requested;
-<a name="l00368"></a>00368
-<a name="l00370"></a>00370
-<a name="l00373"></a>00373 uintptr_t my_version_and_traits;
-<a name="l00374"></a>00374
-<a name="l00376"></a>00376 <a class="code" href="a00345.html">exception_container_type</a> *my_exception;
-<a name="l00377"></a>00377
-<a name="l00379"></a>00379 internal::generic_scheduler *my_owner;
-<a name="l00380"></a>00380
-<a name="l00382"></a>00382 uintptr_t my_state;
-<a name="l00383"></a>00383
-<a name="l00384"></a>00384 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
-<a name="l00386"></a>00386 <span class="preprocessor"> intptr_t my_priority;</span>
-<a name="l00387"></a>00387 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00388"></a>00388
-<a name="l00390"></a>00390
-<a name="l00391"></a>00391 <span class="keywordtype">char</span> _trailing_padding[internal::NFS_MaxLineSize - 2 * <span class="keyword">sizeof</span>(uintptr_t) - 2 * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)
-<a name="l00392"></a>00392 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
-<a name="l00393"></a>00393 <span class="preprocessor"></span> - <span class="keyword">sizeof</span>(intptr_t)
-<a name="l00394"></a>00394 #endif <span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00395"></a>00395 ];
-<a name="l00396"></a>00396
-<a name="l00397"></a>00397 <span class="keyword">public</span>:
-<a name="l00399"></a>00399
-<a name="l00427"></a><a class="code" href="a00340.html#19fee08fb8ac98adccfe69c1aa63c491">00427</a> <a class="code" href="a00339.html">task_group_context</a> ( kind_type relation_with_parent = bound,
-<a name="l00428"></a>00428 uintptr_t traits = default_traits )
-<a name="l00429"></a>00429 : my_kind(relation_with_parent)
-<a name="l00430"></a>00430 , my_version_and_traits(1 | traits)
-<a name="l00431"></a>00431 {
-<a name="l00432"></a>00432 init();
-<a name="l00433"></a>00433 }
-<a name="l00434"></a>00434
-<a name="l00435"></a>00435 __TBB_EXPORTED_METHOD ~<a class="code" href="a00339.html">task_group_context</a> ();
-<a name="l00436"></a>00436
-<a name="l00438"></a>00438
-<a name="l00445"></a>00445 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD reset ();
-<a name="l00446"></a>00446
-<a name="l00448"></a>00448
-<a name="l00455"></a>00455 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD cancel_group_execution ();
-<a name="l00456"></a>00456
-<a name="l00458"></a>00458 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_group_execution_cancelled () <span class="keyword">const</span>;
-<a name="l00459"></a>00459
-<a name="l00461"></a>00461
-<a name="l00467"></a>00467 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD register_pending_exception ();
-<a name="l00468"></a>00468
-<a name="l00469"></a>00469 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
-<a name="l00471"></a>00471 <span class="preprocessor"> void set_priority ( priority_t );</span>
-<a name="l00472"></a>00472 <span class="preprocessor"></span>
-<a name="l00474"></a>00474 priority_t priority () <span class="keyword">const</span>;
-<a name="l00475"></a>00475 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00476"></a>00476
-<a name="l00477"></a>00477 <span class="keyword">protected</span>:
-<a name="l00479"></a>00479
-<a name="l00480"></a>00480 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD init ();
-<a name="l00481"></a>00481
-<a name="l00482"></a>00482 <span class="keyword">private</span>:
-<a name="l00483"></a>00483 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00337.html">task</a>;
-<a name="l00484"></a>00484 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
-<a name="l00485"></a>00485
-<a name="l00486"></a>00486 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_required = bound;
-<a name="l00487"></a>00487 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_completed = kind_type(bound+1);
-<a name="l00488"></a>00488 <span class="keyword">static</span> <span class="keyword">const</span> kind_type detached = kind_type(binding_completed+1);
-<a name="l00489"></a>00489 <span class="keyword">static</span> <span class="keyword">const</span> kind_type dying = kind_type(detached+1);
-<a name="l00490"></a>00490
-<a name="l00492"></a>00492
-<a name="l00494"></a>00494 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00495"></a>00495 <span class="keywordtype">void</span> propagate_state_from_ancestors ( T <a class="code" href="a00339.html">task_group_context</a>::*mptr_state, T new_state );
-<a name="l00496"></a>00496
-<a name="l00498"></a>00498 <span class="keyword">inline</span> <span class="keywordtype">void</span> finish_initialization ( internal::generic_scheduler *local_sched );
-<a name="l00499"></a>00499
-<a name="l00501"></a>00501 <span class="keywordtype">void</span> bind_to ( internal::generic_scheduler *local_sched );
-<a name="l00502"></a>00502
-<a name="l00504"></a>00504 <span class="keywordtype">void</span> register_with ( internal::generic_scheduler *local_sched );
-<a name="l00505"></a>00505
-<a name="l00506"></a>00506 }; <span class="comment">// class task_group_context</span>
-<a name="l00507"></a>00507
-<a name="l00508"></a>00508 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00509"></a>00509
-<a name="l00511"></a>00511
-<a name="l00512"></a><a class="code" href="a00337.html">00512</a> <span class="keyword">class </span><a class="code" href="a00337.html">task</a>: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {
-<a name="l00513"></a>00513
-<a name="l00515"></a>00515 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_ref_count( <span class="keywordtype">int</span> count );
-<a name="l00516"></a>00516
-<a name="l00518"></a>00518 internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
-<a name="l00519"></a>00519
-<a name="l00520"></a>00520 <span class="keyword">protected</span>:
-<a name="l00522"></a><a class="code" href="a00337.html#2bce8ec6e44706e70128f5cf91b76e67">00522</a> <a class="code" href="a00337.html">task</a>() {prefix().extra_state=1;}
-<a name="l00523"></a>00523
-<a name="l00524"></a>00524 <span class="keyword">public</span>:
-<a name="l00526"></a><a class="code" href="a00337.html#98245ee0473f84cb19dbbf8c81134908">00526</a> <span class="keyword">virtual</span> ~<a class="code" href="a00337.html">task</a>() {}
-<a name="l00527"></a>00527
-<a name="l00529"></a>00529 <span class="keyword">virtual</span> <a class="code" href="a00337.html">task</a>* execute() = 0;
-<a name="l00530"></a>00530
-<a name="l00532"></a><a class="code" href="a00337.html#4a3c415562d17905390ea5b49d12293e">00532</a> <span class="keyword">enum</span> <a class="code" href="a00337.html#4a3c415562d17905390ea5b49d12293e">state_type</a> {
-<a name="l00534"></a>00534 executing,
-<a name="l00536"></a>00536 reexecute,
-<a name="l00538"></a>00538 ready,
-<a name="l00540"></a>00540 allocated,
-<a name="l00542"></a>00542 freed,
-<a name="l00544"></a>00544 recycle
-<a name="l00545"></a>00545 };
-<a name="l00546"></a>00546
-<a name="l00547"></a>00547 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00548"></a>00548 <span class="comment">// Allocating tasks</span>
-<a name="l00549"></a>00549 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00550"></a>00550
-<a name="l00552"></a><a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">00552</a> <span class="keyword">static</span> internal::allocate_root_proxy allocate_root() {
-<a name="l00553"></a>00553 <span class="keywordflow">return</span> internal::allocate_root_proxy();
-<a name="l00554"></a>00554 }
-<a name="l00555"></a>00555
-<a name="l00556"></a>00556 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00558"></a><a class="code" href="a00337.html#8ccc518caf31075a3e073996d2d240a4">00558</a> <span class="preprocessor"> static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {</span>
-<a name="l00559"></a>00559 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal::allocate_root_with_context_proxy(ctx);
-<a name="l00560"></a>00560 }
-<a name="l00561"></a>00561 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00562"></a>00562
-<a name="l00564"></a>00564
-<a name="l00565"></a><a class="code" href="a00337.html#1434c79a5138993269d034008bff7329">00565</a> internal::allocate_continuation_proxy& allocate_continuation() {
-<a name="l00566"></a>00566 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_continuation_proxy*>(<span class="keyword">this</span>);
-<a name="l00567"></a>00567 }
-<a name="l00568"></a>00568
-<a name="l00570"></a><a class="code" href="a00337.html#1ff794f7053cd9148d5f280fbf07377f">00570</a> internal::allocate_child_proxy& allocate_child() {
-<a name="l00571"></a>00571 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_child_proxy*>(<span class="keyword">this</span>);
-<a name="l00572"></a>00572 }
-<a name="l00573"></a>00573
-<a name="l00575"></a>00575 <span class="keyword">using</span> task_base::allocate_additional_child_of;
-<a name="l00576"></a>00576
-<a name="l00577"></a>00577 <span class="preprocessor">#if __TBB_DEPRECATED_TASK_INTERFACE</span>
-<a name="l00579"></a>00579 <span class="preprocessor"></span>
-<a name="l00583"></a>00583 <span class="preprocessor"> void __TBB_EXPORTED_METHOD destroy( task& t );</span>
-<a name="l00584"></a>00584 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
-<a name="l00586"></a>00586 using task_base::destroy;
-<a name="l00587"></a>00587 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
-<a name="l00588"></a>00588
-<a name="l00589"></a>00589 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00590"></a>00590 <span class="comment">// Recycling of tasks</span>
-<a name="l00591"></a>00591 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00592"></a>00592
-<a name="l00594"></a>00594
-<a name="l00600"></a><a class="code" href="a00337.html#a67a79e18f62b43a623a00cfbd76db4c">00600</a> <span class="keywordtype">void</span> recycle_as_continuation() {
-<a name="l00601"></a>00601 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00602"></a>00602 prefix().state = allocated;
-<a name="l00603"></a>00603 }
-<a name="l00604"></a>00604
-<a name="l00606"></a>00606
-<a name="l00608"></a><a class="code" href="a00337.html#3b290d14109704e2b69dc1ac980a7a76">00608</a> <span class="keywordtype">void</span> recycle_as_safe_continuation() {
-<a name="l00609"></a>00609 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00610"></a>00610 prefix().state = recycle;
-<a name="l00611"></a>00611 }
-<a name="l00612"></a>00612
-<a name="l00614"></a><a class="code" href="a00337.html#db399855177438bbc9cc61d508dae8d2">00614</a> <span class="keywordtype">void</span> recycle_as_child_of( <a class="code" href="a00337.html">task</a>& new_parent ) {
-<a name="l00615"></a>00615 internal::task_prefix& p = prefix();
-<a name="l00616"></a>00616 __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00617"></a>00617 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled as a child"</span> );
-<a name="l00618"></a>00618 __TBB_ASSERT( p.parent==NULL, <span class="stringliteral">"parent must be null"</span> );
-<a name="l00619"></a>00619 __TBB_ASSERT( new_parent.<a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state<=recycle, <span class="stringliteral">"corrupt parent's state"</span> );
-<a name="l00620"></a>00620 __TBB_ASSERT( new_parent.<a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state!=freed, <span class="stringliteral">"parent already freed"</span> );
-<a name="l00621"></a>00621 p.state = allocated;
-<a name="l00622"></a>00622 p.parent = &new_parent;
-<a name="l00623"></a>00623 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00624"></a>00624 <span class="preprocessor"></span> p.<a class="code" href="a00337.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> = new_parent.<a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context;
-<a name="l00625"></a>00625 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00626"></a>00626 }
-<a name="l00627"></a>00627
-<a name="l00629"></a>00629
-<a name="l00630"></a><a class="code" href="a00337.html#4f1be9bbcdb487830dbe298b68d85144">00630</a> <span class="keywordtype">void</span> recycle_to_reexecute() {
-<a name="l00631"></a>00631 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00632"></a>00632 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled for reexecution"</span> );
-<a name="l00633"></a>00633 prefix().state = reexecute;
-<a name="l00634"></a>00634 }
-<a name="l00635"></a>00635
-<a name="l00636"></a>00636 <span class="comment">// All depth-related methods are obsolete, and are retained for the sake</span>
-<a name="l00637"></a>00637 <span class="comment">// of backward source compatibility only</span>
-<a name="l00638"></a>00638 intptr_t depth()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
-<a name="l00639"></a>00639 <span class="keywordtype">void</span> set_depth( intptr_t ) {}
-<a name="l00640"></a>00640 <span class="keywordtype">void</span> add_to_depth( <span class="keywordtype">int</span> ) {}
-<a name="l00641"></a>00641
-<a name="l00642"></a>00642
-<a name="l00643"></a>00643 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00644"></a>00644 <span class="comment">// Spawning and blocking</span>
-<a name="l00645"></a>00645 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00646"></a>00646
-<a name="l00648"></a><a class="code" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">00648</a> <span class="keywordtype">void</span> set_ref_count( <span class="keywordtype">int</span> count ) {
-<a name="l00649"></a>00649 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00650"></a>00650 <span class="preprocessor"></span> internal_set_ref_count(count);
-<a name="l00651"></a>00651 <span class="preprocessor">#else</span>
-<a name="l00652"></a>00652 <span class="preprocessor"></span> prefix().ref_count = count;
-<a name="l00653"></a>00653 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00654"></a>00654 }
-<a name="l00655"></a>00655
-<a name="l00657"></a>00657
-<a name="l00658"></a><a class="code" href="a00337.html#f5fb43c7ad0de5a4b95703cebc39e345">00658</a> <span class="keywordtype">void</span> increment_ref_count() {
-<a name="l00659"></a>00659 __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
-<a name="l00660"></a>00660 }
-<a name="l00661"></a>00661
-<a name="l00663"></a>00663
-<a name="l00664"></a><a class="code" href="a00337.html#ef4680f5c148020c5e7e43ddef44cd5d">00664</a> <span class="keywordtype">int</span> decrement_ref_count() {
-<a name="l00665"></a>00665 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00666"></a>00666 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(internal_decrement_ref_count());
-<a name="l00667"></a>00667 <span class="preprocessor">#else</span>
-<a name="l00668"></a>00668 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;
-<a name="l00669"></a>00669 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00670"></a>00670 }
-<a name="l00671"></a>00671
-<a name="l00673"></a>00673 <span class="keyword">using</span> task_base::spawn;
-<a name="l00674"></a>00674
-<a name="l00676"></a><a class="code" href="a00337.html#3ce28ca9baa771cfc37ecd72e69c4f3c">00676</a> <span class="keywordtype">void</span> spawn_and_wait_for_all( <a class="code" href="a00337.html">task</a>& child ) {
-<a name="l00677"></a>00677 prefix().owner->wait_for_all( *<span class="keyword">this</span>, &child );
-<a name="l00678"></a>00678 }
-<a name="l00679"></a>00679
-<a name="l00681"></a>00681 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD spawn_and_wait_for_all( <a class="code" href="a00341.html">task_list</a>& list );
-<a name="l00682"></a>00682
-<a name="l00684"></a><a class="code" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">00684</a> <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00337.html">task</a>& root ) {
-<a name="l00685"></a>00685 root.<a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn_root_and_wait( root, root.<a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next );
-<a name="l00686"></a>00686 }
-<a name="l00687"></a>00687
-<a name="l00689"></a>00689
-<a name="l00691"></a>00691 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00341.html">task_list</a>& root_list );
-<a name="l00692"></a>00692
-<a name="l00694"></a>00694
-<a name="l00695"></a><a class="code" href="a00337.html#53d2615ad9c38859b4c8080936600283">00695</a> <span class="keywordtype">void</span> wait_for_all() {
-<a name="l00696"></a>00696 prefix().owner->wait_for_all( *<span class="keyword">this</span>, NULL );
-<a name="l00697"></a>00697 }
-<a name="l00698"></a>00698
-<a name="l00700"></a>00700 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
-<a name="l00701"></a>00701 <span class="preprocessor"></span>
-<a name="l00711"></a>00711 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00712"></a><a class="code" href="a00337.html#8365d063c0cc9d7bd616bca47256b93c">00712</a> <span class="keyword">static</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00337.html">task</a>& t ) {
-<a name="l00713"></a>00713 t.<a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->enqueue( t, NULL );
-<a name="l00714"></a>00714 }
-<a name="l00715"></a>00715
-<a name="l00716"></a>00716 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
-<a name="l00718"></a><a class="code" href="a00337.html#fe6bf6aaf84e664134fabb6c4f409ea9">00718</a> <span class="preprocessor"> static void enqueue( task& t, priority_t p ) {</span>
-<a name="l00719"></a>00719 <span class="preprocessor"></span> __TBB_ASSERT( p == priority_low || p == priority_normal || p == priority_high, <span class="stringliteral">"Invalid priority level value"</span> );
-<a name="l00720"></a>00720 t.prefix().owner->enqueue( t, (<span class="keywordtype">void</span>*)p );
-<a name="l00721"></a>00721 }
-<a name="l00722"></a>00722 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00723"></a>00723
-<a name="l00725"></a>00725 <span class="keyword">static</span> <a class="code" href="a00337.html">task</a>& __TBB_EXPORTED_FUNC <span class="keyword">self</span>();
-<a name="l00726"></a>00726
-<a name="l00728"></a><a class="code" href="a00337.html#314e98ee4347ccec83efcb9ee22e8596">00728</a> <a class="code" href="a00337.html">task</a>* parent()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().parent;}
-<a name="l00729"></a>00729
-<a name="l00731"></a><a class="code" href="a00337.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">00731</a> <span class="keywordtype">void</span> set_parent(<a class="code" href="a00337.html">task</a>* p) {
-<a name="l00732"></a>00732 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00733"></a>00733 <span class="preprocessor"></span> __TBB_ASSERT(prefix().context == p-><a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context, <span class="stringliteral">"The tasks must be in the same context"</span>);
-<a name="l00734"></a>00734 <span class="preprocessor">#endif</span>
-<a name="l00735"></a>00735 <span class="preprocessor"></span> prefix().parent = p;
-<a name="l00736"></a>00736 }
-<a name="l00737"></a>00737
-<a name="l00738"></a>00738 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00740"></a>00740 <span class="preprocessor"></span>
-<a name="l00741"></a><a class="code" href="a00337.html#d8c36a93f3972590fbb65ff1cef3173b">00741</a> <span class="preprocessor"> task_group_context* context() {return prefix().context;}</span>
-<a name="l00742"></a>00742 <span class="preprocessor"></span>
-<a name="l00744"></a><a class="code" href="a00337.html#5987123486afca36ddebb9e2a8b7779a">00744</a> <a class="code" href="a00339.html">task_group_context</a>* group () { <span class="keywordflow">return</span> prefix().<a class="code" href="a00337.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>; }
-<a name="l00745"></a>00745 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00746"></a>00746
-<a name="l00748"></a><a class="code" href="a00337.html#f9169402702f56bf519448aaf34450aa">00748</a> <span class="keywordtype">bool</span> is_stolen_task()<span class="keyword"> const </span>{
-<a name="l00749"></a>00749 <span class="keywordflow">return</span> (prefix().extra_state & 0x80)!=0;
-<a name="l00750"></a>00750 }
-<a name="l00751"></a>00751
-<a name="l00752"></a>00752 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00753"></a>00753 <span class="comment">// Debugging</span>
-<a name="l00754"></a>00754 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00755"></a>00755
-<a name="l00757"></a><a class="code" href="a00337.html#0af7b2d7e6e8b4333b2accfce3dfb374">00757</a> <a class="code" href="a00337.html#4a3c415562d17905390ea5b49d12293e">state_type</a> state()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00337.html#4a3c415562d17905390ea5b49d12293e">state_type</a>(prefix().state);}
-<a name="l00758"></a>00758
-<a name="l00760"></a><a class="code" href="a00337.html#ad774f55eaec008ae02b236423209ced">00760</a> <span class="keywordtype">int</span> ref_count()<span class="keyword"> const </span>{
-<a name="l00761"></a>00761 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00762"></a>00762 <span class="preprocessor"></span> internal::reference_count ref_count_ = prefix().ref_count;
-<a name="l00763"></a>00763 __TBB_ASSERT( ref_count_==<span class="keywordtype">int</span>(ref_count_), <span class="stringliteral">"integer overflow error"</span>);
-<a name="l00764"></a>00764 <span class="preprocessor">#endif</span>
-<a name="l00765"></a>00765 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(prefix().ref_count);
-<a name="l00766"></a>00766 }
-<a name="l00767"></a>00767
-<a name="l00769"></a>00769 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_owned_by_current_thread() <span class="keyword">const</span>;
-<a name="l00770"></a>00770
-<a name="l00771"></a>00771 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00772"></a>00772 <span class="comment">// Affinity</span>
-<a name="l00773"></a>00773 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00774"></a>00774
-<a name="l00776"></a>00776
-<a name="l00777"></a><a class="code" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">00777</a> <span class="keyword">typedef</span> internal::affinity_id affinity_id;
-<a name="l00778"></a>00778
-<a name="l00780"></a><a class="code" href="a00337.html#dca19d7a45487a7d67a0db517e2b57c9">00780</a> <span class="keywordtype">void</span> set_affinity( affinity_id <span class="keywordtype">id</span> ) {prefix().affinity = id;}
-<a name="l00781"></a>00781
-<a name="l00783"></a><a class="code" href="a00337.html#3a920a56b0bcf2801518fb45b2c9d2be">00783</a> affinity_id affinity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().affinity;}
-<a name="l00784"></a>00784
-<a name="l00786"></a>00786
-<a name="l00790"></a>00790 <span class="keyword">virtual</span> <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD note_affinity( affinity_id <span class="keywordtype">id</span> );
-<a name="l00791"></a>00791
-<a name="l00792"></a>00792 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00794"></a>00794 <span class="preprocessor"></span>
-<a name="l00804"></a>00804 <span class="preprocessor"> void __TBB_EXPORTED_METHOD change_group ( task_group_context& ctx );</span>
-<a name="l00805"></a>00805 <span class="preprocessor"></span>
-<a name="l00807"></a>00807
-<a name="l00808"></a><a class="code" href="a00337.html#0f3fb4aac549ab642022450a4bd13326">00808</a> <span class="keywordtype">bool</span> cancel_group_execution () { <span class="keywordflow">return</span> prefix().context->cancel_group_execution(); }
-<a name="l00809"></a>00809
-<a name="l00811"></a><a class="code" href="a00337.html#025f18118c057c4c8db87ff2ce8df975">00811</a> <span class="keywordtype">bool</span> is_cancelled ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> prefix().context->is_group_execution_cancelled(); }
-<a name="l00812"></a>00812 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00813"></a>00813
-<a name="l00814"></a>00814 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
-<a name="l00816"></a><a class="code" href="a00337.html#9ac8d1542d67d9d80121ff986801ac26">00816</a> <span class="preprocessor"> void set_group_priority ( priority_t p ) { prefix().context->set_priority(p); }</span>
-<a name="l00817"></a>00817 <span class="preprocessor"></span>
-<a name="l00819"></a><a class="code" href="a00337.html#e1d969a1ccab6796e3b8b2c1a5be33d2">00819</a> priority_t group_priority ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> prefix().context->priority(); }
-<a name="l00820"></a>00820
-<a name="l00821"></a>00821 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00822"></a>00822
-<a name="l00823"></a>00823 <span class="keyword">private</span>:
-<a name="l00824"></a>00824 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00338.html">interface5::internal::task_base</a>;
-<a name="l00825"></a>00825 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00341.html">task_list</a>;
-<a name="l00826"></a>00826 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00827"></a>00827 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00828"></a>00828 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00829"></a>00829 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
-<a name="l00830"></a>00830 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00831"></a>00831 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00832"></a>00832 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00833"></a>00833 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00834"></a>00834
-<a name="l00836"></a>00836
-<a name="l00837"></a>00837 internal::task_prefix& prefix( internal::version_tag* = NULL )<span class="keyword"> const </span>{
-<a name="l00838"></a>00838 <span class="keywordflow">return</span> reinterpret_cast<internal::task_prefix*>(const_cast<task*>(<span class="keyword">this</span>))[-1];
-<a name="l00839"></a>00839 }
-<a name="l00840"></a>00840 }; <span class="comment">// class task</span>
-<a name="l00841"></a>00841
-<a name="l00843"></a>00843
-<a name="l00844"></a><a class="code" href="a00280.html">00844</a> <span class="keyword">class </span><a class="code" href="a00280.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00337.html">task</a> {
-<a name="l00845"></a>00845 <span class="comment">/*override*/</span> <a class="code" href="a00337.html">task</a>* execute() {
-<a name="l00846"></a>00846 <span class="keywordflow">return</span> NULL;
-<a name="l00847"></a>00847 }
-<a name="l00848"></a>00848 };
-<a name="l00849"></a>00849
-<a name="l00851"></a>00851
-<a name="l00853"></a><a class="code" href="a00341.html">00853</a> <span class="keyword">class </span><a class="code" href="a00341.html">task_list</a>: internal::no_copy {
-<a name="l00854"></a>00854 <span class="keyword">private</span>:
-<a name="l00855"></a>00855 <a class="code" href="a00337.html">task</a>* first;
-<a name="l00856"></a>00856 <a class="code" href="a00337.html">task</a>** next_ptr;
-<a name="l00857"></a>00857 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00337.html">task</a>;
-<a name="l00858"></a>00858 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00338.html">interface5::internal::task_base</a>;
-<a name="l00859"></a>00859 <span class="keyword">public</span>:
-<a name="l00861"></a><a class="code" href="a00341.html#416341c2047eaef50417b41eaf7e9de6">00861</a> <a class="code" href="a00341.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>() : first(NULL), next_ptr(&first) {}
-<a name="l00862"></a>00862
-<a name="l00864"></a><a class="code" href="a00341.html#6d438f1499a02db1e59c24ab6043e5ba">00864</a> <a class="code" href="a00341.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>() {}
-<a name="l00865"></a>00865
-<a name="l00867"></a><a class="code" href="a00341.html#f3ac31e092814b90929f81bb30441959">00867</a> <span class="keywordtype">bool</span> <a class="code" href="a00341.html#f3ac31e092814b90929f81bb30441959">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !first;}
-<a name="l00868"></a>00868
-<a name="l00870"></a><a class="code" href="a00341.html#4cd34756bc4763dafb8c84838a0124ff">00870</a> <span class="keywordtype">void</span> <a class="code" href="a00341.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>( <a class="code" href="a00337.html">task</a>& <a class="code" href="a00337.html">task</a> ) {
-<a name="l00871"></a>00871 task.<a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next = NULL;
-<a name="l00872"></a>00872 *next_ptr = &task;
-<a name="l00873"></a>00873 next_ptr = &task.<a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00874"></a>00874 }
-<a name="l00875"></a>00875
-<a name="l00877"></a><a class="code" href="a00341.html#5fe85df5ed524418389d34051750347d">00877</a> <a class="code" href="a00337.html">task</a>& <a class="code" href="a00341.html#5fe85df5ed524418389d34051750347d">pop_front</a>() {
-<a name="l00878"></a>00878 __TBB_ASSERT( !<a class="code" href="a00341.html#f3ac31e092814b90929f81bb30441959">empty</a>(), <span class="stringliteral">"attempt to pop item from empty task_list"</span> );
-<a name="l00879"></a>00879 <a class="code" href="a00337.html">task</a>* result = first;
-<a name="l00880"></a>00880 first = result-><a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00881"></a>00881 <span class="keywordflow">if</span>( !first ) next_ptr = &first;
-<a name="l00882"></a>00882 <span class="keywordflow">return</span> *result;
-<a name="l00883"></a>00883 }
-<a name="l00884"></a>00884
-<a name="l00886"></a><a class="code" href="a00341.html#fce446ee13e025969945328f3ff59b95">00886</a> <span class="keywordtype">void</span> <a class="code" href="a00341.html#fce446ee13e025969945328f3ff59b95">clear</a>() {
-<a name="l00887"></a>00887 first=NULL;
-<a name="l00888"></a>00888 next_ptr=&first;
-<a name="l00889"></a>00889 }
-<a name="l00890"></a>00890 };
-<a name="l00891"></a>00891
-<a name="l00892"></a>00892 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task& t ) {
-<a name="l00893"></a>00893 t.<a class="code" href="a00337.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn( t, t.prefix().next );
-<a name="l00894"></a>00894 }
-<a name="l00895"></a>00895
-<a name="l00896"></a>00896 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task_list& list ) {
-<a name="l00897"></a>00897 <span class="keywordflow">if</span>( task* t = list.first ) {
-<a name="l00898"></a>00898 t->prefix().owner->spawn( *t, *list.next_ptr );
-<a name="l00899"></a>00899 list.clear();
-<a name="l00900"></a>00900 }
-<a name="l00901"></a>00901 }
-<a name="l00902"></a>00902
-<a name="l00903"></a><a class="code" href="a00337.html#c33c7edbaec67aa8a56f48986a9dc69f">00903</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00337.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( <a class="code" href="a00341.html">task_list</a>& root_list ) {
-<a name="l00904"></a>00904 <span class="keywordflow">if</span>( <a class="code" href="a00337.html">task</a>* t = root_list.<a class="code" href="a00341.html#78fcc389819ee34427d510f7d8cb8b1e">first</a> ) {
-<a name="l00905"></a>00905 t->prefix().owner->spawn_root_and_wait( *t, *root_list.<a class="code" href="a00341.html#21553a32bcd08f980aa28f61254307da">next_ptr</a> );
-<a name="l00906"></a>00906 root_list.<a class="code" href="a00341.html#fce446ee13e025969945328f3ff59b95">clear</a>();
-<a name="l00907"></a>00907 }
-<a name="l00908"></a>00908 }
-<a name="l00909"></a>00909
-<a name="l00910"></a>00910 } <span class="comment">// namespace tbb</span>
-<a name="l00911"></a>00911
-<a name="l00912"></a>00912 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_root_proxy& ) {
-<a name="l00913"></a>00913 <span class="keywordflow">return</span> &tbb::internal::allocate_root_proxy::allocate(bytes);
-<a name="l00914"></a>00914 }
-<a name="l00915"></a>00915
-<a name="l00916"></a>00916 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_root_proxy& ) {
-<a name="l00917"></a>00917 tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
-<a name="l00918"></a>00918 }
-<a name="l00919"></a>00919
-<a name="l00920"></a>00920 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00921"></a>00921 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_root_with_context_proxy& p ) {
-<a name="l00922"></a>00922 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00923"></a>00923 }
-<a name="l00924"></a>00924
-<a name="l00925"></a>00925 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_root_with_context_proxy& p ) {
-<a name="l00926"></a>00926 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00927"></a>00927 }
-<a name="l00928"></a>00928 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00929"></a>00929
-<a name="l00930"></a>00930 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_continuation_proxy& p ) {
-<a name="l00931"></a>00931 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00932"></a>00932 }
-<a name="l00933"></a>00933
-<a name="l00934"></a>00934 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_continuation_proxy& p ) {
-<a name="l00935"></a>00935 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00936"></a>00936 }
-<a name="l00937"></a>00937
-<a name="l00938"></a>00938 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_child_proxy& p ) {
-<a name="l00939"></a>00939 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00940"></a>00940 }
-<a name="l00941"></a>00941
-<a name="l00942"></a>00942 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_child_proxy& p ) {
-<a name="l00943"></a>00943 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00944"></a>00944 }
-<a name="l00945"></a>00945
-<a name="l00946"></a>00946 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_additional_child_of_proxy& p ) {
-<a name="l00947"></a>00947 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00948"></a>00948 }
-<a name="l00949"></a>00949
-<a name="l00950"></a>00950 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_additional_child_of_proxy& p ) {
-<a name="l00951"></a>00951 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00952"></a>00952 }
-<a name="l00953"></a>00953
-<a name="l00954"></a>00954 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00623.html b/doc/html/a00623.html
deleted file mode 100644
index 4cb6f36..0000000
--- a/doc/html/a00623.html
+++ /dev/null
@@ -1,274 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>task_group.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>task_group.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_task_group_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_task_group_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span>
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb {
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">namespace </span>internal {
-<a name="l00032"></a>00032 <span class="keyword">template</span><<span class="keyword">typename</span> F> <span class="keyword">class </span>task_handle_task;
-<a name="l00033"></a>00033 }
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00036"></a>00036 <span class="keyword">class </span>task_handle : internal::no_assign {
-<a name="l00037"></a>00037 <span class="keyword">template</span><<span class="keyword">typename</span> _F> <span class="keyword">friend</span> <span class="keyword">class </span>internal::task_handle_task;
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">static</span> <span class="keyword">const</span> intptr_t scheduled = 0x1;
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 F my_func;
-<a name="l00042"></a>00042 intptr_t my_state;
-<a name="l00043"></a>00043
-<a name="l00044"></a>00044 <span class="keywordtype">void</span> mark_scheduled () {
-<a name="l00045"></a>00045 <span class="comment">// The check here is intentionally lax to avoid the impact of interlocked operation</span>
-<a name="l00046"></a>00046 <span class="keywordflow">if</span> ( my_state & scheduled )
-<a name="l00047"></a>00047 internal::throw_exception( internal::eid_invalid_multiple_scheduling );
-<a name="l00048"></a>00048 my_state |= scheduled;
-<a name="l00049"></a>00049 }
-<a name="l00050"></a>00050 <span class="keyword">public</span>:
-<a name="l00051"></a>00051 task_handle( <span class="keyword">const</span> F& f ) : my_func(f), my_state(0) {}
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{ my_func(); }
-<a name="l00054"></a>00054 };
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keyword">enum</span> task_group_status {
-<a name="l00057"></a>00057 not_complete,
-<a name="l00058"></a>00058 complete,
-<a name="l00059"></a>00059 canceled
-<a name="l00060"></a>00060 };
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="keyword">namespace </span>internal {
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="comment">// Suppress gratuitous warnings from icc 11.0 when lambda expressions are used in instances of function_task.</span>
-<a name="l00065"></a>00065 <span class="comment">//#pragma warning(disable: 588)</span>
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00068"></a>00068 <span class="keyword">class </span>function_task : <span class="keyword">public</span> task {
-<a name="l00069"></a>00069 F my_func;
-<a name="l00070"></a>00070 <span class="comment">/*override*/</span> <a class="code" href="a00337.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
-<a name="l00071"></a>00071 my_func();
-<a name="l00072"></a>00072 <span class="keywordflow">return</span> NULL;
-<a name="l00073"></a>00073 }
-<a name="l00074"></a>00074 <span class="keyword">public</span>:
-<a name="l00075"></a>00075 function_task( <span class="keyword">const</span> F& f ) : my_func(f) {}
-<a name="l00076"></a>00076 };
-<a name="l00077"></a>00077
-<a name="l00078"></a>00078 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00079"></a>00079 <span class="keyword">class </span>task_handle_task : <span class="keyword">public</span> task {
-<a name="l00080"></a>00080 task_handle<F>& my_handle;
-<a name="l00081"></a>00081 <span class="comment">/*override*/</span> <a class="code" href="a00337.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
-<a name="l00082"></a>00082 my_handle();
-<a name="l00083"></a>00083 <span class="keywordflow">return</span> NULL;
-<a name="l00084"></a>00084 }
-<a name="l00085"></a>00085 <span class="keyword">public</span>:
-<a name="l00086"></a>00086 task_handle_task( task_handle<F>& h ) : my_handle(h) { h.mark_scheduled(); }
-<a name="l00087"></a>00087 };
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="keyword">class </span>task_group_base : internal::no_copy {
-<a name="l00090"></a>00090 <span class="keyword">protected</span>:
-<a name="l00091"></a>00091 empty_task* my_root;
-<a name="l00092"></a>00092 task_group_context my_context;
-<a name="l00093"></a>00093
-<a name="l00094"></a>00094 task& owner () { <span class="keywordflow">return</span> *my_root; }
-<a name="l00095"></a>00095
-<a name="l00096"></a>00096 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00097"></a>00097 task_group_status internal_run_and_wait( F& f ) {
-<a name="l00098"></a>00098 __TBB_TRY {
-<a name="l00099"></a>00099 <span class="keywordflow">if</span> ( !my_context.is_group_execution_cancelled() )
-<a name="l00100"></a>00100 f();
-<a name="l00101"></a>00101 } __TBB_CATCH( ... ) {
-<a name="l00102"></a>00102 my_context.register_pending_exception();
-<a name="l00103"></a>00103 }
-<a name="l00104"></a>00104 <span class="keywordflow">return</span> wait();
-<a name="l00105"></a>00105 }
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> Task>
-<a name="l00108"></a>00108 <span class="keywordtype">void</span> internal_run( F& f ) {
-<a name="l00109"></a>00109 owner().spawn( *<span class="keyword">new</span>( owner().allocate_additional_child_of(*my_root) ) Task(f) );
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">public</span>:
-<a name="l00113"></a>00113 task_group_base( uintptr_t traits = 0 )
-<a name="l00114"></a>00114 : my_context(task_group_context::bound, task_group_context::default_traits | traits)
-<a name="l00115"></a>00115 {
-<a name="l00116"></a>00116 my_root = <span class="keyword">new</span>( <a class="code" href="a00337.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(my_context) ) empty_task;
-<a name="l00117"></a>00117 my_root->set_ref_count(1);
-<a name="l00118"></a>00118 }
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 ~task_group_base() {
-<a name="l00121"></a>00121 <span class="keywordflow">if</span>( my_root->ref_count() > 1 ) {
-<a name="l00122"></a>00122 <span class="keywordtype">bool</span> stack_unwinding_in_progress = std::uncaught_exception();
-<a name="l00123"></a>00123 <span class="comment">// Always attempt to do proper cleanup to avoid inevitable memory corruption </span>
-<a name="l00124"></a>00124 <span class="comment">// in case of missing wait (for the sake of better testability & debuggability)</span>
-<a name="l00125"></a>00125 <span class="keywordflow">if</span> ( !is_canceling() )
-<a name="l00126"></a>00126 cancel();
-<a name="l00127"></a>00127 __TBB_TRY {
-<a name="l00128"></a>00128 my_root->wait_for_all();
-<a name="l00129"></a>00129 } __TBB_CATCH (...) {
-<a name="l00130"></a>00130 <a class="code" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00131"></a>00131 __TBB_RETHROW();
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133 <a class="code" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00134"></a>00134 <span class="keywordflow">if</span> ( !stack_unwinding_in_progress )
-<a name="l00135"></a>00135 internal::throw_exception( internal::eid_missing_wait );
-<a name="l00136"></a>00136 }
-<a name="l00137"></a>00137 <span class="keywordflow">else</span> {
-<a name="l00138"></a>00138 <a class="code" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140 }
-<a name="l00141"></a>00141
-<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00143"></a>00143 <span class="keywordtype">void</span> run( task_handle<F>& h ) {
-<a name="l00144"></a>00144 internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
-<a name="l00145"></a>00145 }
-<a name="l00146"></a>00146
-<a name="l00147"></a>00147 task_group_status wait() {
-<a name="l00148"></a>00148 __TBB_TRY {
-<a name="l00149"></a>00149 my_root->wait_for_all();
-<a name="l00150"></a>00150 } __TBB_CATCH( ... ) {
-<a name="l00151"></a>00151 my_context.reset();
-<a name="l00152"></a>00152 __TBB_RETHROW();
-<a name="l00153"></a>00153 }
-<a name="l00154"></a>00154 <span class="keywordflow">if</span> ( my_context.is_group_execution_cancelled() ) {
-<a name="l00155"></a>00155 my_context.reset();
-<a name="l00156"></a>00156 <span class="keywordflow">return</span> canceled;
-<a name="l00157"></a>00157 }
-<a name="l00158"></a>00158 <span class="keywordflow">return</span> complete;
-<a name="l00159"></a>00159 }
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 <span class="keywordtype">bool</span> is_canceling() {
-<a name="l00162"></a>00162 <span class="keywordflow">return</span> my_context.is_group_execution_cancelled();
-<a name="l00163"></a>00163 }
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="keywordtype">void</span> cancel() {
-<a name="l00166"></a>00166 my_context.cancel_group_execution();
-<a name="l00167"></a>00167 }
-<a name="l00168"></a>00168 }; <span class="comment">// class task_group_base</span>
-<a name="l00169"></a>00169
-<a name="l00170"></a>00170 } <span class="comment">// namespace internal</span>
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="keyword">class </span>task_group : <span class="keyword">public</span> internal::task_group_base {
-<a name="l00173"></a>00173 <span class="keyword">public</span>:
-<a name="l00174"></a>00174 task_group () : task_group_base( task_group_context::concurrent_wait ) {}
-<a name="l00175"></a>00175
-<a name="l00176"></a>00176 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00177"></a>00177 <span class="preprocessor"></span> ~task_group() __TBB_TRY {
-<a name="l00178"></a>00178 __TBB_ASSERT( my_root->ref_count() != 0, NULL );
-<a name="l00179"></a>00179 <span class="keywordflow">if</span>( my_root->ref_count() > 1 )
-<a name="l00180"></a>00180 my_root->wait_for_all();
-<a name="l00181"></a>00181 }
-<a name="l00182"></a>00182 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00183"></a>00183 <span class="preprocessor"></span> <span class="keywordflow">catch</span> (...) {
-<a name="l00184"></a>00184 <span class="comment">// Have to destroy my_root here as the base class destructor won't be called</span>
-<a name="l00185"></a>00185 <a class="code" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00186"></a>00186 <span class="keywordflow">throw</span>;
-<a name="l00187"></a>00187 }
-<a name="l00188"></a>00188 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
-<a name="l00189"></a>00189 <span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
-<a name="l00190"></a>00190
-<a name="l00191"></a>00191 <span class="preprocessor">#if __SUNPRO_CC</span>
-<a name="l00192"></a>00192 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00193"></a>00193 <span class="keywordtype">void</span> run( task_handle<F>& h ) {
-<a name="l00194"></a>00194 internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
-<a name="l00195"></a>00195 }
-<a name="l00196"></a>00196 <span class="preprocessor">#else</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span> <span class="keyword">using</span> task_group_base::run;
-<a name="l00198"></a>00198 <span class="preprocessor">#endif</span>
-<a name="l00199"></a>00199 <span class="preprocessor"></span>
-<a name="l00200"></a>00200 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00201"></a>00201 <span class="keywordtype">void</span> run( <span class="keyword">const</span> F& f ) {
-<a name="l00202"></a>00202 internal_run< const F, internal::function_task<F> >( f );
-<a name="l00203"></a>00203 }
-<a name="l00204"></a>00204
-<a name="l00205"></a>00205 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00206"></a>00206 task_group_status run_and_wait( <span class="keyword">const</span> F& f ) {
-<a name="l00207"></a>00207 <span class="keywordflow">return</span> internal_run_and_wait<const F>( f );
-<a name="l00208"></a>00208 }
-<a name="l00209"></a>00209
-<a name="l00210"></a>00210 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00211"></a>00211 task_group_status run_and_wait( task_handle<F>& h ) {
-<a name="l00212"></a>00212 <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214 }; <span class="comment">// class task_group</span>
-<a name="l00215"></a>00215
-<a name="l00216"></a>00216 <span class="keyword">class </span>structured_task_group : <span class="keyword">public</span> internal::task_group_base {
-<a name="l00217"></a>00217 <span class="keyword">public</span>:
-<a name="l00218"></a>00218 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00219"></a>00219 task_group_status run_and_wait ( task_handle<F>& h ) {
-<a name="l00220"></a>00220 <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
-<a name="l00221"></a>00221 }
-<a name="l00222"></a>00222
-<a name="l00223"></a>00223 task_group_status wait() {
-<a name="l00224"></a>00224 task_group_status res = task_group_base::wait();
-<a name="l00225"></a>00225 my_root->set_ref_count(1);
-<a name="l00226"></a>00226 <span class="keywordflow">return</span> res;
-<a name="l00227"></a>00227 }
-<a name="l00228"></a>00228 }; <span class="comment">// class structured_task_group</span>
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 <span class="keyword">inline</span>
-<a name="l00231"></a>00231 <span class="keywordtype">bool</span> is_current_task_group_canceling() {
-<a name="l00232"></a>00232 <span class="keywordflow">return</span> <a class="code" href="a00337.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().<a class="code" href="a00337.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>();
-<a name="l00233"></a>00233 }
-<a name="l00234"></a>00234
-<a name="l00235"></a>00235 <span class="keyword">template</span><<span class="keyword">class</span> F>
-<a name="l00236"></a>00236 task_handle<F> make_task( <span class="keyword">const</span> F& f ) {
-<a name="l00237"></a>00237 <span class="keywordflow">return</span> task_handle<F>( f );
-<a name="l00238"></a>00238 }
-<a name="l00239"></a>00239
-<a name="l00240"></a>00240 } <span class="comment">// namespace tbb</span>
-<a name="l00241"></a>00241
-<a name="l00242"></a>00242 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00243"></a>00243
-<a name="l00244"></a>00244 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_group_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00630.html b/doc/html/a00630.html
deleted file mode 100644
index 5fe9a9e..0000000
--- a/doc/html/a00630.html
+++ /dev/null
@@ -1,117 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>task_scheduler_init.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>task_scheduler_init.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_task_scheduler_init_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_task_scheduler_init_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "limits.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">typedef</span> std::size_t stack_size_type;
-<a name="l00030"></a>00030
-<a name="l00032"></a>00032 <span class="keyword">namespace </span>internal {
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keyword">class </span>scheduler;
-<a name="l00036"></a>00036 } <span class="comment">// namespace internal</span>
-<a name="l00038"></a>00038 <span class="comment"></span>
-<a name="l00040"></a>00040
-<a name="l00053"></a><a class="code" href="a00342.html">00053</a> <span class="keyword">class </span><a class="code" href="a00342.html">task_scheduler_init</a>: internal::no_copy {
-<a name="l00054"></a>00054 <span class="keyword">enum</span> ExceptionPropagationMode {
-<a name="l00055"></a>00055 propagation_mode_exact = 1u,
-<a name="l00056"></a>00056 propagation_mode_captured = 2u,
-<a name="l00057"></a>00057 propagation_mode_mask = propagation_mode_exact | propagation_mode_captured
-<a name="l00058"></a>00058 };
-<a name="l00059"></a>00059
-<a name="l00061"></a>00061 internal::scheduler* my_scheduler;
-<a name="l00062"></a>00062 <span class="keyword">public</span>:
-<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">00065</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1;
-<a name="l00066"></a>00066
-<a name="l00068"></a><a class="code" href="a00342.html#e6c860f1e559026ff3ef4599c0d6c514">00068</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00342.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2;
-<a name="l00069"></a>00069
-<a name="l00071"></a>00071
-<a name="l00082"></a>00082 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00342.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> );
-<a name="l00083"></a>00083
-<a name="l00085"></a>00085
-<a name="l00086"></a>00086 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00342.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads, stack_size_type thread_stack_size );
-<a name="l00087"></a>00087
-<a name="l00089"></a>00089 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00342.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
-<a name="l00090"></a>00090
-<a name="l00092"></a><a class="code" href="a00342.html#421600bf9bf9338bcf937063f2ff0e90">00092</a> <a class="code" href="a00342.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL) {
-<a name="l00093"></a>00093 <span class="comment">// Two lowest order bits of the stack size argument may be taken to communicate</span>
-<a name="l00094"></a>00094 <span class="comment">// default exception propagation mode of the client to be used when the</span>
-<a name="l00095"></a>00095 <span class="comment">// client manually creates tasks in the master thread and does not use</span>
-<a name="l00096"></a>00096 <span class="comment">// explicit task group context object. This is necessary because newer </span>
-<a name="l00097"></a>00097 <span class="comment">// TBB binaries with exact propagation enabled by default may be used </span>
-<a name="l00098"></a>00098 <span class="comment">// by older clients that expect tbb::captured_exception wrapper.</span>
-<a name="l00099"></a>00099 <span class="comment">// All zeros mean old client - no preference. </span>
-<a name="l00100"></a>00100 __TBB_ASSERT( !(thread_stack_size & propagation_mode_mask), <span class="stringliteral">"Requested stack size is not aligned"</span> );
-<a name="l00101"></a>00101 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span> thread_stack_size |= TBB_USE_CAPTURED_EXCEPTION ? propagation_mode_captured : propagation_mode_exact;
-<a name="l00103"></a>00103 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
-<a name="l00104"></a>00104 <a class="code" href="a00342.html#d476053cc712e572554823492a5229ce">initialize</a>( number_of_threads, thread_stack_size );
-<a name="l00105"></a>00105 }
-<a name="l00106"></a>00106
-<a name="l00108"></a><a class="code" href="a00342.html#4da6c86292d80c703a66c1f6f5299488">00108</a> <a class="code" href="a00342.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>() {
-<a name="l00109"></a>00109 <span class="keywordflow">if</span>( my_scheduler )
-<a name="l00110"></a>00110 <a class="code" href="a00342.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
-<a name="l00111"></a>00111 internal::poison_pointer( my_scheduler );
-<a name="l00112"></a>00112 }
-<a name="l00114"></a>00114
-<a name="l00131"></a>00131 <span class="keyword">static</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00342.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ();
-<a name="l00132"></a>00132
-<a name="l00134"></a><a class="code" href="a00342.html#12752282977029f23416642bc03e8b74">00134</a> <span class="keywordtype">bool</span> <a class="code" href="a00342.html#12752282977029f23416642bc03e8b74">is_active</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_scheduler != NULL; }
-<a name="l00135"></a>00135 };
-<a name="l00136"></a>00136
-<a name="l00137"></a>00137 } <span class="comment">// namespace tbb</span>
-<a name="l00138"></a>00138
-<a name="l00139"></a>00139 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_scheduler_init_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00631.html b/doc/html/a00631.html
deleted file mode 100644
index e4b06b7..0000000
--- a/doc/html/a00631.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>task_scheduler_observer.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>task_scheduler_observer.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_task_scheduler_observer_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_task_scheduler_observer_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if __TBB_SCHEDULER_OBSERVER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>internal {
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="keyword">class </span>observer_proxy;
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="keyword">class </span>task_scheduler_observer_v3 {
-<a name="l00035"></a>00035 <span class="keyword">friend</span> <span class="keyword">class </span>observer_proxy;
-<a name="l00036"></a>00036 observer_proxy* my_proxy;
-<a name="l00037"></a>00037 atomic<intptr_t> my_busy_count;
-<a name="l00038"></a>00038 <span class="keyword">public</span>:
-<a name="l00040"></a>00040 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD observe( <span class="keywordtype">bool</span> state=<span class="keyword">true</span> );
-<a name="l00041"></a>00041
-<a name="l00043"></a>00043 <span class="keywordtype">bool</span> is_observing()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_proxy!=NULL;}
-<a name="l00044"></a>00044
-<a name="l00046"></a>00046 task_scheduler_observer_v3() : my_proxy(NULL) {my_busy_count=0;}
-<a name="l00047"></a>00047
-<a name="l00049"></a>00049 <span class="keyword">virtual</span> <span class="keywordtype">void</span> on_scheduler_entry( <span class="keywordtype">bool</span> <span class="comment">/*is_worker*/</span> ) {}
-<a name="l00050"></a>00050
-<a name="l00052"></a>00052 <span class="keyword">virtual</span> <span class="keywordtype">void</span> on_scheduler_exit( <span class="keywordtype">bool</span> <span class="comment">/*is_worker*/</span> ) {}
-<a name="l00053"></a>00053
-<a name="l00055"></a>00055 <span class="keyword">virtual</span> ~task_scheduler_observer_v3() {observe(<span class="keyword">false</span>);}
-<a name="l00056"></a>00056 };
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 } <span class="comment">// namespace internal</span>
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="keyword">typedef</span> internal::task_scheduler_observer_v3 task_scheduler_observer;
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 } <span class="comment">// namespace tbb</span>
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_SCHEDULER_OBSERVER */</span>
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_scheduler_observer_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00633.html b/doc/html/a00633.html
deleted file mode 100644
index 0415691..0000000
--- a/doc/html/a00633.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#if TBB_PREVIEW_AGGREGATOR</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include "aggregator.h"</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#endif</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00037"></a>00037 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include "blocked_range2d.h"</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include "blocked_range3d.h"</span>
-<a name="l00040"></a>00040 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#include "combinable.h"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#include "concurrent_unordered_map.h"</span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include "concurrent_hash_map.h"</span>
-<a name="l00044"></a>00044 <span class="preprocessor">#include "concurrent_queue.h"</span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "concurrent_vector.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include "critical_section.h"</span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include "enumerable_thread_specific.h"</span>
-<a name="l00048"></a>00048 <span class="preprocessor">#include "mutex.h"</span>
-<a name="l00049"></a>00049 <span class="preprocessor">#include "null_mutex.h"</span>
-<a name="l00050"></a>00050 <span class="preprocessor">#include "null_rw_mutex.h"</span>
-<a name="l00051"></a>00051 <span class="preprocessor">#include "parallel_do.h"</span>
-<a name="l00052"></a>00052 <span class="preprocessor">#include "parallel_for.h"</span>
-<a name="l00053"></a>00053 <span class="preprocessor">#include "parallel_for_each.h"</span>
-<a name="l00054"></a>00054 <span class="preprocessor">#include "parallel_invoke.h"</span>
-<a name="l00055"></a>00055 <span class="preprocessor">#include "parallel_reduce.h"</span>
-<a name="l00056"></a>00056 <span class="preprocessor">#include "parallel_scan.h"</span>
-<a name="l00057"></a>00057 <span class="preprocessor">#include "parallel_sort.h"</span>
-<a name="l00058"></a>00058 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00059"></a>00059 <span class="preprocessor">#include "pipeline.h"</span>
-<a name="l00060"></a>00060 <span class="preprocessor">#include "queuing_mutex.h"</span>
-<a name="l00061"></a>00061 <span class="preprocessor">#include "queuing_rw_mutex.h"</span>
-<a name="l00062"></a>00062 <span class="preprocessor">#include "reader_writer_lock.h"</span>
-<a name="l00063"></a>00063 <span class="preprocessor">#include "concurrent_priority_queue.h"</span>
-<a name="l00064"></a>00064 <span class="preprocessor">#include "recursive_mutex.h"</span>
-<a name="l00065"></a>00065 <span class="preprocessor">#include "spin_mutex.h"</span>
-<a name="l00066"></a>00066 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
-<a name="l00067"></a>00067 <span class="preprocessor">#include "task.h"</span>
-<a name="l00068"></a>00068 <span class="preprocessor">#include "task_group.h"</span>
-<a name="l00069"></a>00069 <span class="preprocessor">#include "task_scheduler_init.h"</span>
-<a name="l00070"></a>00070 <span class="preprocessor">#include "task_scheduler_observer.h"</span>
-<a name="l00071"></a>00071 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00072"></a>00072 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00073"></a>00073 <span class="preprocessor">#include "tbb_thread.h"</span>
-<a name="l00074"></a>00074 <span class="preprocessor">#include "tick_count.h"</span>
-<a name="l00075"></a>00075
-<a name="l00076"></a>00076 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00634.html b/doc/html/a00634.html
deleted file mode 100644
index db5d1fc..0000000
--- a/doc/html/a00634.html
+++ /dev/null
@@ -1,225 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_allocator.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_allocator.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_allocator_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_allocator_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <new></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#if __TBB_CPP11_RVALUE_REF_PRESENT && !__TBB_CPP11_STD_FORWARD_BROKEN</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor"> #include <utility></span> <span class="comment">// std::forward</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#endif</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span>
-<a name="l00030"></a>00030 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00032"></a>00032 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include <cstring></span>
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00042"></a>00042 <span class="keyword">namespace </span>tbb {
-<a name="l00043"></a>00043
-<a name="l00045"></a>00045 <span class="keyword">namespace </span>internal {
-<a name="l00046"></a>00046
-<a name="l00048"></a>00048
-<a name="l00049"></a>00049 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC deallocate_via_handler_v3( <span class="keywordtype">void</span> *p );
-<a name="l00050"></a>00050
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC allocate_via_handler_v3( size_t n );
-<a name="l00054"></a>00054
-<a name="l00056"></a>00056 <span class="keywordtype">bool</span> __TBB_EXPORTED_FUNC is_malloc_used_v3();
-<a name="l00057"></a>00057 }
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
-<a name="l00062"></a>00062 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
-<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00065"></a>00065 <span class="preprocessor"></span>
-<a name="l00067"></a>00067
-<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00073"></a><a class="code" href="a00343.html">00073</a> <span class="keyword">class </span><a class="code" href="a00343.html">tbb_allocator</a> {
-<a name="l00074"></a>00074 <span class="keyword">public</span>:
-<a name="l00075"></a>00075 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
-<a name="l00076"></a>00076 <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00077"></a>00077 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00078"></a>00078 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00079"></a>00079 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00080"></a>00080 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00081"></a>00081 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00082"></a>00082 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00083"></a>00083 <span class="keyword">typedef</span> <a class="code" href="a00343.html">tbb_allocator<U></a> other;
-<a name="l00084"></a>00084 };
-<a name="l00085"></a>00085
-<a name="l00087"></a><a class="code" href="a00343.html#09a7f81fb2c3055aaecf058b11538544">00087</a> <span class="keyword">enum</span> <a class="code" href="a00343.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> {
-<a name="l00088"></a>00088 scalable,
-<a name="l00089"></a>00089 standard
-<a name="l00090"></a>00090 };
-<a name="l00091"></a>00091
-<a name="l00092"></a>00092 <a class="code" href="a00343.html">tbb_allocator</a>() throw() {}
-<a name="l00093"></a>00093 tbb_allocator( <span class="keyword">const</span> tbb_allocator& ) throw() {}
-<a name="l00094"></a>00094 <span class="keyword">template</span><<span class="keyword">typename</span> U> tbb_allocator(<span class="keyword">const</span> tbb_allocator<U>&) throw() {}
-<a name="l00095"></a>00095
-<a name="l00096"></a>00096 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00097"></a>00097 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00343.html#f6cb487b1bdce0b581f265a77dca6d53">00100</a> pointer <a class="code" href="a00343.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> = 0) {
-<a name="l00101"></a>00101 <span class="keywordflow">return</span> pointer(internal::allocate_via_handler_v3( n * <span class="keyword">sizeof</span>(value_type) ));
-<a name="l00102"></a>00102 }
-<a name="l00103"></a>00103
-<a name="l00105"></a><a class="code" href="a00343.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00105</a> <span class="keywordtype">void</span> <a class="code" href="a00343.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>( pointer p, size_type ) {
-<a name="l00106"></a>00106 internal::deallocate_via_handler_v3(p);
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108
-<a name="l00110"></a><a class="code" href="a00343.html#f059ca2c96243024f0d562ee3a87a3a5">00110</a> size_type <a class="code" href="a00343.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const throw() {
-<a name="l00111"></a>00111 size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
-<a name="l00112"></a>00112 <span class="keywordflow">return</span> (max > 0 ? max : 1);
-<a name="l00113"></a>00113 }
-<a name="l00114"></a>00114
-<a name="l00116"></a>00116 <span class="preprocessor">#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span>... Args>
-<a name="l00118"></a><a class="code" href="a00343.html#15c431ccb5ccc5a30e5d496edad4c143">00118</a> <span class="keywordtype">void</span> <a class="code" href="a00343.html#15c431ccb5ccc5a30e5d496edad4c143">construct</a>(pointer p, Args&&... args)
-<a name="l00119"></a>00119 <span class="preprocessor">#if __TBB_CPP11_STD_FORWARD_BROKEN</span>
-<a name="l00120"></a>00120 <span class="preprocessor"></span> { ::new((<span class="keywordtype">void</span> *)p) T((args)...); }
-<a name="l00121"></a>00121 <span class="preprocessor"> #else</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span> { ::new((<span class="keywordtype">void</span> *)p) T(std::forward<Args>(args)...); }
-<a name="l00123"></a>00123 <span class="preprocessor">#endif</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">#else // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span> <span class="keywordtype">void</span> <a class="code" href="a00343.html#15c431ccb5ccc5a30e5d496edad4c143">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
-<a name="l00126"></a>00126 <span class="preprocessor">#endif // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span>
-<a name="l00129"></a>00129 <span class="keywordtype">void</span> destroy( pointer p ) {p->~value_type();}
-<a name="l00130"></a>00130
-<a name="l00132"></a>00132 <span class="keyword">static</span> <a class="code" href="a00343.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> allocator_type() {
-<a name="l00133"></a>00133 <span class="keywordflow">return</span> internal::is_malloc_used_v3() ? standard : scalable;
-<a name="l00134"></a>00134 }
-<a name="l00135"></a>00135 };
-<a name="l00136"></a>00136
-<a name="l00137"></a>00137 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00139"></a>00139 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span>
-<a name="l00142"></a>00142
-<a name="l00143"></a>00143 <span class="keyword">template</span><>
-<a name="l00144"></a><a class="code" href="a00344.html">00144</a> <span class="keyword">class </span><a class="code" href="a00343.html">tbb_allocator</a><void> {
-<a name="l00145"></a>00145 <span class="keyword">public</span>:
-<a name="l00146"></a>00146 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00147"></a>00147 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00148"></a>00148 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00149"></a>00149 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00150"></a>00150 <span class="keyword">typedef</span> <a class="code" href="a00343.html">tbb_allocator<U></a> other;
-<a name="l00151"></a>00151 };
-<a name="l00152"></a>00152 };
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00155"></a>00155 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00343.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00343.html">tbb_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00158"></a>00158 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> tbb_allocator<T>&, <span class="keyword">const</span> tbb_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00159"></a>00159
-<a name="l00161"></a>00161
-<a name="l00166"></a>00166 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">template</span><<span class="keyword">typename</span> X> <span class="keyword">class </span>Allocator = tbb_allocator>
-<a name="l00167"></a><a class="code" href="a00353.html">00167</a> <span class="keyword">class </span><a class="code" href="a00353.html">zero_allocator</a> : <span class="keyword">public</span> Allocator<T>
-<a name="l00168"></a>00168 {
-<a name="l00169"></a>00169 <span class="keyword">public</span>:
-<a name="l00170"></a>00170 <span class="keyword">typedef</span> Allocator<T> base_allocator_type;
-<a name="l00171"></a>00171 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
-<a name="l00172"></a>00172 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
-<a name="l00173"></a>00173 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
-<a name="l00174"></a>00174 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::reference reference;
-<a name="l00175"></a>00175 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_reference const_reference;
-<a name="l00176"></a>00176 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::size_type size_type;
-<a name="l00177"></a>00177 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::difference_type difference_type;
-<a name="l00178"></a>00178 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00179"></a>00179 <span class="keyword">typedef</span> <a class="code" href="a00353.html">zero_allocator<U, Allocator></a> other;
-<a name="l00180"></a>00180 };
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 <a class="code" href="a00353.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
-<a name="l00183"></a>00183 <a class="code" href="a00353.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00353.html">zero_allocator</a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( a ) { }
-<a name="l00184"></a>00184 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00185"></a>00185 <a class="code" href="a00353.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00353.html">zero_allocator<U></a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( Allocator<U>( a ) ) { }
-<a name="l00186"></a>00186
-<a name="l00187"></a>00187 pointer <a class="code" href="a00343.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>(<span class="keyword">const</span> size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> *hint = 0 ) {
-<a name="l00188"></a>00188 pointer ptr = base_allocator_type::allocate( n, hint );
-<a name="l00189"></a>00189 std::memset( ptr, 0, n * <span class="keyword">sizeof</span>(value_type) );
-<a name="l00190"></a>00190 <span class="keywordflow">return</span> ptr;
-<a name="l00191"></a>00191 }
-<a name="l00192"></a>00192 };
-<a name="l00193"></a>00193
-<a name="l00195"></a>00195
-<a name="l00196"></a>00196 <span class="keyword">template</span><<span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>Allocator>
-<a name="l00197"></a><a class="code" href="a00354.html">00197</a> <span class="keyword">class </span><a class="code" href="a00353.html">zero_allocator</a><void, Allocator> : <span class="keyword">public</span> Allocator<void> {
-<a name="l00198"></a>00198 <span class="keyword">public</span>:
-<a name="l00199"></a>00199 <span class="keyword">typedef</span> Allocator<void> base_allocator_type;
-<a name="l00200"></a>00200 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
-<a name="l00201"></a>00201 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
-<a name="l00202"></a>00202 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
-<a name="l00203"></a>00203 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00204"></a>00204 <span class="keyword">typedef</span> <a class="code" href="a00353.html">zero_allocator<U, Allocator></a> other;
-<a name="l00205"></a>00205 };
-<a name="l00206"></a>00206 };
-<a name="l00207"></a>00207
-<a name="l00208"></a>00208 <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">template</span><<span class="keyword">typename</span> X1> <span class="keyword">class </span>B1, <span class="keyword">typename</span> T2, <span class="keyword">template</span><<span class="keyword">typename</span> X2> <span class="keyword">class </span>B2>
-<a name="l00209"></a>00209 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00353.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00353.html">zero_allocator<T2,B2></a> &b) {
-<a name="l00210"></a>00210 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) == <span class="keyword">static_cast</span>< B2<T2> >(b);
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212 <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">template</span><<span class="keyword">typename</span> X1> <span class="keyword">class </span>B1, <span class="keyword">typename</span> T2, <span class="keyword">template</span><<span class="keyword">typename</span> X2> <span class="keyword">class </span>B2>
-<a name="l00213"></a>00213 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> zero_allocator<T1,B1> &a, <span class="keyword">const</span> zero_allocator<T2,B2> &b) {
-<a name="l00214"></a>00214 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) != <span class="keyword">static_cast</span>< B2<T2> >(b);
-<a name="l00215"></a>00215 }
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 } <span class="comment">// namespace tbb </span>
-<a name="l00218"></a>00218
-<a name="l00219"></a>00219 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_allocator_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00638.html b/doc/html/a00638.html
deleted file mode 100644
index ba7c842..0000000
--- a/doc/html/a00638.html
+++ /dev/null
@@ -1,323 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_config.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_config.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_config_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_config_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#define __TBB_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#if __clang__</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="preprocessor">#if (__TBB_GCC_VERSION >= 40400) && !defined(__INTEL_COMPILER)</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span>
-<a name="l00041"></a>00041 <span class="preprocessor"> #define __TBB_GCC_WARNING_SUPPRESSION_PRESENT 1</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span>
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="comment">/* Select particular features of C++11 based on compiler version.</span>
-<a name="l00046"></a>00046 <span class="comment"> ICC 12.1 (Linux), GCC 4.3 and higher, clang 2.9 and higher</span>
-<a name="l00047"></a>00047 <span class="comment"> set __GXX_EXPERIMENTAL_CXX0X__ in c++11 mode.</span>
-<a name="l00048"></a>00048 <span class="comment"></span>
-<a name="l00049"></a>00049 <span class="comment"> Compilers that mimics other compilers (ICC, clang) must be processed before</span>
-<a name="l00050"></a>00050 <span class="comment"> compilers they mimic.</span>
-<a name="l00051"></a>00051 <span class="comment"></span>
-<a name="l00052"></a>00052 <span class="comment"> TODO: The following conditions should be extended when new compilers/runtimes</span>
-<a name="l00053"></a>00053 <span class="comment"> support added.</span>
-<a name="l00054"></a>00054 <span class="comment"> */</span>
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="preprocessor">#if __INTEL_COMPILER</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __GXX_EXPERIMENTAL_CXX0X__ && __VARIADIC_TEMPLATES</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_RVALUE_REF_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ || _MSC_VER >= 1600) && (__INTEL_COMPILER >= 1200)</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_EXCEPTION_PTR_PRESENT 0</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#elif __clang__</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_CLANG_VERSION >= 20900)</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_RVALUE_REF_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_CLANG_VERSION >= 20900)</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_EXCEPTION_PTR_PRESENT __GXX_EXPERIMENTAL_CXX0X__</span>
-<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#elif __GNUC__</span>
-<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __GXX_EXPERIMENTAL_CXX0X__</span>
-<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_RVALUE_REF_PRESENT __GXX_EXPERIMENTAL_CXX0X__</span>
-<a name="l00067"></a>00067 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_EXCEPTION_PTR_PRESENT __GXX_EXPERIMENTAL_CXX0X__</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">#elif _MSC_VER</span>
-<a name="l00069"></a>00069 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 0</span>
-<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_RVALUE_REF_PRESENT 0</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600)</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 0</span>
-<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_RVALUE_REF_PRESENT 0</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_EXCEPTION_PTR_PRESENT 0</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00077"></a>00077 <span class="preprocessor"></span>
-<a name="l00078"></a>00078 <span class="comment">// Work around a bug in MinGW32</span>
-<a name="l00079"></a>00079 <span class="preprocessor">#if __MINGW32__ && __TBB_EXCEPTION_PTR_PRESENT && !defined(_GLIBCXX_ATOMIC_BUILTINS_4)</span>
-<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor"> #define _GLIBCXX_ATOMIC_BUILTINS_4</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span>
-<a name="l00083"></a>00083 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC || __IBMCPP__</span>
-<a name="l00084"></a>00084 <span class="preprocessor"></span> <span class="comment">/* ICC defines __GNUC__ and so is covered */</span>
-<a name="l00085"></a>00085 <span class="preprocessor"> #define __TBB_ATTRIBUTE_ALIGNED_PRESENT 1</span>
-<a name="l00086"></a>00086 <span class="preprocessor"></span><span class="preprocessor">#elif _MSC_VER && (_MSC_VER >= 1300 || __INTEL_COMPILER)</span>
-<a name="l00087"></a>00087 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DECLSPEC_ALIGN_PRESENT 1</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00089"></a>00089 <span class="preprocessor"></span>
-<a name="l00090"></a>00090 <span class="comment">/* TODO: change the version back to 4.1.2 once macro __TBB_WORD_SIZE become optional */</span>
-<a name="l00091"></a>00091 <span class="preprocessor">#if (__TBB_GCC_VERSION >= 40306) && !defined(__INTEL_COMPILER)</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span>
-<a name="l00093"></a>00093 <span class="preprocessor"> #define __TBB_GCC_BUILTIN_ATOMICS_PRESENT 1</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00095"></a>00095 <span class="preprocessor"></span>
-<a name="l00098"></a>00098 <span class="preprocessor">#ifndef TBB_USE_DEBUG</span>
-<a name="l00099"></a>00099 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG TBB_DO_ASSERT</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor">#ifdef _DEBUG</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG _DEBUG</span>
-<a name="l00104"></a>00104 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG 0</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
-<a name="l00108"></a>00108 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_DEBUG */</span>
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="preprocessor">#ifndef TBB_USE_ASSERT</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
-<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_ASSERT TBB_DO_ASSERT</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_ASSERT TBB_USE_DEBUG</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
-<a name="l00116"></a>00116 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00117"></a>00117
-<a name="l00118"></a>00118 <span class="preprocessor">#ifndef TBB_USE_THREADING_TOOLS</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_THREADING_TOOLS</span>
-<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_DO_THREADING_TOOLS</span>
-<a name="l00121"></a>00121 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_USE_DEBUG</span>
-<a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_THREADING_TOOLS */</span>
-<a name="l00124"></a>00124 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
-<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <span class="preprocessor">#ifndef TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_PERFORMANCE_WARNINGS</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_PERFORMANCE_WARNINGS TBB_PERFORMANCE_WARNINGS</span>
-<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_PERFORMANCE_WARNINGS TBB_USE_DEBUG</span>
-<a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_PEFORMANCE_WARNINGS */</span>
-<a name="l00132"></a>00132 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_PERFORMANCE_WARNINGS */</span>
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="preprocessor">#if __MIC__ || __MIC2__</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_DEFINE_MIC 1</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00137"></a>00137 <span class="preprocessor"></span>
-<a name="l00138"></a>00138 <span class="preprocessor">#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)</span>
-<a name="l00139"></a>00139 <span class="preprocessor"></span><span class="preprocessor"> #if TBB_USE_EXCEPTIONS</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor"> #error Compilation settings do not support exception handling. Please do not set TBB_USE_EXCEPTIONS macro or set it to 0.</span>
-<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor"> #elif !defined(TBB_USE_EXCEPTIONS)</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_EXCEPTIONS 0</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00144"></a>00144 <span class="preprocessor"></span><span class="preprocessor">#elif !defined(TBB_USE_EXCEPTIONS)</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_DEFINE_MIC</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_EXCEPTIONS 0</span>
-<a name="l00147"></a>00147 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00148"></a>00148 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_EXCEPTIONS 1</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#elif TBB_USE_EXCEPTIONS && __TBB_DEFINE_MIC</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor"> #error Please do not set TBB_USE_EXCEPTIONS macro or set it to 0.</span>
-<a name="l00152"></a>00152 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span>
-<a name="l00154"></a>00154 <span class="preprocessor">#ifndef TBB_IMPLEMENT_CPP0X</span>
-<a name="l00155"></a>00155 <span class="preprocessor"></span>
-<a name="l00156"></a>00156 <span class="preprocessor"> #if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__</span>
-<a name="l00157"></a>00157 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_IMPLEMENT_CPP0X 0</span>
-<a name="l00158"></a>00158 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00159"></a>00159 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_IMPLEMENT_CPP0X 1</span>
-<a name="l00160"></a>00160 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_IMPLEMENT_CPP0X */</span>
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="preprocessor">#ifndef TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00165"></a>00165 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 0</span>
-<a name="l00166"></a>00166 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 1</span>
-<a name="l00168"></a>00168 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00169"></a>00169 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00170"></a>00170 <span class="preprocessor"> #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span><span class="preprocessor"> #error Current runtime does not support std::exception_ptr. Set TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception.</span>
-<a name="l00172"></a>00172 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00174"></a>00174
-<a name="l00176"></a>00176 <span class="preprocessor">#if (TBB_USE_GCC_BUILTINS && !__TBB_GCC_BUILTIN_ATOMICS_PRESENT)</span>
-<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor"> #error "GCC atomic built-ins are not supported."</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00179"></a>00179 <span class="preprocessor"></span>
-<a name="l00187"></a>00187 <span class="preprocessor">#ifndef __TBB_DYNAMIC_LOAD_ENABLED</span>
-<a name="l00188"></a>00188 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DYNAMIC_LOAD_ENABLED 1</span>
-<a name="l00189"></a>00189 <span class="preprocessor"></span><span class="preprocessor">#elif !(_WIN32||_WIN64) && !__TBB_DYNAMIC_LOAD_ENABLED</span>
-<a name="l00190"></a>00190 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_WEAK_SYMBOLS 1</span>
-<a name="l00191"></a>00191 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00192"></a>00192 <span class="preprocessor"></span>
-<a name="l00193"></a>00193 <span class="preprocessor">#if (_WIN32||_WIN64) && __TBB_SOURCE_DIRECTLY_INCLUDED</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span><span class="preprocessor"> #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00196"></a>00196 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span>
-<a name="l00198"></a>00198 <span class="preprocessor">#ifndef __TBB_COUNT_TASK_NODES</span>
-<a name="l00199"></a>00199 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT</span>
-<a name="l00200"></a>00200 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00201"></a>00201 <span class="preprocessor"></span>
-<a name="l00202"></a>00202 <span class="preprocessor">#ifndef __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TASK_GROUP_CONTEXT 1</span>
-<a name="l00204"></a>00204 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <span class="preprocessor">#if TBB_USE_EXCEPTIONS && !__TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00207"></a>00207 <span class="preprocessor"></span><span class="preprocessor"> #error TBB_USE_EXCEPTIONS requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
-<a name="l00208"></a>00208 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00209"></a>00209 <span class="preprocessor"></span>
-<a name="l00210"></a>00210 <span class="preprocessor">#ifndef __TBB_SCHEDULER_OBSERVER</span>
-<a name="l00211"></a>00211 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_SCHEDULER_OBSERVER 1</span>
-<a name="l00212"></a>00212 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SCHEDULER_OBSERVER */</span>
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 <span class="preprocessor">#ifndef __TBB_TASK_PRIORITY</span>
-<a name="l00215"></a>00215 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TASK_PRIORITY __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00216"></a>00216 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="preprocessor">#if __TBB_TASK_PRIORITY && !__TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00219"></a>00219 <span class="preprocessor"></span><span class="preprocessor"> #error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
-<a name="l00220"></a>00220 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00221"></a>00221 <span class="preprocessor"></span>
-<a name="l00222"></a>00222 <span class="preprocessor">#if !defined(__TBB_SURVIVE_THREAD_SWITCH) && (_WIN32 || _WIN64 || __linux__)</span>
-<a name="l00223"></a>00223 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_SURVIVE_THREAD_SWITCH 1</span>
-<a name="l00224"></a>00224 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SURVIVE_THREAD_SWITCH */</span>
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 <span class="preprocessor">#ifndef __TBB_DEFAULT_PARTITIONER</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00228"></a>00228 <span class="preprocessor"></span>
-<a name="l00229"></a>00229 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner</span>
-<a name="l00230"></a>00230 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00231"></a>00231 <span class="preprocessor"></span>
-<a name="l00232"></a>00232 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner</span>
-<a name="l00233"></a>00233 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
-<a name="l00234"></a>00234 <span class="preprocessor">#endif </span><span class="comment">/* !defined(__TBB_DEFAULT_PARTITIONER */</span>
-<a name="l00235"></a>00235
-<a name="l00236"></a>00236 <span class="preprocessor">#ifdef _VARIADIC_MAX</span>
-<a name="l00237"></a>00237 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_VARIADIC_MAX _VARIADIC_MAX</span>
-<a name="l00238"></a>00238 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00239"></a>00239 <span class="preprocessor"></span><span class="preprocessor">#if _MSC_VER >= 1700</span>
-<a name="l00240"></a>00240 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_VARIADIC_MAX 5 // current VS11 setting, may change.</span>
-<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_VARIADIC_MAX 10</span>
-<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00244"></a>00244 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00245"></a>00245 <span class="preprocessor"></span>
-<a name="l00252"></a>00252 <span class="preprocessor">#if __GNUC__ && __TBB_x86_64 && __INTEL_COMPILER == 1200</span>
-<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN 1</span>
-<a name="l00254"></a>00254 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00255"></a>00255 <span class="preprocessor"></span>
-<a name="l00256"></a>00256 <span class="preprocessor">#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)</span>
-<a name="l00257"></a>00257 <span class="preprocessor"></span>
-<a name="l00260"></a>00260 <span class="preprocessor"> #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1</span>
-<a name="l00261"></a>00261 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00262"></a>00262 <span class="preprocessor"></span>
-<a name="l00263"></a>00263 <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)</span>
-<a name="l00264"></a>00264 <span class="preprocessor"></span>
-<a name="l00266"></a>00266 <span class="preprocessor"> #define __TBB_TEMPLATE_FRIENDS_BROKEN 1</span>
-<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00268"></a>00268 <span class="preprocessor"></span>
-<a name="l00269"></a>00269 <span class="preprocessor">#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__ || (__APPLE__ && __INTEL_COMPILER==1200 && !TBB_USE_DEBUG)</span>
-<a name="l00271"></a>00271 <span class="preprocessor"></span>
-<a name="l00272"></a>00272 <span class="preprocessor"> #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1</span>
-<a name="l00273"></a>00273 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00274"></a>00274 <span class="preprocessor"></span>
-<a name="l00275"></a>00275 <span class="preprocessor">#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110</span>
-<a name="l00276"></a>00276 <span class="preprocessor"></span>
-<a name="l00277"></a>00277 <span class="preprocessor"> #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1</span>
-<a name="l00278"></a>00278 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00279"></a>00279 <span class="preprocessor"></span>
-<a name="l00280"></a>00280 <span class="preprocessor">#if __clang__ || (__GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER))</span>
-<a name="l00281"></a>00281 <span class="preprocessor"></span>
-<a name="l00282"></a>00282 <span class="preprocessor"> #define __TBB_PROTECTED_NESTED_CLASS_BROKEN 1</span>
-<a name="l00283"></a>00283 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00284"></a>00284 <span class="preprocessor"></span>
-<a name="l00285"></a>00285 <span class="preprocessor">#if __MINGW32__ && (__GNUC__<4 || __GNUC__==4 && __GNUC_MINOR__<2)</span>
-<a name="l00286"></a>00286 <span class="preprocessor"></span>
-<a name="l00288"></a>00288 <span class="preprocessor"> #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1</span>
-<a name="l00289"></a>00289 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00290"></a>00290 <span class="preprocessor"></span>
-<a name="l00291"></a>00291 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__==3 && __GNUC_PATCHLEVEL__==0</span>
-<a name="l00292"></a>00292 <span class="preprocessor"></span> <span class="comment">// GCC of this version may rashly ignore control dependencies</span>
-<a name="l00293"></a>00293 <span class="preprocessor"> #define __TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1</span>
-<a name="l00294"></a>00294 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00295"></a>00295 <span class="preprocessor"></span>
-<a name="l00296"></a>00296 <span class="preprocessor">#if __FreeBSD__</span>
-<a name="l00297"></a>00297 <span class="preprocessor"></span>
-<a name="l00299"></a>00299 <span class="preprocessor"> #define __TBB_PRIO_INHERIT_BROKEN 1</span>
-<a name="l00300"></a>00300 <span class="preprocessor"></span>
-<a name="l00303"></a>00303 <span class="preprocessor"> #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
-<a name="l00304"></a>00304 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 <span class="preprocessor">#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)</span>
-<a name="l00307"></a>00307 <span class="preprocessor"></span>
-<a name="l00309"></a>00309 <span class="preprocessor"> #define __TBB_ICC_ASM_VOLATILE_BROKEN 1</span>
-<a name="l00310"></a>00310 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00311"></a>00311 <span class="preprocessor"></span>
-<a name="l00312"></a>00312 <span class="preprocessor">#if !__INTEL_COMPILER && (_MSC_VER || __GNUC__==3 && __GNUC_MINOR__<=2)</span>
-<a name="l00313"></a>00313 <span class="preprocessor"></span>
-<a name="l00315"></a>00315 <span class="preprocessor"> #define __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1</span>
-<a name="l00316"></a>00316 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00317"></a>00317 <span class="preprocessor"></span>
-<a name="l00318"></a>00318 <span class="preprocessor">#if __INTEL_COMPILER</span>
-<a name="l00319"></a>00319 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_STD_FORWARD_BROKEN 1</span>
-<a name="l00320"></a>00320 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00321"></a>00321 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CPP11_STD_FORWARD_BROKEN 0</span>
-<a name="l00322"></a>00322 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00323"></a>00323 <span class="preprocessor"></span>
-<a name="l00324"></a>00324 <span class="preprocessor">#if __TBB_DEFINE_MIC</span>
-<a name="l00325"></a>00325 <span class="preprocessor"></span>
-<a name="l00326"></a>00326 <span class="preprocessor"> #define __TBB_MAIN_THREAD_AFFINITY_BROKEN 1</span>
-<a name="l00327"></a>00327 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00328"></a>00328 <span class="preprocessor"></span>
-<a name="l00329"></a>00329 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00639.html b/doc/html/a00639.html
deleted file mode 100644
index 7c36f8b..0000000
--- a/doc/html/a00639.html
+++ /dev/null
@@ -1,322 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_exception.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_exception.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_exception_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_exception_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <stdexcept></span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include <string></span> <span class="comment">// required to construct std exception classes</span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="keyword">namespace </span>tbb {
-<a name="l00040"></a>00040
-<a name="l00042"></a><a class="code" href="a00258.html">00042</a> <span class="keyword">class </span><a class="code" href="a00258.html">bad_last_alloc</a> : <span class="keyword">public</span> std::bad_alloc {
-<a name="l00043"></a>00043 <span class="keyword">public</span>:
-<a name="l00044"></a>00044 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
-<a name="l00045"></a>00045 <span class="preprocessor">#if __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span> <span class="comment">/*override*/</span> ~<a class="code" href="a00258.html">bad_last_alloc</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00047"></a>00047 <span class="preprocessor">#endif</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span>};
-<a name="l00049"></a>00049
-<a name="l00051"></a><a class="code" href="a00290.html">00051</a> <span class="keyword">class </span><a class="code" href="a00290.html">improper_lock</a> : <span class="keyword">public</span> std::exception {
-<a name="l00052"></a>00052 <span class="keyword">public</span>:
-<a name="l00053"></a>00053 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
-<a name="l00054"></a>00054 };
-<a name="l00055"></a>00055
-<a name="l00057"></a><a class="code" href="a00351.html">00057</a> <span class="keyword">class </span><a class="code" href="a00351.html">user_abort</a> : <span class="keyword">public</span> std::exception {
-<a name="l00058"></a>00058 <span class="keyword">public</span>:
-<a name="l00059"></a>00059 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
-<a name="l00060"></a>00060 };
-<a name="l00061"></a>00061
-<a name="l00063"></a><a class="code" href="a00298.html">00063</a> <span class="keyword">class </span><a class="code" href="a00298.html">missing_wait</a> : <span class="keyword">public</span> std::exception {
-<a name="l00064"></a>00064 <span class="keyword">public</span>:
-<a name="l00065"></a>00065 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
-<a name="l00066"></a>00066 };
-<a name="l00067"></a>00067
-<a name="l00069"></a><a class="code" href="a00291.html">00069</a> <span class="keyword">class </span><a class="code" href="a00291.html">invalid_multiple_scheduling</a> : <span class="keyword">public</span> std::exception {
-<a name="l00070"></a>00070 <span class="keyword">public</span>:
-<a name="l00071"></a>00071 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
-<a name="l00072"></a>00072 };
-<a name="l00073"></a>00073
-<a name="l00074"></a>00074 <span class="keyword">namespace </span>internal {
-<a name="l00076"></a>00076 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_bad_last_alloc_exception_v4();
-<a name="l00077"></a>00077
-<a name="l00078"></a>00078 <span class="keyword">enum</span> exception_id {
-<a name="l00079"></a>00079 eid_bad_alloc = 1,
-<a name="l00080"></a>00080 eid_bad_last_alloc,
-<a name="l00081"></a>00081 eid_nonpositive_step,
-<a name="l00082"></a>00082 eid_out_of_range,
-<a name="l00083"></a>00083 eid_segment_range_error,
-<a name="l00084"></a>00084 eid_index_range_error,
-<a name="l00085"></a>00085 eid_missing_wait,
-<a name="l00086"></a>00086 eid_invalid_multiple_scheduling,
-<a name="l00087"></a>00087 eid_improper_lock,
-<a name="l00088"></a>00088 eid_possible_deadlock,
-<a name="l00089"></a>00089 eid_operation_not_permitted,
-<a name="l00090"></a>00090 eid_condvar_wait_failed,
-<a name="l00091"></a>00091 eid_invalid_load_factor,
-<a name="l00092"></a>00092 eid_reserved, <span class="comment">// free slot for backward compatibility, can be reused.</span>
-<a name="l00093"></a>00093 eid_invalid_swap,
-<a name="l00094"></a>00094 eid_reservation_length_error,
-<a name="l00095"></a>00095 eid_invalid_key,
-<a name="l00096"></a>00096 eid_user_abort,
-<a name="l00098"></a>00098
-<a name="l00100"></a>00100 eid_max
-<a name="l00101"></a>00101 };
-<a name="l00102"></a>00102
-<a name="l00104"></a>00104
-<a name="l00106"></a>00106 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_exception_v4 ( exception_id );
-<a name="l00107"></a>00107
-<a name="l00109"></a>00109 <span class="keyword">inline</span> <span class="keywordtype">void</span> throw_exception ( exception_id eid ) { throw_exception_v4(eid); }
-<a name="l00110"></a>00110
-<a name="l00111"></a>00111 } <span class="comment">// namespace internal</span>
-<a name="l00112"></a>00112 } <span class="comment">// namespace tbb</span>
-<a name="l00113"></a>00113
-<a name="l00114"></a>00114 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00116"></a>00116 <span class="preprocessor">#include <exception></span>
-<a name="l00117"></a>00117 <span class="preprocessor">#include <typeinfo></span>
-<a name="l00118"></a>00118 <span class="preprocessor">#include <new></span>
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 <span class="keyword">namespace </span>tbb {
-<a name="l00121"></a>00121
-<a name="l00123"></a>00123
-<a name="l00143"></a><a class="code" href="a00345.html">00143</a> <span class="keyword">class </span><a class="code" href="a00345.html">tbb_exception</a> : <span class="keyword">public</span> std::exception
-<a name="l00144"></a>00144 {
-<a name="l00148"></a>00148 <span class="keywordtype">void</span>* operator new ( size_t );
-<a name="l00149"></a>00149
-<a name="l00150"></a>00150 <span class="keyword">public</span>:
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 <span class="keyword">virtual</span> <a class="code" href="a00345.html">tbb_exception</a>* <a class="code" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> () <span class="keywordflow">throw</span>() = 0;
-<a name="l00154"></a>00154
-<a name="l00156"></a>00156
-<a name="l00158"></a>00158 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00345.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> () <span class="keywordflow">throw</span>() = 0;
-<a name="l00159"></a>00159
-<a name="l00161"></a>00161
-<a name="l00165"></a>00165 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00345.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> () = 0;
-<a name="l00166"></a>00166
-<a name="l00168"></a>00168 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00345.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
-<a name="l00169"></a>00169
-<a name="l00171"></a>00171 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00345.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
-<a name="l00172"></a>00172
-<a name="l00179"></a><a class="code" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">00179</a> <span class="keywordtype">void</span> <a class="code" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete </a>( <span class="keywordtype">void</span>* p ) {
-<a name="l00180"></a>00180 internal::deallocate_via_handler_v3(p);
-<a name="l00181"></a>00181 }
-<a name="l00182"></a>00182 };
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185
-<a name="l00189"></a><a class="code" href="a00266.html">00189</a> <span class="keyword">class </span><a class="code" href="a00266.html">captured_exception</a> : <span class="keyword">public</span> <a class="code" href="a00345.html">tbb_exception</a>
-<a name="l00190"></a>00190 {
-<a name="l00191"></a>00191 <span class="keyword">public</span>:
-<a name="l00192"></a>00192 <a class="code" href="a00266.html">captured_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00266.html">captured_exception</a>& src )
-<a name="l00193"></a>00193 : <a class="code" href="a00345.html">tbb_exception</a>(src), my_dynamic(<span class="keyword">false</span>)
-<a name="l00194"></a>00194 {
-<a name="l00195"></a>00195 set(src.<a class="code" href="a00266.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00266.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
-<a name="l00196"></a>00196 }
-<a name="l00197"></a>00197
-<a name="l00198"></a>00198 <a class="code" href="a00266.html">captured_exception</a> ( <span class="keyword">const</span> <span class="keywordtype">char</span>* name_, <span class="keyword">const</span> <span class="keywordtype">char</span>* info )
-<a name="l00199"></a>00199 : my_dynamic(<span class="keyword">false</span>)
-<a name="l00200"></a>00200 {
-<a name="l00201"></a>00201 set(name_, info);
-<a name="l00202"></a>00202 }
-<a name="l00203"></a>00203
-<a name="l00204"></a>00204 __TBB_EXPORTED_METHOD ~<a class="code" href="a00266.html">captured_exception</a> () <span class="keywordflow">throw</span>();
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <a class="code" href="a00266.html">captured_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00266.html">captured_exception</a>& src ) {
-<a name="l00207"></a>00207 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
-<a name="l00208"></a>00208 clear();
-<a name="l00209"></a>00209 set(src.<a class="code" href="a00266.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00266.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
-<a name="l00210"></a>00210 }
-<a name="l00211"></a>00211 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00212"></a>00212 }
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 <span class="comment">/*override*/</span>
-<a name="l00215"></a>00215 <a class="code" href="a00266.html">captured_exception</a>* __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#837a50b8f6a800bda225c39d1699643f">move</a> () <span class="keywordflow">throw</span>();
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 <span class="comment">/*override*/</span>
-<a name="l00218"></a>00218 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#93d875d3555502ff6f18513525de204c">destroy</a> () <span class="keywordflow">throw</span>();
-<a name="l00219"></a>00219
-<a name="l00220"></a>00220 <span class="comment">/*override*/</span>
-<a name="l00221"></a><a class="code" href="a00266.html#2dd1be66ab32fa27e0ddef5707fa67ef">00221</a> <span class="keywordtype">void</span> <a class="code" href="a00266.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> () { __TBB_THROW(*<span class="keyword">this</span>); }
-<a name="l00222"></a>00222
-<a name="l00223"></a>00223 <span class="comment">/*override*/</span>
-<a name="l00224"></a>00224 <span class="keyword">const</span> <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const throw();
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 <span class="comment">/*override*/</span>
-<a name="l00227"></a>00227 const <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const throw();
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set ( const <span class="keywordtype">char</span>* <a class="code" href="a00266.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, const <span class="keywordtype">char</span>* info ) throw();
-<a name="l00230"></a>00230 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD clear () throw();
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 private:
-<a name="l00234"></a>00234 <a class="code" href="a00266.html">captured_exception</a>() {}
-<a name="l00235"></a>00235
-<a name="l00237"></a>00237 <span class="keyword">static</span> captured_exception* allocate ( <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00266.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, <span class="keyword">const</span> <span class="keywordtype">char</span>* info );
-<a name="l00238"></a>00238
-<a name="l00239"></a>00239 <span class="keywordtype">bool</span> my_dynamic;
-<a name="l00240"></a>00240 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
-<a name="l00241"></a>00241 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_info;
-<a name="l00242"></a>00242 };
-<a name="l00243"></a>00243
-<a name="l00245"></a>00245
-<a name="l00249"></a>00249 <span class="keyword">template</span><<span class="keyword">typename</span> ExceptionData>
-<a name="l00250"></a><a class="code" href="a00299.html">00250</a> <span class="keyword">class </span><a class="code" href="a00299.html">movable_exception</a> : <span class="keyword">public</span> <a class="code" href="a00345.html">tbb_exception</a>
-<a name="l00251"></a>00251 {
-<a name="l00252"></a>00252 <span class="keyword">typedef</span> <a class="code" href="a00299.html">movable_exception<ExceptionData></a> <a class="code" href="a00299.html">self_type</a>;
-<a name="l00253"></a>00253
-<a name="l00254"></a>00254 <span class="keyword">public</span>:
-<a name="l00255"></a>00255 <a class="code" href="a00299.html">movable_exception</a> ( <span class="keyword">const</span> ExceptionData& data_ )
-<a name="l00256"></a>00256 : <a class="code" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(data_)
-<a name="l00257"></a>00257 , my_dynamic(<span class="keyword">false</span>)
-<a name="l00258"></a>00258 , my_exception_name(
-<a name="l00259"></a>00259 #<span class="keywordflow">if</span> TBB_USE_EXCEPTIONS
-<a name="l00260"></a>00260 <span class="keyword">typeid</span>(<a class="code" href="a00299.html">self_type</a>).<a class="code" href="a00299.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>()
-<a name="l00261"></a>00261 #<span class="keywordflow">else</span> <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00262"></a>00262 <span class="stringliteral">"movable_exception"</span>
-<a name="l00263"></a>00263 #endif <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00264"></a>00264 )
-<a name="l00265"></a>00265 {}
-<a name="l00266"></a>00266
-<a name="l00267"></a>00267 <a class="code" href="a00299.html">movable_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00299.html">movable_exception</a>& src ) <span class="keywordflow">throw</span> ()
-<a name="l00268"></a>00268 : <a class="code" href="a00345.html">tbb_exception</a>(src)
-<a name="l00269"></a>00269 , <a class="code" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(src.<a class="code" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>)
-<a name="l00270"></a>00270 , my_dynamic(<span class="keyword">false</span>)
-<a name="l00271"></a>00271 , my_exception_name(src.<a class="code" href="a00299.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>)
-<a name="l00272"></a>00272 {}
-<a name="l00273"></a>00273
-<a name="l00274"></a>00274 ~<a class="code" href="a00299.html">movable_exception</a> () <span class="keywordflow">throw</span>() {}
-<a name="l00275"></a>00275
-<a name="l00276"></a>00276 <span class="keyword">const</span> <a class="code" href="a00299.html">movable_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00299.html">movable_exception</a>& src ) {
-<a name="l00277"></a>00277 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
-<a name="l00278"></a>00278 <a class="code" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a> = src.<a class="code" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
-<a name="l00279"></a>00279 my_exception_name = src.<a class="code" href="a00299.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>;
-<a name="l00280"></a>00280 }
-<a name="l00281"></a>00281 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00282"></a>00282 }
-<a name="l00283"></a>00283
-<a name="l00284"></a>00284 ExceptionData& data () <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
-<a name="l00285"></a>00285
-<a name="l00286"></a>00286 <span class="keyword">const</span> ExceptionData& data () <span class="keyword">const</span> <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
-<a name="l00287"></a>00287
-<a name="l00288"></a><a class="code" href="a00299.html#bc5f5c4739b17ac5211ac58226c2f5a5">00288</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00299.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw() { <span class="keywordflow">return</span> my_exception_name; }
-<a name="l00289"></a>00289
-<a name="l00290"></a><a class="code" href="a00299.html#b33a89bccf0c63106f1270c7bfaaf54f">00290</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00299.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw() { <span class="keywordflow">return</span> <span class="stringliteral">"tbb::movable_exception"</span>; }
-<a name="l00291"></a>00291
-<a name="l00292"></a>00292 <span class="comment">/*override*/</span>
-<a name="l00293"></a><a class="code" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">00293</a> <a class="code" href="a00299.html">movable_exception</a>* <a class="code" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw() {
-<a name="l00294"></a>00294 <span class="keywordtype">void</span>* e = internal::allocate_via_handler_v3(<span class="keyword">sizeof</span>(<a class="code" href="a00299.html">movable_exception</a>));
-<a name="l00295"></a>00295 <span class="keywordflow">if</span> ( e ) {
-<a name="l00296"></a>00296 ::new (e) movable_exception(*<span class="keyword">this</span>);
-<a name="l00297"></a>00297 ((movable_exception*)e)->my_dynamic = <span class="keyword">true</span>;
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299 <span class="keywordflow">return</span> (movable_exception*)e;
-<a name="l00300"></a>00300 }
-<a name="l00301"></a>00301 <span class="comment">/*override*/</span>
-<a name="l00302"></a><a class="code" href="a00299.html#7a46873119d9f85a7b0009c13e41a258">00302</a> <span class="keywordtype">void</span> <a class="code" href="a00299.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw() {
-<a name="l00303"></a>00303 __TBB_ASSERT ( my_dynamic, <span class="stringliteral">"Method destroy can be called only on dynamically allocated movable_exceptions"</span> );
-<a name="l00304"></a>00304 <span class="keywordflow">if</span> ( my_dynamic ) {
-<a name="l00305"></a>00305 this->~<a class="code" href="a00299.html">movable_exception</a>();
-<a name="l00306"></a>00306 internal::deallocate_via_handler_v3(<span class="keyword">this</span>);
-<a name="l00307"></a>00307 }
-<a name="l00308"></a>00308 }
-<a name="l00309"></a>00309 <span class="comment">/*override*/</span>
-<a name="l00310"></a><a class="code" href="a00299.html#17cffba35811c92b7e65d63506b69602">00310</a> <span class="keywordtype">void</span> <a class="code" href="a00299.html#17cffba35811c92b7e65d63506b69602">throw_self</a> () { __TBB_THROW( *<span class="keyword">this</span> ); }
-<a name="l00311"></a>00311
-<a name="l00312"></a>00312 <span class="keyword">protected</span>:
-<a name="l00314"></a><a class="code" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">00314</a> ExceptionData <a class="code" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
-<a name="l00315"></a>00315
-<a name="l00316"></a>00316 <span class="keyword">private</span>:
-<a name="l00318"></a>00318 <span class="keywordtype">bool</span> my_dynamic;
-<a name="l00319"></a>00319
-<a name="l00321"></a>00321
-<a name="l00322"></a>00322 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
-<a name="l00323"></a>00323 };
-<a name="l00324"></a>00324
-<a name="l00325"></a>00325 <span class="preprocessor">#if !TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00326"></a>00326 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
-<a name="l00327"></a>00327
-<a name="l00329"></a>00329
-<a name="l00331"></a><a class="code" href="a00346.html">00331</a> <span class="keyword">class </span><a class="code" href="a00346.html">tbb_exception_ptr</a> {
-<a name="l00332"></a>00332 std::exception_ptr my_ptr;
-<a name="l00333"></a>00333
-<a name="l00334"></a>00334 <span class="keyword">public</span>:
-<a name="l00335"></a>00335 <span class="keyword">static</span> <a class="code" href="a00346.html">tbb_exception_ptr</a>* allocate ();
-<a name="l00336"></a>00336 <span class="keyword">static</span> <a class="code" href="a00346.html">tbb_exception_ptr</a>* allocate ( <span class="keyword">const</span> <a class="code" href="a00345.html">tbb_exception</a>& tag );
-<a name="l00338"></a>00338 <span class="keyword">static</span> <a class="code" href="a00346.html">tbb_exception_ptr</a>* allocate ( <a class="code" href="a00266.html">captured_exception</a>& src );
-<a name="l00339"></a>00339
-<a name="l00341"></a>00341
-<a name="l00342"></a>00342 <span class="keywordtype">void</span> <a class="code" href="a00346.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () <span class="keywordflow">throw</span>();
-<a name="l00343"></a>00343
-<a name="l00345"></a><a class="code" href="a00346.html#292832fd5c523e3d8081a22247840a1d">00345</a> <span class="keywordtype">void</span> <a class="code" href="a00346.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> () { std::rethrow_exception(my_ptr); }
-<a name="l00346"></a>00346
-<a name="l00347"></a>00347 <span class="keyword">private</span>:
-<a name="l00348"></a>00348 <a class="code" href="a00346.html">tbb_exception_ptr</a> ( <span class="keyword">const</span> std::exception_ptr& src ) : my_ptr(src) {}
-<a name="l00349"></a>00349 tbb_exception_ptr ( <span class="keyword">const</span> <a class="code" href="a00266.html">captured_exception</a>& src ) : my_ptr(std::copy_exception(src)) {}
-<a name="l00350"></a>00350 }; <span class="comment">// class tbb::internal::tbb_exception_ptr</span>
-<a name="l00351"></a>00351
-<a name="l00352"></a>00352 } <span class="comment">// namespace internal</span>
-<a name="l00353"></a>00353 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00354"></a>00354
-<a name="l00355"></a>00355 } <span class="comment">// namespace tbb</span>
-<a name="l00356"></a>00356
-<a name="l00357"></a>00357 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00358"></a>00358
-<a name="l00359"></a>00359 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_exception_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00640.html b/doc/html/a00640.html
deleted file mode 100644
index 618adc7..0000000
--- a/doc/html/a00640.html
+++ /dev/null
@@ -1,782 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_machine.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_machine.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_machine_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00116"></a>00116 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00117"></a>00117
-<a name="l00118"></a>00118 <span class="keyword">namespace </span>tbb {
-<a name="l00119"></a>00119 <span class="keyword">namespace </span>internal {
-<a name="l00120"></a>00120
-<a name="l00122"></a>00122 <span class="comment">// Overridable helpers declarations</span>
-<a name="l00123"></a>00123 <span class="comment">//</span>
-<a name="l00124"></a>00124 <span class="comment">// A machine/*.h file may choose to define these templates, otherwise it must</span>
-<a name="l00125"></a>00125 <span class="comment">// request default implementation by setting appropriate __TBB_USE_GENERIC_XXX macro(s).</span>
-<a name="l00126"></a>00126 <span class="comment">//</span>
-<a name="l00127"></a>00127 <span class="keyword">template</span> <<span class="keyword">typename</span> T, std::size_t S>
-<a name="l00128"></a>00128 <span class="keyword">struct </span>machine_load_store;
-<a name="l00129"></a>00129
-<a name="l00130"></a>00130 <span class="keyword">template</span> <<span class="keyword">typename</span> T, std::size_t S>
-<a name="l00131"></a>00131 <span class="keyword">struct </span>machine_load_store_relaxed;
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="keyword">template</span> <<span class="keyword">typename</span> T, std::size_t S>
-<a name="l00134"></a>00134 <span class="keyword">struct </span>machine_load_store_seq_cst;
-<a name="l00135"></a>00135 <span class="comment">//</span>
-<a name="l00136"></a>00136 <span class="comment">// End of overridable helpers declarations</span>
-<a name="l00138"></a>00138 <span class="comment"></span>
-<a name="l00139"></a>00139 <span class="keyword">template</span><size_t S> <span class="keyword">struct </span>atomic_selector;
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<1> {
-<a name="l00142"></a>00142 <span class="keyword">typedef</span> int8_t word;
-<a name="l00143"></a>00143 <span class="keyword">inline</span> <span class="keyword">static</span> word fetch_store ( <span class="keyword">volatile</span> <span class="keywordtype">void</span>* location, word value );
-<a name="l00144"></a>00144 };
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<2> {
-<a name="l00147"></a>00147 <span class="keyword">typedef</span> int16_t word;
-<a name="l00148"></a>00148 <span class="keyword">inline</span> <span class="keyword">static</span> word fetch_store ( <span class="keyword">volatile</span> <span class="keywordtype">void</span>* location, word value );
-<a name="l00149"></a>00149 };
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<4> {
-<a name="l00152"></a>00152 <span class="preprocessor">#if _MSC_VER && !_WIN64</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span> <span class="comment">// Work-around that avoids spurious /Wp64 warnings</span>
-<a name="l00154"></a>00154 <span class="keyword">typedef</span> intptr_t word;
-<a name="l00155"></a>00155 <span class="preprocessor">#else</span>
-<a name="l00156"></a>00156 <span class="preprocessor"></span> <span class="keyword">typedef</span> int32_t word;
-<a name="l00157"></a>00157 <span class="preprocessor">#endif</span>
-<a name="l00158"></a>00158 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keyword">static</span> word fetch_store ( <span class="keyword">volatile</span> <span class="keywordtype">void</span>* location, word value );
-<a name="l00159"></a>00159 };
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<8> {
-<a name="l00162"></a>00162 <span class="keyword">typedef</span> int64_t word;
-<a name="l00163"></a>00163 <span class="keyword">inline</span> <span class="keyword">static</span> word fetch_store ( <span class="keyword">volatile</span> <span class="keywordtype">void</span>* location, word value );
-<a name="l00164"></a>00164 };
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 }} <span class="comment">// namespaces internal, tbb</span>
-<a name="l00167"></a>00167
-<a name="l00168"></a>00168 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00169"></a>00169 <span class="preprocessor"></span>
-<a name="l00170"></a>00170 <span class="preprocessor">#ifdef _MANAGED</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(push, off)</span>
-<a name="l00172"></a>00172 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span>
-<a name="l00174"></a>00174 <span class="preprocessor"> #if __MINGW64__ || __MINGW32__</span>
-<a name="l00175"></a>00175 <span class="preprocessor"></span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> __declspec(dllimport) int __stdcall SwitchToThread( <span class="keywordtype">void</span> );
-<a name="l00176"></a>00176 <span class="preprocessor">#define __TBB_Yield() SwitchToThread()</span>
-<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor"> #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/gcc_generic.h"</span>
-<a name="l00179"></a>00179 <span class="preprocessor"> #elif __MINGW64__</span>
-<a name="l00180"></a>00180 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_intel64.h"</span>
-<a name="l00181"></a>00181 <span class="preprocessor"> #elif __MINGW32__</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia32.h"</span>
-<a name="l00183"></a>00183 <span class="preprocessor"> #endif</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor"> #elif defined(_M_IX86)</span>
-<a name="l00185"></a>00185 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/windows_ia32.h"</span>
-<a name="l00186"></a>00186 <span class="preprocessor"> #elif defined(_M_X64) </span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/windows_intel64.h"</span>
-<a name="l00188"></a>00188 <span class="preprocessor"> #elif _XBOX</span>
-<a name="l00189"></a>00189 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/xbox360_ppc.h"</span>
-<a name="l00190"></a>00190 <span class="preprocessor"> #endif</span>
-<a name="l00191"></a>00191 <span class="preprocessor"></span>
-<a name="l00192"></a>00192 <span class="preprocessor">#ifdef _MANAGED</span>
-<a name="l00193"></a>00193 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(pop)</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span>
-<a name="l00196"></a>00196 <span class="preprocessor">#elif __TBB_DEFINE_MIC</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span>
-<a name="l00198"></a>00198 <span class="preprocessor"> #include "machine/mic_common.h"</span>
-<a name="l00199"></a>00199 <span class="preprocessor"> #include "machine/linux_intel64.h"</span>
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 <span class="preprocessor">#elif __linux__ || __FreeBSD__ || __NetBSD__</span>
-<a name="l00202"></a>00202 <span class="preprocessor"></span>
-<a name="l00203"></a>00203 <span class="preprocessor"> #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)</span>
-<a name="l00204"></a>00204 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/gcc_generic.h"</span>
-<a name="l00205"></a>00205 <span class="preprocessor"> #elif __i386__</span>
-<a name="l00206"></a>00206 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia32.h"</span>
-<a name="l00207"></a>00207 <span class="preprocessor"> #elif __x86_64__</span>
-<a name="l00208"></a>00208 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_intel64.h"</span>
-<a name="l00209"></a>00209 <span class="preprocessor"> #elif __ia64__</span>
-<a name="l00210"></a>00210 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia64.h"</span>
-<a name="l00211"></a>00211 <span class="preprocessor"> #elif __powerpc__</span>
-<a name="l00212"></a>00212 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/mac_ppc.h"</span>
-<a name="l00213"></a>00213 <span class="preprocessor"> #elif __TBB_GCC_BUILTIN_ATOMICS_PRESENT</span>
-<a name="l00214"></a>00214 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/gcc_generic.h"</span>
-<a name="l00215"></a>00215 <span class="preprocessor"> #endif</span>
-<a name="l00216"></a>00216 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_common.h"</span>
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="preprocessor">#elif __APPLE__</span>
-<a name="l00219"></a>00219 <span class="preprocessor"></span>
-<a name="l00220"></a>00220 <span class="preprocessor"> #if __i386__</span>
-<a name="l00221"></a>00221 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia32.h"</span>
-<a name="l00222"></a>00222 <span class="preprocessor"> #elif __x86_64__</span>
-<a name="l00223"></a>00223 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_intel64.h"</span>
-<a name="l00224"></a>00224 <span class="preprocessor"> #elif __POWERPC__</span>
-<a name="l00225"></a>00225 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/mac_ppc.h"</span>
-<a name="l00226"></a>00226 <span class="preprocessor"> #endif</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/macos_common.h"</span>
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="preprocessor">#elif _AIX</span>
-<a name="l00230"></a>00230 <span class="preprocessor"></span>
-<a name="l00231"></a>00231 <span class="preprocessor"> #include "machine/ibm_aix51.h"</span>
-<a name="l00232"></a>00232
-<a name="l00233"></a>00233 <span class="preprocessor">#elif __sun || __SUNPRO_CC</span>
-<a name="l00234"></a>00234 <span class="preprocessor"></span>
-<a name="l00235"></a>00235 <span class="preprocessor"> #define __asm__ asm</span>
-<a name="l00236"></a>00236 <span class="preprocessor"></span><span class="preprocessor"> #define __volatile__ volatile</span>
-<a name="l00237"></a>00237 <span class="preprocessor"></span>
-<a name="l00238"></a>00238 <span class="preprocessor"> #if __i386 || __i386__</span>
-<a name="l00239"></a>00239 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia32.h"</span>
-<a name="l00240"></a>00240 <span class="preprocessor"> #elif __x86_64__</span>
-<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_intel64.h"</span>
-<a name="l00242"></a>00242 <span class="preprocessor"> #elif __sparc</span>
-<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/sunos_sparc.h"</span>
-<a name="l00244"></a>00244 <span class="preprocessor"> #endif</span>
-<a name="l00245"></a>00245 <span class="preprocessor"></span><span class="preprocessor"> #include <sched.h></span>
-<a name="l00246"></a>00246
-<a name="l00247"></a>00247 <span class="preprocessor"> #define __TBB_Yield() sched_yield()</span>
-<a name="l00248"></a>00248 <span class="preprocessor"></span>
-<a name="l00249"></a>00249 <span class="preprocessor">#endif </span><span class="comment">/* OS selection */</span>
-<a name="l00250"></a>00250
-<a name="l00251"></a>00251 <span class="preprocessor">#ifndef __TBB_64BIT_ATOMICS</span>
-<a name="l00252"></a>00252 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_64BIT_ATOMICS 1</span>
-<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00254"></a>00254 <span class="preprocessor"></span>
-<a name="l00255"></a>00255 <span class="comment">// Special atomic functions</span>
-<a name="l00256"></a>00256 <span class="preprocessor">#if __TBB_USE_FENCED_ATOMICS</span>
-<a name="l00257"></a>00257 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_cmpswp1 __TBB_machine_cmpswp1full_fence</span>
-<a name="l00258"></a>00258 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_cmpswp2 __TBB_machine_cmpswp2full_fence</span>
-<a name="l00259"></a>00259 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_cmpswp4 __TBB_machine_cmpswp4full_fence</span>
-<a name="l00260"></a>00260 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_cmpswp8 __TBB_machine_cmpswp8full_fence</span>
-<a name="l00261"></a>00261 <span class="preprocessor"></span>
-<a name="l00262"></a>00262 <span class="preprocessor"> #if __TBB_WORDSIZE==8</span>
-<a name="l00263"></a>00263 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_fetchadd8 __TBB_machine_fetchadd8full_fence</span>
-<a name="l00264"></a>00264 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_fetchstore8 __TBB_machine_fetchstore8full_fence</span>
-<a name="l00265"></a>00265 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndAddWrelease(P,V) __TBB_machine_fetchadd8release(P,V)</span>
-<a name="l00266"></a>00266 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndIncrementWacquire(P) __TBB_machine_fetchadd8acquire(P,1)</span>
-<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndDecrementWrelease(P) __TBB_machine_fetchadd8release(P,(-1))</span>
-<a name="l00268"></a>00268 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00269"></a>00269 <span class="preprocessor"></span><span class="preprocessor"> #error Define macros for 4-byte word, similarly to the above __TBB_WORDSIZE==8 branch.</span>
-<a name="l00270"></a>00270 <span class="preprocessor"></span><span class="preprocessor"> #endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
-<a name="l00271"></a>00271 <span class="preprocessor">#else </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
-<a name="l00272"></a>00272 <span class="preprocessor"> #define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)</span>
-<a name="l00273"></a>00273 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)</span>
-<a name="l00274"></a>00274 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))</span>
-<a name="l00275"></a>00275 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
-<a name="l00276"></a>00276
-<a name="l00277"></a>00277 <span class="preprocessor">#if __TBB_WORDSIZE==4</span>
-<a name="l00278"></a>00278 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)</span>
-<a name="l00279"></a>00279 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd4(P,V)</span>
-<a name="l00280"></a>00280 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore4(P,V)</span>
-<a name="l00281"></a>00281 <span class="preprocessor"></span><span class="preprocessor">#elif __TBB_WORDSIZE==8</span>
-<a name="l00282"></a>00282 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_USE_GENERIC_DWORD_LOAD_STORE || __TBB_USE_GENERIC_DWORD_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_STORE</span>
-<a name="l00283"></a>00283 <span class="preprocessor"></span><span class="preprocessor"> #error These macros should only be used on 32-bit platforms.</span>
-<a name="l00284"></a>00284 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00285"></a>00285 <span class="preprocessor"></span>
-<a name="l00286"></a>00286 <span class="preprocessor"> #define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)</span>
-<a name="l00287"></a>00287 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd8(P,V)</span>
-<a name="l00288"></a>00288 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore8(P,V)</span>
-<a name="l00289"></a>00289 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* __TBB_WORDSIZE != 8 */</span>
-<a name="l00290"></a>00290 <span class="preprocessor"> #error Unsupported machine word size.</span>
-<a name="l00291"></a>00291 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE */</span>
-<a name="l00292"></a>00292
-<a name="l00293"></a>00293 <span class="preprocessor">#ifndef __TBB_Pause</span>
-<a name="l00294"></a>00294 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Pause(int32_t) {
-<a name="l00295"></a>00295 __TBB_Yield();
-<a name="l00296"></a>00296 }
-<a name="l00297"></a>00297 <span class="preprocessor">#endif</span>
-<a name="l00298"></a>00298 <span class="preprocessor"></span>
-<a name="l00299"></a>00299 <span class="keyword">namespace </span>tbb {
-<a name="l00300"></a>00300
-<a name="l00302"></a><a class="code" href="a00414.html#250275615f10d5b5de6ad466ae2f54de">00302</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00414.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> () { __TBB_full_memory_fence(); }
-<a name="l00303"></a>00303
-<a name="l00304"></a>00304 <span class="keyword">namespace </span>internal {
-<a name="l00305"></a>00305
-<a name="l00307"></a>00307
-<a name="l00308"></a><a class="code" href="a00256.html">00308</a> <span class="keyword">class </span><a class="code" href="a00256.html">atomic_backoff</a> : no_copy {
-<a name="l00310"></a>00310
-<a name="l00312"></a>00312 <span class="keyword">static</span> <span class="keyword">const</span> int32_t LOOPS_BEFORE_YIELD = 16;
-<a name="l00313"></a>00313 int32_t count;
-<a name="l00314"></a>00314 <span class="keyword">public</span>:
-<a name="l00315"></a>00315 <a class="code" href="a00256.html">atomic_backoff</a>() : count(1) {}
-<a name="l00316"></a>00316
-<a name="l00318"></a><a class="code" href="a00256.html#a174ea93e3bd3d5cce82389c2f28d037">00318</a> <span class="keywordtype">void</span> <a class="code" href="a00256.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>() {
-<a name="l00319"></a>00319 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00320"></a>00320 __TBB_Pause(count);
-<a name="l00321"></a>00321 <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00322"></a>00322 count*=2;
-<a name="l00323"></a>00323 } <span class="keywordflow">else</span> {
-<a name="l00324"></a>00324 <span class="comment">// Pause is so long that we might as well yield CPU to scheduler.</span>
-<a name="l00325"></a>00325 __TBB_Yield();
-<a name="l00326"></a>00326 }
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328
-<a name="l00329"></a>00329 <span class="comment">// pause for a few times and then return false immediately.</span>
-<a name="l00330"></a>00330 <span class="keywordtype">bool</span> bounded_pause() {
-<a name="l00331"></a>00331 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00332"></a>00332 __TBB_Pause(count);
-<a name="l00333"></a>00333 <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00334"></a>00334 count*=2;
-<a name="l00335"></a>00335 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00336"></a>00336 } <span class="keywordflow">else</span> {
-<a name="l00337"></a>00337 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00338"></a>00338 }
-<a name="l00339"></a>00339 }
-<a name="l00340"></a>00340
-<a name="l00341"></a>00341 <span class="keywordtype">void</span> reset() {
-<a name="l00342"></a>00342 count = 1;
-<a name="l00343"></a>00343 }
-<a name="l00344"></a>00344 };
-<a name="l00345"></a>00345
-<a name="l00347"></a>00347
-<a name="l00348"></a>00348 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00349"></a>00349 <span class="keywordtype">void</span> spin_wait_while_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, U value ) {
-<a name="l00350"></a>00350 atomic_backoff backoff;
-<a name="l00351"></a>00351 <span class="keywordflow">while</span>( location==value ) backoff.pause();
-<a name="l00352"></a>00352 }
-<a name="l00353"></a>00353
-<a name="l00355"></a>00355
-<a name="l00356"></a>00356 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00357"></a>00357 <span class="keywordtype">void</span> spin_wait_until_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, <span class="keyword">const</span> U value ) {
-<a name="l00358"></a>00358 atomic_backoff backoff;
-<a name="l00359"></a>00359 <span class="keywordflow">while</span>( location!=value ) backoff.pause();
-<a name="l00360"></a>00360 }
-<a name="l00361"></a>00361
-<a name="l00362"></a>00362 <span class="comment">//TODO: add static_assert for the requirements stated below</span>
-<a name="l00363"></a>00363 <span class="comment">//TODO: check if it works with signed types</span>
-<a name="l00364"></a>00364
-<a name="l00365"></a>00365 <span class="comment">// there are following restrictions/limitations for this operation:</span>
-<a name="l00366"></a>00366 <span class="comment">// - T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.</span>
-<a name="l00367"></a>00367 <span class="comment">// - T should be integer type of at most 4 bytes, for the casts and calculations to work.</span>
-<a name="l00368"></a>00368 <span class="comment">// (Together, these rules limit applicability of Masked CAS to uint8_t and uint16_t only,</span>
-<a name="l00369"></a>00369 <span class="comment">// as it does nothing useful for 4 bytes).</span>
-<a name="l00370"></a>00370 <span class="comment">// - The operation assumes that the architecture consistently uses either little-endian or big-endian:</span>
-<a name="l00371"></a>00371 <span class="comment">// it does not support mixed-endian or page-specific bi-endian architectures.</span>
-<a name="l00372"></a>00372 <span class="comment">// This function is the only use of __TBB_BIG_ENDIAN.</span>
-<a name="l00373"></a>00373 <span class="preprocessor">#if (__TBB_BIG_ENDIAN!=-1)</span>
-<a name="l00374"></a>00374 <span class="preprocessor"></span><span class="preprocessor"> #if ( __TBB_USE_GENERIC_PART_WORD_CAS)</span>
-<a name="l00375"></a>00375 <span class="preprocessor"></span><span class="preprocessor"> #error generic implementation of part-word CAS was explicitly disabled for this configuration</span>
-<a name="l00376"></a>00376 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00377"></a>00377 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00378"></a>00378 <span class="keyword">inline</span> T __TBB_MaskedCompareAndSwap (<span class="keyword">volatile</span> T * <span class="keyword">const</span> ptr, <span class="keyword">const</span> T value, <span class="keyword">const</span> T comparand ) {
-<a name="l00379"></a>00379 <span class="keyword">struct </span>endianness{ <span class="keyword">static</span> <span class="keywordtype">bool</span> is_big_endian(){
-<a name="l00380"></a>00380 <span class="preprocessor"> #ifndef __TBB_BIG_ENDIAN</span>
-<a name="l00381"></a>00381 <span class="preprocessor"></span> <span class="keyword">const</span> uint32_t probe = 0x03020100;
-<a name="l00382"></a>00382 <span class="keywordflow">return</span> (((<span class="keyword">const</span> <span class="keywordtype">char</span>*)(&probe))[0]==0x03);
-<a name="l00383"></a>00383 <span class="preprocessor"> #elif (__TBB_BIG_ENDIAN==0) || (__TBB_BIG_ENDIAN==1)</span>
-<a name="l00384"></a>00384 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_BIG_ENDIAN;
-<a name="l00385"></a>00385 <span class="preprocessor"> #else</span>
-<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor"> #error unexpected value of __TBB_BIG_ENDIAN</span>
-<a name="l00387"></a>00387 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00388"></a>00388 <span class="preprocessor"></span> }};
-<a name="l00389"></a>00389
-<a name="l00390"></a>00390 <span class="keyword">const</span> uint32_t byte_offset = (uint32_t) ((uintptr_t)ptr & 0x3);
-<a name="l00391"></a>00391 <span class="keyword">volatile</span> uint32_t * <span class="keyword">const</span> aligned_ptr = (uint32_t*)((uintptr_t)ptr - byte_offset );
-<a name="l00392"></a>00392
-<a name="l00393"></a>00393 <span class="comment">// location of T within uint32_t for a C++ shift operation</span>
-<a name="l00394"></a>00394 <span class="keyword">const</span> uint32_t bits_to_shift = 8*(endianness::is_big_endian() ? (4 - <span class="keyword">sizeof</span>(T) - (byte_offset)) : byte_offset);
-<a name="l00395"></a>00395 <span class="keyword">const</span> uint32_t mask = (((uint32_t)1<<(<span class="keyword">sizeof</span>(T)*8)) - 1 )<<bits_to_shift;
-<a name="l00396"></a>00396 <span class="keyword">const</span> uint32_t shifted_comparand = ((uint32_t)comparand << bits_to_shift)&mask;
-<a name="l00397"></a>00397 <span class="keyword">const</span> uint32_t shifted_value = ((uint32_t)value << bits_to_shift)&mask;
-<a name="l00398"></a>00398
-<a name="l00399"></a>00399 <span class="keywordflow">for</span>(atomic_backoff b;;b.pause()) {
-<a name="l00400"></a>00400 <span class="keyword">const</span> uint32_t surroundings = *aligned_ptr & ~mask ; <span class="comment">// reload the aligned_ptr value which might change during the pause</span>
-<a name="l00401"></a>00401 <span class="keyword">const</span> uint32_t big_comparand = surroundings | shifted_comparand ;
-<a name="l00402"></a>00402 <span class="keyword">const</span> uint32_t big_value = surroundings | shifted_value ;
-<a name="l00403"></a>00403 <span class="comment">// __TBB_machine_cmpswp4 presumed to have full fence.</span>
-<a name="l00404"></a>00404 <span class="comment">// Cast shuts up /Wp64 warning</span>
-<a name="l00405"></a>00405 <span class="keyword">const</span> uint32_t big_result = (uint32_t)__TBB_machine_cmpswp4( aligned_ptr, big_value, big_comparand );
-<a name="l00406"></a>00406 <span class="keywordflow">if</span>( big_result == big_comparand <span class="comment">// CAS succeeded</span>
-<a name="l00407"></a>00407 || ((big_result ^ big_comparand) & mask) != 0) <span class="comment">// CAS failed and the bits of interest have changed</span>
-<a name="l00408"></a>00408 {
-<a name="l00409"></a>00409 <span class="keywordflow">return</span> T((big_result & mask) >> bits_to_shift);
-<a name="l00410"></a>00410 }
-<a name="l00411"></a>00411 <span class="keywordflow">else</span> <span class="keywordflow">continue</span>; <span class="comment">// CAS failed but the bits of interest left unchanged</span>
-<a name="l00412"></a>00412 }
-<a name="l00413"></a>00413 }
-<a name="l00414"></a>00414 <span class="preprocessor">#endif</span>
-<a name="l00415"></a>00415 <span class="preprocessor"></span><span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00416"></a>00416 <span class="keyword">inline</span> T __TBB_CompareAndSwapGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value, T comparand );
-<a name="l00417"></a>00417
-<a name="l00418"></a>00418 <span class="keyword">template</span><>
-<a name="l00419"></a>00419 <span class="keyword">inline</span> uint8_t __TBB_CompareAndSwapGeneric <1,uint8_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint8_t value, uint8_t comparand ) {
-<a name="l00420"></a>00420 #<span class="keywordflow">if</span> __TBB_USE_GENERIC_PART_WORD_CAS
-<a name="l00421"></a>00421 <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<uint8_t>((<span class="keyword">volatile</span> uint8_t *)ptr,value,comparand);
-<a name="l00422"></a>00422 <span class="preprocessor">#else</span>
-<a name="l00423"></a>00423 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_machine_cmpswp1(ptr,value,comparand);
-<a name="l00424"></a>00424 <span class="preprocessor">#endif</span>
-<a name="l00425"></a>00425 <span class="preprocessor"></span>}
-<a name="l00426"></a>00426
-<a name="l00427"></a>00427 <span class="keyword">template</span><>
-<a name="l00428"></a>00428 <span class="keyword">inline</span> uint16_t __TBB_CompareAndSwapGeneric <2,uint16_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint16_t value, uint16_t comparand ) {
-<a name="l00429"></a>00429 #<span class="keywordflow">if</span> __TBB_USE_GENERIC_PART_WORD_CAS
-<a name="l00430"></a>00430 <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<uint16_t>((<span class="keyword">volatile</span> uint16_t *)ptr,value,comparand);
-<a name="l00431"></a>00431 <span class="preprocessor">#else</span>
-<a name="l00432"></a>00432 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_machine_cmpswp2(ptr,value,comparand);
-<a name="l00433"></a>00433 <span class="preprocessor">#endif</span>
-<a name="l00434"></a>00434 <span class="preprocessor"></span>}
-<a name="l00435"></a>00435
-<a name="l00436"></a>00436 <span class="keyword">template</span><>
-<a name="l00437"></a>00437 <span class="keyword">inline</span> uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint32_t value, uint32_t comparand ) {
-<a name="l00438"></a>00438 <span class="comment">// Cast shuts up /Wp64 warning</span>
-<a name="l00439"></a>00439 <span class="keywordflow">return</span> (uint32_t)__TBB_machine_cmpswp4(ptr,value,comparand);
-<a name="l00440"></a>00440 }
-<a name="l00441"></a>00441
-<a name="l00442"></a>00442 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00443"></a>00443 <span class="preprocessor"></span><span class="keyword">template</span><>
-<a name="l00444"></a>00444 <span class="keyword">inline</span> uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint64_t value, uint64_t comparand ) {
-<a name="l00445"></a>00445 <span class="keywordflow">return</span> __TBB_machine_cmpswp8(ptr,value,comparand);
-<a name="l00446"></a>00446 }
-<a name="l00447"></a>00447 <span class="preprocessor">#endif</span>
-<a name="l00448"></a>00448 <span class="preprocessor"></span>
-<a name="l00449"></a>00449 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00450"></a>00450 <span class="keyword">inline</span> T __TBB_FetchAndAddGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T addend) {
-<a name="l00451"></a>00451 atomic_backoff b;
-<a name="l00452"></a>00452 T result;
-<a name="l00453"></a>00453 <span class="keywordflow">for</span>(;;) {
-<a name="l00454"></a>00454 result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00455"></a>00455 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
-<a name="l00456"></a>00456 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
-<a name="l00457"></a>00457 <span class="keywordflow">break</span>;
-<a name="l00458"></a>00458 b.pause();
-<a name="l00459"></a>00459 }
-<a name="l00460"></a>00460 <span class="keywordflow">return</span> result;
-<a name="l00461"></a>00461 }
-<a name="l00462"></a>00462
-<a name="l00463"></a>00463 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00464"></a>00464 <span class="keyword">inline</span> T __TBB_FetchAndStoreGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value) {
-<a name="l00465"></a>00465 atomic_backoff b;
-<a name="l00466"></a>00466 T result;
-<a name="l00467"></a>00467 <span class="keywordflow">for</span>(;;) {
-<a name="l00468"></a>00468 result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00469"></a>00469 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
-<a name="l00470"></a>00470 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
-<a name="l00471"></a>00471 <span class="keywordflow">break</span>;
-<a name="l00472"></a>00472 b.pause();
-<a name="l00473"></a>00473 }
-<a name="l00474"></a>00474 <span class="keywordflow">return</span> result;
-<a name="l00475"></a>00475 }
-<a name="l00476"></a>00476
-<a name="l00477"></a>00477 <span class="preprocessor">#if __TBB_USE_GENERIC_PART_WORD_CAS</span>
-<a name="l00478"></a>00478 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_cmpswp1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t></span>
-<a name="l00479"></a>00479 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_cmpswp2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t></span>
-<a name="l00480"></a>00480 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00481"></a>00481 <span class="preprocessor"></span>
-<a name="l00482"></a>00482 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_PART_WORD_FETCH_ADD</span>
-<a name="l00483"></a>00483 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t></span>
-<a name="l00484"></a>00484 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t></span>
-<a name="l00485"></a>00485 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00486"></a>00486 <span class="preprocessor"></span>
-<a name="l00487"></a>00487 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_ADD</span>
-<a name="l00488"></a>00488 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t></span>
-<a name="l00489"></a>00489 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00490"></a>00490 <span class="preprocessor"></span>
-<a name="l00491"></a>00491 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_ADD</span>
-<a name="l00492"></a>00492 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t></span>
-<a name="l00493"></a>00493 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00494"></a>00494 <span class="preprocessor"></span>
-<a name="l00495"></a>00495 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_PART_WORD_FETCH_STORE</span>
-<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t></span>
-<a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t></span>
-<a name="l00498"></a>00498 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00499"></a>00499 <span class="preprocessor"></span>
-<a name="l00500"></a>00500 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_STORE</span>
-<a name="l00501"></a>00501 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t></span>
-<a name="l00502"></a>00502 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00503"></a>00503 <span class="preprocessor"></span>
-<a name="l00504"></a>00504 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_DWORD_FETCH_STORE</span>
-<a name="l00505"></a>00505 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t></span>
-<a name="l00506"></a>00506 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00507"></a>00507 <span class="preprocessor"></span>
-<a name="l00508"></a>00508 <span class="preprocessor">#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE</span>
-<a name="l00509"></a>00509 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(S) \</span>
-<a name="l00510"></a>00510 <span class="preprocessor"> atomic_selector<S>::word atomic_selector<S>::fetch_store ( volatile void* location, word value ) { \</span>
-<a name="l00511"></a>00511 <span class="preprocessor"> return __TBB_machine_fetchstore##S( location, value ); \</span>
-<a name="l00512"></a>00512 <span class="preprocessor"> }</span>
-<a name="l00513"></a>00513 <span class="preprocessor"></span>
-<a name="l00514"></a>00514 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(1)
-<a name="l00515"></a>00515 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(2)
-<a name="l00516"></a>00516 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(4)
-<a name="l00517"></a>00517 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(8)
-<a name="l00518"></a>00518
-<a name="l00519"></a>00519 <span class="preprocessor">#undef __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE</span>
-<a name="l00520"></a>00520 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */</span>
-<a name="l00521"></a>00521
-<a name="l00522"></a>00522 <span class="preprocessor">#if __TBB_USE_GENERIC_DWORD_LOAD_STORE</span>
-<a name="l00523"></a>00523 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_machine_store8 (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, int64_t value) {
-<a name="l00524"></a>00524 <span class="keywordflow">for</span>(;;) {
-<a name="l00525"></a>00525 int64_t result = *(int64_t *)ptr;
-<a name="l00526"></a>00526 <span class="keywordflow">if</span>( __TBB_machine_cmpswp8(ptr,value,result)==result ) <span class="keywordflow">break</span>;
-<a name="l00527"></a>00527 }
-<a name="l00528"></a>00528 }
-<a name="l00529"></a>00529
-<a name="l00530"></a>00530 <span class="keyword">inline</span> int64_t __TBB_machine_load8 (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr) {
-<a name="l00531"></a>00531 <span class="comment">// Comparand and new value may be anything, they only must be equal, and</span>
-<a name="l00532"></a>00532 <span class="comment">// the value should have a low probability to be actually found in 'location'.</span>
-<a name="l00533"></a>00533 <span class="keyword">const</span> int64_t anyvalue = 2305843009213693951LL;
-<a name="l00534"></a>00534 <span class="keywordflow">return</span> __TBB_machine_cmpswp8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
-<a name="l00535"></a>00535 }
-<a name="l00536"></a>00536 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_GENERIC_DWORD_LOAD_STORE */</span>
-<a name="l00537"></a>00537
-<a name="l00538"></a>00538 <span class="preprocessor">#if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE</span>
-<a name="l00539"></a>00539 <span class="preprocessor"></span>
-<a name="l00545"></a>00545 <span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
-<a name="l00546"></a>00546 <span class="keyword">struct </span>machine_load_store {
-<a name="l00547"></a>00547 <span class="keyword">static</span> T load_with_acquire ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
-<a name="l00548"></a>00548 T to_return = location;
-<a name="l00549"></a>00549 __TBB_acquire_consistency_helper();
-<a name="l00550"></a>00550 <span class="keywordflow">return</span> to_return;
-<a name="l00551"></a>00551 }
-<a name="l00552"></a>00552 <span class="keyword">static</span> <span class="keywordtype">void</span> store_with_release ( <span class="keyword">volatile</span> T &location, T value ) {
-<a name="l00553"></a>00553 __TBB_release_consistency_helper();
-<a name="l00554"></a>00554 location = value;
-<a name="l00555"></a>00555 }
-<a name="l00556"></a>00556 };
-<a name="l00557"></a>00557
-<a name="l00558"></a>00558 <span class="comment">//in general, plain load and store of 32bit compiler is not atomic for 64bit types</span>
-<a name="l00559"></a>00559 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
-<a name="l00560"></a>00560 <span class="preprocessor"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00561"></a>00561 <span class="keyword">struct </span>machine_load_store<T,8> {
-<a name="l00562"></a>00562 <span class="keyword">static</span> T load_with_acquire ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
-<a name="l00563"></a>00563 <span class="keywordflow">return</span> (T)__TBB_machine_load8( (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location );
-<a name="l00564"></a>00564 }
-<a name="l00565"></a>00565 <span class="keyword">static</span> <span class="keywordtype">void</span> store_with_release ( <span class="keyword">volatile</span> T& location, T value ) {
-<a name="l00566"></a>00566 __TBB_machine_store8( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (int64_t)value );
-<a name="l00567"></a>00567 }
-<a name="l00568"></a>00568 };
-<a name="l00569"></a>00569 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */</span>
-<a name="l00570"></a>00570 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE */</span>
-<a name="l00571"></a>00571
-<a name="l00572"></a>00572 <span class="preprocessor">#if __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE</span>
-<a name="l00573"></a>00573 <span class="preprocessor"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
-<a name="l00574"></a>00574 <span class="keyword">struct </span>machine_load_store_seq_cst {
-<a name="l00575"></a>00575 <span class="keyword">static</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
-<a name="l00576"></a>00576 __TBB_full_memory_fence();
-<a name="l00577"></a>00577 <span class="keywordflow">return</span> machine_load_store<T,S>::load_with_acquire( location );
-<a name="l00578"></a>00578 }
-<a name="l00579"></a>00579 <span class="preprocessor">#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE</span>
-<a name="l00580"></a>00580 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T &location, T value ) {
-<a name="l00581"></a>00581 atomic_selector<S>::fetch_store( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (<span class="keyword">typename</span> atomic_selector<S>::word)value );
-<a name="l00582"></a>00582 }
-<a name="l00583"></a>00583 <span class="preprocessor">#else </span><span class="comment">/* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */</span>
-<a name="l00584"></a>00584 <span class="keyword">static</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T &location, T value ) {
-<a name="l00585"></a>00585 machine_load_store<T,S>::store_with_release( location, value );
-<a name="l00586"></a>00586 __TBB_full_memory_fence();
-<a name="l00587"></a>00587 }
-<a name="l00588"></a>00588 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */</span>
-<a name="l00589"></a>00589 };
-<a name="l00590"></a>00590
-<a name="l00591"></a>00591 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
-<a name="l00592"></a>00592 <span class="preprocessor"></span>
-<a name="l00594"></a>00594 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00595"></a><a class="code" href="a00294.html">00595</a> <span class="keyword">struct </span>machine_load_store_seq_cst<T,8> {
-<a name="l00596"></a>00596 <span class="keyword">static</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
-<a name="l00597"></a>00597 <span class="comment">// Comparand and new value may be anything, they only must be equal, and</span>
-<a name="l00598"></a>00598 <span class="comment">// the value should have a low probability to be actually found in 'location'.</span>
-<a name="l00599"></a>00599 <span class="keyword">const</span> int64_t anyvalue = 2305843009213693951LL;
-<a name="l00600"></a>00600 <span class="keywordflow">return</span> __TBB_machine_cmpswp8( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)const_cast<volatile T*>(&location), anyvalue, anyvalue );
-<a name="l00601"></a>00601 }
-<a name="l00602"></a>00602 <span class="keyword">static</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T &location, T value ) {
-<a name="l00603"></a>00603 int64_t result = (<span class="keyword">volatile</span> int64_t&)location;
-<a name="l00604"></a>00604 <span class="keywordflow">while</span> ( __TBB_machine_cmpswp8((<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (int64_t)value, result) != result )
-<a name="l00605"></a>00605 result = (<span class="keyword">volatile</span> int64_t&)location;
-<a name="l00606"></a>00606 }
-<a name="l00607"></a>00607 };
-<a name="l00608"></a>00608 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */</span>
-<a name="l00609"></a>00609 <span class="preprocessor">#endif </span><span class="comment">/*__TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE */</span>
-<a name="l00610"></a>00610
-<a name="l00611"></a>00611 <span class="preprocessor">#if __TBB_USE_GENERIC_RELAXED_LOAD_STORE</span>
-<a name="l00612"></a>00612 <span class="preprocessor"></span><span class="comment">// Relaxed operations add volatile qualifier to prevent compiler from optimizing them out.</span>
-<a name="l00616"></a>00616 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
-<a name="l00617"></a><a class="code" href="a00293.html">00617</a> <span class="keyword">struct </span><a class="code" href="a00293.html">machine_load_store_relaxed</a> {
-<a name="l00618"></a>00618 <span class="keyword">static</span> <span class="keyword">inline</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
-<a name="l00619"></a>00619 <span class="keywordflow">return</span> location;
-<a name="l00620"></a>00620 }
-<a name="l00621"></a>00621 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T& location, T value ) {
-<a name="l00622"></a>00622 location = value;
-<a name="l00623"></a>00623 }
-<a name="l00624"></a>00624 };
-<a name="l00625"></a>00625
-<a name="l00626"></a>00626 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
-<a name="l00627"></a>00627 <span class="preprocessor"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00628"></a>00628 <span class="keyword">struct </span><a class="code" href="a00293.html">machine_load_store_relaxed</a><T,8> {
-<a name="l00629"></a>00629 <span class="keyword">static</span> <span class="keyword">inline</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
-<a name="l00630"></a>00630 <span class="keywordflow">return</span> (T)__TBB_machine_load8( (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location );
-<a name="l00631"></a>00631 }
-<a name="l00632"></a>00632 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T& location, T value ) {
-<a name="l00633"></a>00633 __TBB_machine_store8( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (int64_t)value );
-<a name="l00634"></a>00634 }
-<a name="l00635"></a>00635 };
-<a name="l00636"></a>00636 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */</span>
-<a name="l00637"></a>00637 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_GENERIC_RELAXED_LOAD_STORE */</span>
-<a name="l00638"></a>00638
-<a name="l00639"></a>00639 <span class="preprocessor">#undef __TBB_WORDSIZE //this macro is forbidden to use outside of atomic machinery</span>
-<a name="l00640"></a>00640 <span class="preprocessor"></span>
-<a name="l00641"></a>00641 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00642"></a>00642 <span class="keyword">inline</span> T __TBB_load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T &location) {
-<a name="l00643"></a>00643 <span class="keywordflow">return</span> machine_load_store<T,sizeof(T)>::load_with_acquire( location );
-<a name="l00644"></a>00644 }
-<a name="l00645"></a>00645 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
-<a name="l00646"></a>00646 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_with_release(<span class="keyword">volatile</span> T& location, V value) {
-<a name="l00647"></a>00647 machine_load_store<T,sizeof(T)>::store_with_release( location, T(value) );
-<a name="l00648"></a>00648 }
-<a name="l00650"></a>00650 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_with_release(<span class="keyword">volatile</span> size_t& location, size_t value) {
-<a name="l00651"></a>00651 machine_load_store<size_t,sizeof(size_t)>::store_with_release( location, value );
-<a name="l00652"></a>00652 }
-<a name="l00653"></a>00653
-<a name="l00654"></a>00654 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00655"></a>00655 <span class="keyword">inline</span> T __TBB_load_full_fence(<span class="keyword">const</span> <span class="keyword">volatile</span> T &location) {
-<a name="l00656"></a>00656 <span class="keywordflow">return</span> machine_load_store_seq_cst<T,sizeof(T)>::load( location );
-<a name="l00657"></a>00657 }
-<a name="l00658"></a>00658 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
-<a name="l00659"></a>00659 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_full_fence(<span class="keyword">volatile</span> T& location, V value) {
-<a name="l00660"></a>00660 machine_load_store_seq_cst<T,sizeof(T)>::store( location, T(value) );
-<a name="l00661"></a>00661 }
-<a name="l00663"></a>00663 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_full_fence(<span class="keyword">volatile</span> size_t& location, size_t value) {
-<a name="l00664"></a>00664 machine_load_store_seq_cst<size_t,sizeof(size_t)>::store( location, value );
-<a name="l00665"></a>00665 }
-<a name="l00666"></a>00666
-<a name="l00667"></a>00667 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00668"></a>00668 <span class="keyword">inline</span> T __TBB_load_relaxed (<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
-<a name="l00669"></a>00669 <span class="keywordflow">return</span> machine_load_store_relaxed<T,sizeof(T)>::load( const_cast<T&>(location) );
-<a name="l00670"></a>00670 }
-<a name="l00671"></a>00671 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
-<a name="l00672"></a>00672 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_relaxed ( <span class="keyword">volatile</span> T& location, V value ) {
-<a name="l00673"></a>00673 machine_load_store_relaxed<T,sizeof(T)>::store( const_cast<T&>(location), T(value) );
-<a name="l00674"></a>00674 }
-<a name="l00676"></a>00676 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_relaxed ( <span class="keyword">volatile</span> size_t& location, size_t value ) {
-<a name="l00677"></a>00677 machine_load_store_relaxed<size_t,sizeof(size_t)>::store( const_cast<size_t&>(location), value );
-<a name="l00678"></a>00678 }
-<a name="l00679"></a>00679
-<a name="l00680"></a>00680 <span class="comment">// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as</span>
-<a name="l00681"></a>00681 <span class="comment">// strict as type T. The type should have a trivial default constructor and destructor, so that</span>
-<a name="l00682"></a>00682 <span class="comment">// arrays of that type can be declared without initializers.</span>
-<a name="l00683"></a>00683 <span class="comment">// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands</span>
-<a name="l00684"></a>00684 <span class="comment">// to a type bigger than T.</span>
-<a name="l00685"></a>00685 <span class="comment">// The default definition here works on machines where integers are naturally aligned and the</span>
-<a name="l00686"></a>00686 <span class="comment">// strictest alignment is 64.</span>
-<a name="l00687"></a>00687 <span class="preprocessor">#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict</span>
-<a name="l00688"></a>00688 <span class="preprocessor"></span>
-<a name="l00689"></a>00689 <span class="preprocessor">#if __TBB_ATTRIBUTE_ALIGNED_PRESENT</span>
-<a name="l00690"></a>00690 <span class="preprocessor"></span>
-<a name="l00691"></a>00691 <span class="preprocessor">#define __TBB_DefineTypeWithAlignment(PowerOf2) \</span>
-<a name="l00692"></a>00692 <span class="preprocessor">struct __TBB_machine_type_with_alignment_##PowerOf2 { \</span>
-<a name="l00693"></a>00693 <span class="preprocessor"> uint32_t member[PowerOf2/sizeof(uint32_t)]; \</span>
-<a name="l00694"></a>00694 <span class="preprocessor">} __attribute__((aligned(PowerOf2)));</span>
-<a name="l00695"></a>00695 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_alignof(T) __alignof__(T)</span>
-<a name="l00696"></a>00696 <span class="preprocessor"></span>
-<a name="l00697"></a>00697 <span class="preprocessor">#elif __TBB_DECLSPEC_ALIGN_PRESENT</span>
-<a name="l00698"></a>00698 <span class="preprocessor"></span>
-<a name="l00699"></a>00699 <span class="preprocessor">#define __TBB_DefineTypeWithAlignment(PowerOf2) \</span>
-<a name="l00700"></a>00700 <span class="preprocessor">__declspec(align(PowerOf2)) \</span>
-<a name="l00701"></a>00701 <span class="preprocessor">struct __TBB_machine_type_with_alignment_##PowerOf2 { \</span>
-<a name="l00702"></a>00702 <span class="preprocessor"> uint32_t member[PowerOf2/sizeof(uint32_t)]; \</span>
-<a name="l00703"></a>00703 <span class="preprocessor">};</span>
-<a name="l00704"></a>00704 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_alignof(T) __alignof(T)</span>
-<a name="l00705"></a>00705 <span class="preprocessor"></span>
-<a name="l00706"></a>00706 <span class="preprocessor">#else </span><span class="comment">/* A compiler with unknown syntax for data alignment */</span>
-<a name="l00707"></a>00707 <span class="preprocessor">#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T)</span>
-<a name="l00708"></a>00708 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00709"></a>00709 <span class="preprocessor"></span>
-<a name="l00710"></a>00710 <span class="comment">/* Now declare types aligned to useful powers of two */</span>
-<a name="l00711"></a>00711 <span class="comment">// TODO: Is __TBB_DefineTypeWithAlignment(8) needed on 32 bit platforms?</span>
-<a name="l00712"></a>00712 __TBB_DefineTypeWithAlignment(16)
-<a name="l00713"></a>00713 __TBB_DefineTypeWithAlignment(32)
-<a name="l00714"></a>00714 __TBB_DefineTypeWithAlignment(64)
-<a name="l00715"></a>00715
-<a name="l00716"></a>00716 typedef __TBB_machine_type_with_alignment_64 __TBB_machine_type_with_strictest_alignment;
-<a name="l00717"></a>00717
-<a name="l00718"></a>00718 <span class="comment">// Primary template is a declaration of incomplete type so that it fails with unknown alignments</span>
-<a name="l00719"></a>00719 template<size_t N> struct type_with_alignment;
-<a name="l00720"></a>00720
-<a name="l00721"></a>00721 <span class="comment">// Specializations for allowed alignments</span>
-<a name="l00722"></a>00722 template<> struct type_with_alignment<1> { <span class="keywordtype">char</span> member; };
-<a name="l00723"></a>00723 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<2> { uint16_t member; };
-<a name="l00724"></a>00724 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<4> { uint32_t member; };
-<a name="l00725"></a>00725 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<8> { uint64_t member; };
-<a name="l00726"></a>00726 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<16> {__TBB_machine_type_with_alignment_16 member; };
-<a name="l00727"></a>00727 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<32> {__TBB_machine_type_with_alignment_32 member; };
-<a name="l00728"></a>00728 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<64> {__TBB_machine_type_with_alignment_64 member; };
-<a name="l00729"></a>00729
-<a name="l00730"></a>00730 <span class="preprocessor">#if __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN</span>
-<a name="l00732"></a>00732 <span class="preprocessor"></span>
-<a name="l00734"></a>00734 <span class="preprocessor">template<size_t Size, typename T></span>
-<a name="l00735"></a><a class="code" href="a00352.html">00735</a> <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00352.html">work_around_alignment_bug</a> {
-<a name="l00736"></a>00736 <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __TBB_alignof(T);
-<a name="l00737"></a>00737 };
-<a name="l00738"></a>00738 <span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<tbb::internal::work_around_alignment_bug<sizeof(T),T>::alignment></span>
-<a name="l00739"></a>00739 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00740"></a>00740 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__TBB_alignof(T)></span>
-<a name="l00741"></a>00741 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN */</span>
-<a name="l00742"></a>00742
-<a name="l00743"></a>00743 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TypeWithAlignmentAtLeastAsStrict */</span>
-<a name="l00744"></a>00744
-<a name="l00745"></a>00745 <span class="comment">// Template class here is to avoid instantiation of the static data for modules that don't use it</span>
-<a name="l00746"></a>00746 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00747"></a>00747 <span class="keyword">struct </span>reverse {
-<a name="l00748"></a>00748 <span class="keyword">static</span> <span class="keyword">const</span> T byte_table[256];
-<a name="l00749"></a>00749 };
-<a name="l00750"></a>00750 <span class="comment">// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed</span>
-<a name="l00751"></a>00751 <span class="comment">// values of [0..2^8 - 1]. Those values can also be computed on the fly at a slightly higher cost.</span>
-<a name="l00752"></a>00752 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00753"></a>00753 <span class="keyword">const</span> T reverse<T>::byte_table[256] = {
-<a name="l00754"></a>00754 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
-<a name="l00755"></a>00755 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
-<a name="l00756"></a>00756 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
-<a name="l00757"></a>00757 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
-<a name="l00758"></a>00758 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
-<a name="l00759"></a>00759 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
-<a name="l00760"></a>00760 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
-<a name="l00761"></a>00761 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
-<a name="l00762"></a>00762 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
-<a name="l00763"></a>00763 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
-<a name="l00764"></a>00764 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
-<a name="l00765"></a>00765 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
-<a name="l00766"></a>00766 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
-<a name="l00767"></a>00767 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
-<a name="l00768"></a>00768 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
-<a name="l00769"></a>00769 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
-<a name="l00770"></a>00770 };
-<a name="l00771"></a>00771
-<a name="l00772"></a>00772 } <span class="comment">// namespace internal</span>
-<a name="l00773"></a>00773 } <span class="comment">// namespace tbb</span>
-<a name="l00774"></a>00774
-<a name="l00775"></a>00775 <span class="comment">// Preserving access to legacy APIs</span>
-<a name="l00776"></a>00776 <span class="keyword">using</span> tbb::internal::__TBB_load_with_acquire;
-<a name="l00777"></a>00777 <span class="keyword">using</span> tbb::internal::__TBB_store_with_release;
-<a name="l00778"></a>00778
-<a name="l00779"></a>00779 <span class="comment">// Mapping historically used names to the ones expected by atomic_load_store_traits</span>
-<a name="l00780"></a>00780 <span class="preprocessor">#define __TBB_load_acquire __TBB_load_with_acquire</span>
-<a name="l00781"></a>00781 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_store_release __TBB_store_with_release</span>
-<a name="l00782"></a>00782 <span class="preprocessor"></span>
-<a name="l00783"></a>00783 <span class="preprocessor">#ifndef __TBB_Log2</span>
-<a name="l00784"></a>00784 <span class="preprocessor"></span><span class="keyword">inline</span> intptr_t __TBB_Log2( uintptr_t x ) {
-<a name="l00785"></a>00785 <span class="keywordflow">if</span>( x==0 ) <span class="keywordflow">return</span> -1;
-<a name="l00786"></a>00786 intptr_t result = 0;
-<a name="l00787"></a>00787 uintptr_t tmp;
-<a name="l00788"></a>00788
-<a name="l00789"></a>00789 <span class="keywordflow">if</span>( <span class="keyword">sizeof</span>(x)>4 && (tmp = ((uint64_t)x)>>32)) { x=tmp; result += 32; }
-<a name="l00790"></a>00790 <span class="keywordflow">if</span>( (tmp = x>>16) ) { x=tmp; result += 16; }
-<a name="l00791"></a>00791 <span class="keywordflow">if</span>( (tmp = x>>8) ) { x=tmp; result += 8; }
-<a name="l00792"></a>00792 <span class="keywordflow">if</span>( (tmp = x>>4) ) { x=tmp; result += 4; }
-<a name="l00793"></a>00793 <span class="keywordflow">if</span>( (tmp = x>>2) ) { x=tmp; result += 2; }
-<a name="l00794"></a>00794 <span class="keywordflow">return</span> (x&2)? result+1: result;
-<a name="l00795"></a>00795 }
-<a name="l00796"></a>00796 <span class="preprocessor">#endif</span>
-<a name="l00797"></a>00797 <span class="preprocessor"></span>
-<a name="l00798"></a>00798 <span class="preprocessor">#ifndef __TBB_AtomicOR</span>
-<a name="l00799"></a>00799 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicOR( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
-<a name="l00800"></a>00800 <a class="code" href="a00256.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00801"></a>00801 <span class="keywordflow">for</span>(;;) {
-<a name="l00802"></a>00802 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00803"></a>00803 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
-<a name="l00804"></a>00804 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00805"></a>00805 b.<a class="code" href="a00256.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00806"></a>00806 }
-<a name="l00807"></a>00807 }
-<a name="l00808"></a>00808 <span class="preprocessor">#endif</span>
-<a name="l00809"></a>00809 <span class="preprocessor"></span>
-<a name="l00810"></a>00810 <span class="preprocessor">#ifndef __TBB_AtomicAND</span>
-<a name="l00811"></a>00811 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicAND( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
-<a name="l00812"></a>00812 <a class="code" href="a00256.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00813"></a>00813 <span class="keywordflow">for</span>(;;) {
-<a name="l00814"></a>00814 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00815"></a>00815 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
-<a name="l00816"></a>00816 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00817"></a>00817 b.<a class="code" href="a00256.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00818"></a>00818 }
-<a name="l00819"></a>00819 }
-<a name="l00820"></a>00820 <span class="preprocessor">#endif</span>
-<a name="l00821"></a>00821 <span class="preprocessor"></span>
-<a name="l00822"></a>00822 <span class="preprocessor">#ifndef __TBB_Flag</span>
-<a name="l00823"></a>00823 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_Flag;
-<a name="l00824"></a>00824 <span class="preprocessor">#endif</span>
-<a name="l00825"></a>00825 <span class="preprocessor"></span><span class="keyword">typedef</span> __TBB_atomic __TBB_Flag __TBB_atomic_flag;
-<a name="l00826"></a>00826
-<a name="l00827"></a>00827 <span class="preprocessor">#ifndef __TBB_TryLockByte</span>
-<a name="l00828"></a>00828 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_TryLockByte( __TBB_atomic_flag &flag ) {
-<a name="l00829"></a>00829 <span class="keywordflow">return</span> __TBB_machine_cmpswp1(&flag,1,0)==0;
-<a name="l00830"></a>00830 }
-<a name="l00831"></a>00831 <span class="preprocessor">#endif</span>
-<a name="l00832"></a>00832 <span class="preprocessor"></span>
-<a name="l00833"></a>00833 <span class="preprocessor">#ifndef __TBB_LockByte</span>
-<a name="l00834"></a>00834 <span class="preprocessor"></span><span class="keyword">inline</span> __TBB_Flag __TBB_LockByte( __TBB_atomic_flag& flag ) {
-<a name="l00835"></a>00835 <span class="keywordflow">if</span> ( !__TBB_TryLockByte(flag) ) {
-<a name="l00836"></a>00836 <a class="code" href="a00256.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00837"></a>00837 <span class="keywordflow">do</span> {
-<a name="l00838"></a>00838 b.<a class="code" href="a00256.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00839"></a>00839 } <span class="keywordflow">while</span> ( !__TBB_TryLockByte(flag) );
-<a name="l00840"></a>00840 }
-<a name="l00841"></a>00841 <span class="keywordflow">return</span> 0;
-<a name="l00842"></a>00842 }
-<a name="l00843"></a>00843 <span class="preprocessor">#endif</span>
-<a name="l00844"></a>00844 <span class="preprocessor"></span>
-<a name="l00845"></a>00845 <span class="preprocessor">#ifndef __TBB_UnlockByte</span>
-<a name="l00846"></a>00846 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_UnlockByte __TBB_store_with_release</span>
-<a name="l00847"></a>00847 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00848"></a>00848 <span class="preprocessor"></span>
-<a name="l00849"></a>00849 <span class="preprocessor">#ifndef __TBB_ReverseByte</span>
-<a name="l00850"></a>00850 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_ReverseByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> src) {
-<a name="l00851"></a>00851 <span class="keywordflow">return</span> tbb::internal::reverse<unsigned char>::byte_table[src];
-<a name="l00852"></a>00852 }
-<a name="l00853"></a>00853 <span class="preprocessor">#endif</span>
-<a name="l00854"></a>00854 <span class="preprocessor"></span>
-<a name="l00855"></a>00855 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00856"></a>00856 T __TBB_ReverseBits(T src) {
-<a name="l00857"></a>00857 T dst;
-<a name="l00858"></a>00858 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *original = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &src;
-<a name="l00859"></a>00859 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *reversed = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &dst;
-<a name="l00860"></a>00860
-<a name="l00861"></a>00861 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = <span class="keyword">sizeof</span>(T)-1; i >= 0; i-- )
-<a name="l00862"></a>00862 reversed[i] = __TBB_ReverseByte( original[<span class="keyword">sizeof</span>(T)-i-1] );
-<a name="l00863"></a>00863
-<a name="l00864"></a>00864 <span class="keywordflow">return</span> dst;
-<a name="l00865"></a>00865 }
-<a name="l00866"></a>00866
-<a name="l00867"></a>00867 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_machine_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00647.html b/doc/html/a00647.html
deleted file mode 100644
index b343b15..0000000
--- a/doc/html/a00647.html
+++ /dev/null
@@ -1,225 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_profiling.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_profiling.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_profiling_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_profiling_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="comment">// Check if the tools support is enabled</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#if (_WIN32||_WIN64||__linux__) && !__MINGW32__ && TBB_USE_THREADING_TOOLS</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#include <stdlib.h></span> <span class="comment">/* mbstowcs_s */</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#endif</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="keyword">namespace </span>tbb {
-<a name="l00033"></a>00033 <span class="keyword">namespace </span>internal {
-<a name="l00034"></a>00034 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_set_sync_name_v3( <span class="keywordtype">void</span> *obj, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* name );
-<a name="l00036"></a>00036 <span class="keyword">inline</span> size_t multibyte_to_widechar( <span class="keywordtype">wchar_t</span>* wcs, <span class="keyword">const</span> <span class="keywordtype">char</span>* mbs, size_t bufsize) {
-<a name="l00037"></a>00037 <span class="preprocessor">#if _MSC_VER>=1400</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span> size_t len;
-<a name="l00039"></a>00039 mbstowcs_s( &len, wcs, bufsize, mbs, _TRUNCATE );
-<a name="l00040"></a>00040 <span class="keywordflow">return</span> len; <span class="comment">// mbstowcs_s counts null terminator</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#else</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span> size_t len = mbstowcs( wcs, mbs, bufsize );
-<a name="l00043"></a>00043 <span class="keywordflow">if</span>(wcs && len!=size_t(-1) )
-<a name="l00044"></a>00044 wcs[len<bufsize-1? len: bufsize-1] = wchar_t(<span class="charliteral">'\0'</span>);
-<a name="l00045"></a>00045 <span class="keywordflow">return</span> len+1; <span class="comment">// mbstowcs does not count null terminator</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#endif</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span> }
-<a name="l00048"></a>00048 <span class="preprocessor">#else</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_set_sync_name_v3( <span class="keywordtype">void</span> *obj, <span class="keyword">const</span> <span class="keywordtype">char</span>* name );
-<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span> } <span class="comment">// namespace internal</span>
-<a name="l00052"></a>00052 } <span class="comment">// namespace tbb</span>
-<a name="l00053"></a>00053
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \</span>
-<a name="l00059"></a>00059 <span class="preprocessor"> namespace profiling { \</span>
-<a name="l00060"></a>00060 <span class="preprocessor"> inline void set_name( sync_object_type& obj, const wchar_t* name ) { \</span>
-<a name="l00061"></a>00061 <span class="preprocessor"> tbb::internal::itt_set_sync_name_v3( &obj, name ); \</span>
-<a name="l00062"></a>00062 <span class="preprocessor"> } \</span>
-<a name="l00063"></a>00063 <span class="preprocessor"> inline void set_name( sync_object_type& obj, const char* name ) { \</span>
-<a name="l00064"></a>00064 <span class="preprocessor"> size_t len = tbb::internal::multibyte_to_widechar(NULL, name, 0); \</span>
-<a name="l00065"></a>00065 <span class="preprocessor"> wchar_t *wname = new wchar_t[len]; \</span>
-<a name="l00066"></a>00066 <span class="preprocessor"> tbb::internal::multibyte_to_widechar(wname, name, len); \</span>
-<a name="l00067"></a>00067 <span class="preprocessor"> set_name( obj, wname ); \</span>
-<a name="l00068"></a>00068 <span class="preprocessor"> delete[] wname; \</span>
-<a name="l00069"></a>00069 <span class="preprocessor"> } \</span>
-<a name="l00070"></a>00070 <span class="preprocessor"> }</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !WIN */</span>
-<a name="l00072"></a>00072 <span class="preprocessor"> #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \</span>
-<a name="l00073"></a>00073 <span class="preprocessor"> namespace profiling { \</span>
-<a name="l00074"></a>00074 <span class="preprocessor"> inline void set_name( sync_object_type& obj, const char* name ) { \</span>
-<a name="l00075"></a>00075 <span class="preprocessor"> tbb::internal::itt_set_sync_name_v3( &obj, name ); \</span>
-<a name="l00076"></a>00076 <span class="preprocessor"> } \</span>
-<a name="l00077"></a>00077 <span class="preprocessor"> }</span>
-<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !WIN */</span>
-<a name="l00079"></a>00079
-<a name="l00080"></a>00080 <span class="preprocessor">#else </span><span class="comment">/* no tools support */</span>
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \</span>
-<a name="l00084"></a>00084 <span class="preprocessor"> namespace profiling { \</span>
-<a name="l00085"></a>00085 <span class="preprocessor"> inline void set_name( sync_object_type&, const wchar_t* ) {} \</span>
-<a name="l00086"></a>00086 <span class="preprocessor"> inline void set_name( sync_object_type&, const char* ) {} \</span>
-<a name="l00087"></a>00087 <span class="preprocessor"> }</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !WIN */</span>
-<a name="l00089"></a>00089 <span class="preprocessor"> #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \</span>
-<a name="l00090"></a>00090 <span class="preprocessor"> namespace profiling { \</span>
-<a name="l00091"></a>00091 <span class="preprocessor"> inline void set_name( sync_object_type&, const char* ) {} \</span>
-<a name="l00092"></a>00092 <span class="preprocessor"> }</span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !WIN */</span>
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <span class="preprocessor">#endif </span><span class="comment">/* no tools support */</span>
-<a name="l00096"></a>00096
-<a name="l00097"></a>00097 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00098"></a>00098 <span class="comment">// Need these to work regardless of tools support</span>
-<a name="l00099"></a>00099 <span class="keyword">namespace </span>tbb {
-<a name="l00100"></a>00100 <span class="keyword">namespace </span>internal {
-<a name="l00101"></a>00101
-<a name="l00102"></a>00102 <span class="keyword">enum</span> notify_type {prepare=0, cancel, acquired, releasing};
-<a name="l00103"></a>00103 <span class="keyword">const</span> uintptr_t NUM_NOTIFY_TYPES = 4; <span class="comment">// set to # elements in enum above</span>
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC call_itt_notify_v5(<span class="keywordtype">int</span> t, <span class="keywordtype">void</span> *ptr);
-<a name="l00106"></a>00106 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_store_pointer_with_release_v3(<span class="keywordtype">void</span> *dst, <span class="keywordtype">void</span> *src);
-<a name="l00107"></a>00107 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC itt_load_pointer_with_acquire_v3(<span class="keyword">const</span> <span class="keywordtype">void</span> *src);
-<a name="l00108"></a>00108 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC itt_load_pointer_v3( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="comment">// two template arguments are to workaround /Wp64 warning with tbb::atomic specialized for unsigned type</span>
-<a name="l00111"></a>00111 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00112"></a>00112 <span class="keyword">inline</span> <span class="keywordtype">void</span> itt_store_word_with_release(<a class="code" href="a00254.html">tbb::atomic<T></a>& dst, U src) {
-<a name="l00113"></a>00113 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span> <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00115"></a>00115 __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
-<a name="l00116"></a>00116 itt_store_pointer_with_release_v3(&dst, (<span class="keywordtype">void</span> *)uintptr_t(src));
-<a name="l00117"></a>00117 <span class="preprocessor">#else</span>
-<a name="l00118"></a>00118 <span class="preprocessor"></span> dst = src;
-<a name="l00119"></a>00119 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00120"></a>00120 <span class="preprocessor"></span> }
-<a name="l00121"></a>00121
-<a name="l00122"></a>00122 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00123"></a>00123 <span class="keyword">inline</span> T itt_load_word_with_acquire(<span class="keyword">const</span> <a class="code" href="a00254.html">tbb::atomic<T></a>& src) {
-<a name="l00124"></a>00124 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span> <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00126"></a>00126 __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
-<a name="l00127"></a>00127 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warnings</span>
-<a name="l00129"></a>00129 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4311)</span>
-<a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00132"></a>00132 <span class="preprocessor"></span> T result = (T)itt_load_pointer_with_acquire_v3(&src);
-<a name="l00133"></a>00133 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span> <span class="keywordflow">return</span> result;
-<a name="l00137"></a>00137 <span class="preprocessor">#else</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span> <span class="keywordflow">return</span> src;
-<a name="l00139"></a>00139 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span> }
-<a name="l00141"></a>00141
-<a name="l00142"></a>00142 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00143"></a>00143 <span class="keyword">inline</span> <span class="keywordtype">void</span> itt_store_word_with_release(T& dst, T src) {
-<a name="l00144"></a>00144 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span> <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00146"></a>00146 __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
-<a name="l00147"></a>00147 itt_store_pointer_with_release_v3(&dst, (<span class="keywordtype">void</span> *)src);
-<a name="l00148"></a>00148 <span class="preprocessor">#else</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span> __TBB_store_with_release(dst, src);
-<a name="l00150"></a>00150 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span> }
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00154"></a>00154 <span class="keyword">inline</span> T itt_load_word_with_acquire(<span class="keyword">const</span> T& src) {
-<a name="l00155"></a>00155 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00156"></a>00156 <span class="preprocessor"></span> <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00157"></a>00157 __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized"</span>);
-<a name="l00158"></a>00158 <span class="keywordflow">return</span> (T)itt_load_pointer_with_acquire_v3(&src);
-<a name="l00159"></a>00159 <span class="preprocessor">#else</span>
-<a name="l00160"></a>00160 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_load_with_acquire(src);
-<a name="l00161"></a>00161 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00162"></a>00162 <span class="preprocessor"></span> }
-<a name="l00163"></a>00163
-<a name="l00164"></a>00164 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00165"></a>00165 <span class="keyword">inline</span> <span class="keywordtype">void</span> itt_hide_store_word(T& dst, T src) {
-<a name="l00166"></a>00166 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span> <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00168"></a>00168 __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized"</span>);
-<a name="l00169"></a>00169 itt_store_pointer_with_release_v3(&dst, (<span class="keywordtype">void</span> *)src);
-<a name="l00170"></a>00170 <span class="preprocessor">#else</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span> dst = src;
-<a name="l00172"></a>00172 <span class="preprocessor">#endif</span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span> }
-<a name="l00174"></a>00174
-<a name="l00175"></a>00175 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00176"></a>00176 <span class="keyword">inline</span> T itt_hide_load_word(<span class="keyword">const</span> T& src) {
-<a name="l00177"></a>00177 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span> <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00179"></a>00179 __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
-<a name="l00180"></a>00180 <span class="keywordflow">return</span> (T)itt_load_pointer_v3(&src);
-<a name="l00181"></a>00181 <span class="preprocessor">#else</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span> <span class="keywordflow">return</span> src;
-<a name="l00183"></a>00183 <span class="preprocessor">#endif</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span> }
-<a name="l00185"></a>00185
-<a name="l00186"></a>00186 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> call_itt_notify(notify_type t, <span class="keywordtype">void</span> *ptr) {
-<a name="l00188"></a>00188 call_itt_notify_v5((<span class="keywordtype">int</span>)t, ptr);
-<a name="l00189"></a>00189 }
-<a name="l00190"></a>00190 <span class="preprocessor">#else</span>
-<a name="l00191"></a>00191 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> call_itt_notify(notify_type <span class="comment">/*t*/</span>, <span class="keywordtype">void</span> * <span class="comment">/*ptr*/</span>) {}
-<a name="l00192"></a>00192 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00193"></a>00193 <span class="preprocessor"></span>
-<a name="l00194"></a>00194 } <span class="comment">// namespace internal</span>
-<a name="l00195"></a>00195 } <span class="comment">// namespace tbb</span>
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_profiling_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00648.html b/doc/html/a00648.html
deleted file mode 100644
index 81b0e16..0000000
--- a/doc/html/a00648.html
+++ /dev/null
@@ -1,302 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_stddef.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_stddef.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_stddef_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_stddef_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="comment">// Marketing-driven product version</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#define TBB_VERSION_MAJOR 4</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define TBB_VERSION_MINOR 0</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="comment">// Engineering-focused interface version</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#define TBB_INTERFACE_VERSION 6005</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="comment">// The oldest major interface version still supported</span>
-<a name="l00033"></a>00033 <span class="comment">// To be used in SONAME, manifests, etc.</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#define TBB_COMPATIBLE_INTERFACE_VERSION 2</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#define __TBB_STRING_AUX(x) #x</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_STRING(x) __TBB_STRING_AUX(x)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="comment">// We do not need defines below for resource processing on windows</span>
-<a name="l00040"></a>00040 <span class="preprocessor">#if !defined RC_INVOKED</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00042"></a>00042 <span class="comment">// Define groups for Doxygen documentation</span>
-<a name="l00052"></a>00052 <span class="comment"></span><span class="comment">// Simple text that is displayed on the main page of Doxygen documentation.</span>
-<a name="l00094"></a>00094 <span class="comment"></span><span class="comment">// Define preprocessor symbols used to determine architecture</span>
-<a name="l00095"></a>00095 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span><span class="preprocessor"># if defined(_M_X64)||defined(__x86_64__) // the latter for MinGW support</span>
-<a name="l00097"></a>00097 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_x86_64 1</span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="preprocessor"># elif defined(_M_IA64)</span>
-<a name="l00099"></a>00099 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_ipf 1</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor"># elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_x86_32 1</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* Assume generic Unix */</span>
-<a name="l00104"></a>00104 <span class="preprocessor"># if !__linux__ && !__APPLE__</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_generic_os 1</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span><span class="preprocessor"># if __x86_64__</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_x86_64 1</span>
-<a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor"># elif __ia64__</span>
-<a name="l00110"></a>00110 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_ipf 1</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor"># elif __i386__||__i386 // __i386 is for Sun OS</span>
-<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_x86_32 1</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor"># else</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_generic_arch 1</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span>
-<a name="l00118"></a>00118 <span class="comment">// tbb_config.h should be included the first since it contains macro definitions used in other headers</span>
-<a name="l00119"></a>00119 <span class="preprocessor">#include "tbb_config.h"</span>
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="preprocessor">#if _MSC_VER >=1400</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_EXPORTED_FUNC __cdecl</span>
-<a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_EXPORTED_METHOD __thiscall</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_EXPORTED_FUNC</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_EXPORTED_METHOD</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>
-<a name="l00129"></a>00129 <span class="preprocessor">#if __INTEL_COMPILER || _MSC_VER</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NOINLINE(decl) __declspec(noinline) decl</span>
-<a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor">#elif __GNUC__</span>
-<a name="l00132"></a>00132 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NOINLINE(decl) decl __attribute__ ((noinline))</span>
-<a name="l00133"></a>00133 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NOINLINE(decl) decl</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span>
-<a name="l00137"></a>00137 <span class="preprocessor">#include <cstddef></span> <span class="comment">/* Need size_t and ptrdiff_t */</span>
-<a name="l00138"></a>00138
-<a name="l00139"></a>00139 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_tbb_windef_H</span>
-<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor"> #include "internal/_tbb_windef.h"</span>
-<a name="l00142"></a>00142 <span class="preprocessor"> #undef __TBB_tbb_windef_H</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00144"></a>00144 <span class="preprocessor"></span><span class="preprocessor">#if !defined(_MSC_VER) || _MSC_VER>=1600</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor"> #include <stdint.h></span>
-<a name="l00146"></a>00146 <span class="preprocessor">#endif</span>
-<a name="l00147"></a>00147 <span class="preprocessor"></span>
-<a name="l00149"></a>00149 <span class="keyword">typedef</span> void(*assertion_handler_type)( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> <span class="keywordtype">char</span> * comment );
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00152"></a>00152 <span class="preprocessor"></span>
-<a name="l00153"></a>00153 <span class="preprocessor"> #define __TBB_ASSERT_NS(predicate,message,ns) ((predicate)?((void)0) : ns::assertion_failure(__FILE__,__LINE__,#predicate,message))</span>
-<a name="l00155"></a>00155 <span class="preprocessor"></span>
-<a name="l00158"></a>00158 <span class="preprocessor">#if __TBBMALLOC_BUILD</span>
-<a name="l00159"></a>00159 <span class="preprocessor"></span><span class="keyword">namespace </span>rml { <span class="keyword">namespace </span>internal {
-<a name="l00160"></a>00160 <span class="preprocessor"> #define __TBB_ASSERT(predicate,message) __TBB_ASSERT_NS(predicate,message,rml::internal)</span>
-<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00162"></a>00162 <span class="preprocessor"></span><span class="keyword">namespace </span>tbb {
-<a name="l00163"></a>00163 <span class="preprocessor"> #define __TBB_ASSERT(predicate,message) __TBB_ASSERT_NS(predicate,message,tbb)</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00165"></a>00165 <span class="preprocessor"></span>
-<a name="l00166"></a>00166 <span class="preprocessor"> #define __TBB_ASSERT_EX __TBB_ASSERT</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span>
-<a name="l00169"></a>00169 assertion_handler_type __TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler );
-<a name="l00170"></a>00170
-<a name="l00172"></a>00172
-<a name="l00175"></a>00175 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC assertion_failure( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> <span class="keywordtype">char</span>* comment );
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 <span class="preprocessor">#if __TBBMALLOC_BUILD</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span>}} <span class="comment">// namespace rml::internal</span>
-<a name="l00179"></a>00179 <span class="preprocessor">#else</span>
-<a name="l00180"></a>00180 <span class="preprocessor"></span>} <span class="comment">// namespace tbb</span>
-<a name="l00181"></a>00181 <span class="preprocessor">#endif</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_ASSERT */</span>
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185 <span class="preprocessor"> #define __TBB_ASSERT(predicate,comment) ((void)0)</span>
-<a name="l00187"></a>00187 <span class="preprocessor"> #define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
-<a name="l00188"></a>00188 <span class="preprocessor"></span>
-<a name="l00189"></a>00189 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
-<a name="l00190"></a>00190
-<a name="l00192"></a>00192 <span class="keyword">namespace </span>tbb {
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="preprocessor">#if _MSC_VER && _MSC_VER<1600</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span> <span class="keyword">namespace </span>internal {
-<a name="l00196"></a>00196 <span class="keyword">typedef</span> __int8 int8_t;
-<a name="l00197"></a>00197 <span class="keyword">typedef</span> __int16 int16_t;
-<a name="l00198"></a>00198 <span class="keyword">typedef</span> __int32 int32_t;
-<a name="l00199"></a>00199 <span class="keyword">typedef</span> __int64 int64_t;
-<a name="l00200"></a>00200 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int8 uint8_t;
-<a name="l00201"></a>00201 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int16 uint16_t;
-<a name="l00202"></a>00202 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int32 uint32_t;
-<a name="l00203"></a>00203 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 uint64_t;
-<a name="l00204"></a>00204 } <span class="comment">// namespace internal</span>
-<a name="l00205"></a>00205 <span class="preprocessor">#else </span><span class="comment">/* Posix */</span>
-<a name="l00206"></a>00206 <span class="keyword">namespace </span>internal {
-<a name="l00207"></a>00207 using ::int8_t;
-<a name="l00208"></a>00208 using ::int16_t;
-<a name="l00209"></a>00209 using ::int32_t;
-<a name="l00210"></a>00210 using ::int64_t;
-<a name="l00211"></a>00211 using ::uint8_t;
-<a name="l00212"></a>00212 using ::uint16_t;
-<a name="l00213"></a>00213 using ::uint32_t;
-<a name="l00214"></a>00214 using ::uint64_t;
-<a name="l00215"></a>00215 } <span class="comment">// namespace internal</span>
-<a name="l00216"></a>00216 <span class="preprocessor">#endif </span><span class="comment">/* Posix */</span>
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="keyword">using</span> std::size_t;
-<a name="l00219"></a>00219 <span class="keyword">using</span> std::ptrdiff_t;
-<a name="l00220"></a>00220
-<a name="l00222"></a>00222
-<a name="l00226"></a>00226 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00414.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
-<a name="l00227"></a>00227
-<a name="l00229"></a>00229
-<a name="l00233"></a><a class="code" href="a00335.html">00233</a> <span class="keyword">class </span><a class="code" href="a00335.html">split</a> {
-<a name="l00234"></a>00234 };
-<a name="l00235"></a>00235
-<a name="l00240"></a>00240 <span class="keyword">namespace </span>internal {
-<a name="l00241"></a>00241
-<a name="l00243"></a>00243
-<a name="l00246"></a>00246 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
-<a name="l00247"></a>00247
-<a name="l00267"></a>00267 <span class="preprocessor">#define __TBB_atomic // intentionally empty, see above</span>
-<a name="l00268"></a>00268 <span class="preprocessor"></span>
-<a name="l00269"></a>00269 <span class="keyword">template</span><<span class="keyword">class</span> T, <span class="keywordtype">int</span> S>
-<a name="l00270"></a>00270 <span class="keyword">struct </span>padded_base : T {
-<a name="l00271"></a>00271 <span class="keywordtype">char</span> pad[NFS_MaxLineSize - <span class="keyword">sizeof</span>(T) % NFS_MaxLineSize];
-<a name="l00272"></a>00272 };
-<a name="l00273"></a>00273 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">struct </span>padded_base<T, 0> : T {};
-<a name="l00274"></a>00274
-<a name="l00276"></a>00276 <span class="keyword">template</span><<span class="keyword">class</span> T>
-<a name="l00277"></a>00277 <span class="keyword">struct </span>padded : padded_base<T, sizeof(T)> {};
-<a name="l00278"></a>00278
-<a name="l00280"></a>00280
-<a name="l00282"></a>00282 <span class="preprocessor">#define __TBB_offsetof(class_name, member_name) \</span>
-<a name="l00283"></a>00283 <span class="preprocessor"> ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)</span>
-<a name="l00284"></a>00284 <span class="preprocessor"></span>
-<a name="l00286"></a>00286 <span class="preprocessor">#define __TBB_get_object_ref(class_name, member_name, member_addr) \</span>
-<a name="l00287"></a>00287 <span class="preprocessor"> (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))</span>
-<a name="l00288"></a>00288 <span class="preprocessor"></span>
-<a name="l00290"></a>00290 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC handle_perror( <span class="keywordtype">int</span> error_code, <span class="keyword">const</span> <span class="keywordtype">char</span>* aux_info );
-<a name="l00291"></a>00291
-<a name="l00292"></a>00292 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00293"></a>00293 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TRY try</span>
-<a name="l00294"></a>00294 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) catch(e)</span>
-<a name="l00295"></a>00295 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) throw e</span>
-<a name="l00296"></a>00296 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() throw</span>
-<a name="l00297"></a>00297 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00298"></a>00298 <span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_false() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00299"></a>00299 <span class="preprocessor"> #define __TBB_TRY</span>
-<a name="l00300"></a>00300 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )</span>
-<a name="l00301"></a>00301 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) ((void)0)</span>
-<a name="l00302"></a>00302 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() ((void)0)</span>
-<a name="l00303"></a>00303 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00304"></a>00304
-<a name="l00306"></a>00306 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
-<a name="l00307"></a>00307
-<a name="l00308"></a>00308 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00309"></a>00309 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span>* <span class="keyword">const</span> poisoned_ptr = reinterpret_cast<void*>(-1);
-<a name="l00310"></a>00310
-<a name="l00312"></a>00312 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00313"></a>00313 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T*& p ) { p = reinterpret_cast<T*>(poisoned_ptr); }
-<a name="l00314"></a>00314
-<a name="l00316"></a>00316 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00317"></a>00317 <span class="keyword">inline</span> <span class="keywordtype">bool</span> is_poisoned( T* p ) { <span class="keywordflow">return</span> p == reinterpret_cast<T*>(poisoned_ptr); }
-<a name="l00318"></a>00318 <span class="preprocessor">#else</span>
-<a name="l00319"></a>00319 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00320"></a>00320 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
-<a name="l00321"></a>00321 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
-<a name="l00322"></a>00322
-<a name="l00324"></a>00324
-<a name="l00326"></a>00326 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00327"></a>00327 <span class="keyword">inline</span> T punned_cast( U* ptr ) {
-<a name="l00328"></a>00328 uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
-<a name="l00329"></a>00329 <span class="keywordflow">return</span> reinterpret_cast<T>(x);
-<a name="l00330"></a>00330 }
-<a name="l00331"></a>00331
-<a name="l00333"></a>00333 <span class="keyword">class </span>no_assign {
-<a name="l00334"></a>00334 <span class="comment">// Deny assignment</span>
-<a name="l00335"></a>00335 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
-<a name="l00336"></a>00336 <span class="keyword">public</span>:
-<a name="l00337"></a>00337 <span class="preprocessor">#if __GNUC__</span>
-<a name="l00339"></a>00339 <span class="preprocessor"> no_assign() {}</span>
-<a name="l00340"></a>00340 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00341"></a>00341 };
-<a name="l00342"></a>00342
-<a name="l00344"></a>00344 <span class="keyword">class </span>no_copy: no_assign {
-<a name="l00346"></a>00346 no_copy( <span class="keyword">const</span> no_copy& );
-<a name="l00347"></a>00347 <span class="keyword">public</span>:
-<a name="l00349"></a>00349 no_copy() {}
-<a name="l00350"></a>00350 };
-<a name="l00351"></a>00351
-<a name="l00353"></a>00353 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00354"></a>00354 <span class="keyword">struct </span>allocator_type {
-<a name="l00355"></a>00355 <span class="keyword">typedef</span> T value_type;
-<a name="l00356"></a>00356 };
-<a name="l00357"></a>00357
-<a name="l00358"></a>00358 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00360"></a>00360 <span class="preprocessor">template<typename T></span>
-<a name="l00361"></a>00361 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
-<a name="l00362"></a>00362 <span class="keyword">typedef</span> T value_type;
-<a name="l00363"></a>00363 };
-<a name="l00364"></a>00364 <span class="preprocessor">#endif</span>
-<a name="l00365"></a>00365 <span class="preprocessor"></span>
-<a name="l00367"></a>00367 <span class="keyword">inline</span> size_t size_t_select( <span class="keywordtype">unsigned</span> u, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> ull ) {
-<a name="l00368"></a>00368 <span class="comment">/* Explicit cast of the arguments to size_t is done to avoid compiler warnings</span>
-<a name="l00369"></a>00369 <span class="comment"> (e.g. by Clang and MSVC) about possible truncation. The value of the right size,</span>
-<a name="l00370"></a>00370 <span class="comment"> which is selected by ?:, is anyway not truncated or promoted.</span>
-<a name="l00371"></a>00371 <span class="comment"> MSVC still warns if this trick is applied directly to constants, hence this function. */</span>
-<a name="l00372"></a>00372 <span class="keywordflow">return</span> (<span class="keyword">sizeof</span>(size_t)==<span class="keyword">sizeof</span>(u)) ? size_t(u) : size_t(ull);
-<a name="l00373"></a>00373 }
-<a name="l00374"></a>00374
-<a name="l00375"></a>00375 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
-<a name="l00378"></a>00378 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
-<a name="l00379"></a>00379
-<a name="l00380"></a>00380 <span class="keyword">typedef</span> version_tag_v3 version_tag;
-<a name="l00381"></a>00381
-<a name="l00382"></a>00382 } <span class="comment">// internal</span>
-<a name="l00384"></a>00384 <span class="comment"></span>
-<a name="l00385"></a>00385 } <span class="comment">// tbb</span>
-<a name="l00386"></a>00386
-<a name="l00387"></a>00387 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
-<a name="l00388"></a>00388 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00655.html b/doc/html/a00655.html
deleted file mode 100644
index baea25f..0000000
--- a/doc/html/a00655.html
+++ /dev/null
@@ -1,298 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_thread.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_thread.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_thread_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_thread_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE unsigned WINAPI</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) unsigned (WINAPI* r)( void* )</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE void*</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) void* (*r)( void* )</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include "tick_count.h"</span>
-<a name="l00036"></a>00036
-<a name="l00037"></a>00037 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00039"></a>00039 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include <iosfwd></span>
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span>
-<a name="l00049"></a>00049 <span class="keyword">namespace </span>tbb {
-<a name="l00050"></a>00050
-<a name="l00052"></a>00052 <span class="keyword">namespace </span>internal {
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keyword">class </span>tbb_thread_v3;
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 } <span class="comment">// namespace internal</span>
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 );
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="keyword">namespace </span>internal {
-<a name="l00061"></a>00061
-<a name="l00063"></a>00063 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC allocate_closure_v3( size_t size );
-<a name="l00065"></a>00065 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC free_closure_v3( <span class="keywordtype">void</span>* );
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">struct </span>thread_closure_base {
-<a name="l00068"></a>00068 <span class="keywordtype">void</span>* operator new( size_t size ) {<span class="keywordflow">return</span> allocate_closure_v3(size);}
-<a name="l00069"></a>00069 <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* ptr ) {free_closure_v3(ptr);}
-<a name="l00070"></a>00070 };
-<a name="l00071"></a>00071
-<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">class</span> F> <span class="keyword">struct </span>thread_closure_0: thread_closure_base {
-<a name="l00073"></a>00073 F function;
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <span class="keyword">static</span> __TBB_NATIVE_THREAD_ROUTINE start_routine( <span class="keywordtype">void</span>* c ) {
-<a name="l00076"></a>00076 thread_closure_0 *<span class="keyword">self</span> = static_cast<thread_closure_0*>(c);
-<a name="l00077"></a>00077 <span class="keyword">self</span>->function();
-<a name="l00078"></a>00078 <span class="keyword">delete</span> <span class="keyword">self</span>;
-<a name="l00079"></a>00079 <span class="keywordflow">return</span> 0;
-<a name="l00080"></a>00080 }
-<a name="l00081"></a>00081 thread_closure_0( <span class="keyword">const</span> F& f ) : function(f) {}
-<a name="l00082"></a>00082 };
-<a name="l00084"></a>00084 <span class="keyword">template</span><<span class="keyword">class</span> F, <span class="keyword">class</span> X> <span class="keyword">struct </span>thread_closure_1: thread_closure_base {
-<a name="l00085"></a>00085 F function;
-<a name="l00086"></a>00086 X arg1;
-<a name="l00088"></a>00088 <span class="keyword">static</span> __TBB_NATIVE_THREAD_ROUTINE start_routine( <span class="keywordtype">void</span>* c ) {
-<a name="l00089"></a>00089 thread_closure_1 *<span class="keyword">self</span> = static_cast<thread_closure_1*>(c);
-<a name="l00090"></a>00090 <span class="keyword">self</span>->function(self->arg1);
-<a name="l00091"></a>00091 <span class="keyword">delete</span> <span class="keyword">self</span>;
-<a name="l00092"></a>00092 <span class="keywordflow">return</span> 0;
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094 thread_closure_1( <span class="keyword">const</span> F& f, <span class="keyword">const</span> X& x ) : function(f), arg1(x) {}
-<a name="l00095"></a>00095 };
-<a name="l00096"></a>00096 <span class="keyword">template</span><<span class="keyword">class</span> F, <span class="keyword">class</span> X, <span class="keyword">class</span> Y> <span class="keyword">struct </span>thread_closure_2: thread_closure_base {
-<a name="l00097"></a>00097 F function;
-<a name="l00098"></a>00098 X arg1;
-<a name="l00099"></a>00099 Y arg2;
-<a name="l00101"></a>00101 <span class="keyword">static</span> __TBB_NATIVE_THREAD_ROUTINE start_routine( <span class="keywordtype">void</span>* c ) {
-<a name="l00102"></a>00102 thread_closure_2 *<span class="keyword">self</span> = static_cast<thread_closure_2*>(c);
-<a name="l00103"></a>00103 <span class="keyword">self</span>->function(self->arg1, self->arg2);
-<a name="l00104"></a>00104 <span class="keyword">delete</span> <span class="keyword">self</span>;
-<a name="l00105"></a>00105 <span class="keywordflow">return</span> 0;
-<a name="l00106"></a>00106 }
-<a name="l00107"></a>00107 thread_closure_2( <span class="keyword">const</span> F& f, <span class="keyword">const</span> X& x, <span class="keyword">const</span> Y& y ) : function(f), arg1(x), arg2(y) {}
-<a name="l00108"></a>00108 };
-<a name="l00109"></a>00109
-<a name="l00111"></a>00111 <span class="keyword">class </span>tbb_thread_v3 {
-<a name="l00112"></a>00112 tbb_thread_v3(<span class="keyword">const</span> tbb_thread_v3&); <span class="comment">// = delete; // Deny access</span>
-<a name="l00113"></a>00113 <span class="keyword">public</span>:
-<a name="l00114"></a>00114 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span> <span class="keyword">typedef</span> HANDLE native_handle_type;
-<a name="l00116"></a>00116 <span class="preprocessor">#else</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_t native_handle_type;
-<a name="l00118"></a>00118 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span>
-<a name="l00120"></a>00120 <span class="keyword">class </span>id;
-<a name="l00122"></a>00122 tbb_thread_v3() : my_handle(0)
-<a name="l00123"></a>00123 #if _WIN32||_WIN64
-<a name="l00124"></a>00124 , my_thread_id(0)
-<a name="l00125"></a>00125 #endif <span class="comment">// _WIN32||_WIN64</span>
-<a name="l00126"></a>00126 {}
-<a name="l00127"></a>00127
-<a name="l00129"></a>00129 <span class="keyword">template</span> <<span class="keyword">class</span> F> <span class="keyword">explicit</span> tbb_thread_v3(F f) {
-<a name="l00130"></a>00130 <span class="keyword">typedef</span> internal::thread_closure_0<F> closure_type;
-<a name="l00131"></a>00131 internal_start(closure_type::start_routine, <span class="keyword">new</span> closure_type(f));
-<a name="l00132"></a>00132 }
-<a name="l00134"></a>00134 <span class="keyword">template</span> <<span class="keyword">class</span> F, <span class="keyword">class</span> X> tbb_thread_v3(F f, X x) {
-<a name="l00135"></a>00135 <span class="keyword">typedef</span> internal::thread_closure_1<F,X> closure_type;
-<a name="l00136"></a>00136 internal_start(closure_type::start_routine, <span class="keyword">new</span> closure_type(f,x));
-<a name="l00137"></a>00137 }
-<a name="l00139"></a>00139 <span class="keyword">template</span> <<span class="keyword">class</span> F, <span class="keyword">class</span> X, <span class="keyword">class</span> Y> tbb_thread_v3(F f, X x, Y y) {
-<a name="l00140"></a>00140 <span class="keyword">typedef</span> internal::thread_closure_2<F,X,Y> closure_type;
-<a name="l00141"></a>00141 internal_start(closure_type::start_routine, <span class="keyword">new</span> closure_type(f,x,y));
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 tbb_thread_v3& operator=(tbb_thread_v3& x) {
-<a name="l00145"></a>00145 <span class="keywordflow">if</span> (joinable()) detach();
-<a name="l00146"></a>00146 my_handle = x.my_handle;
-<a name="l00147"></a>00147 x.my_handle = 0;
-<a name="l00148"></a>00148 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span> my_thread_id = x.my_thread_id;
-<a name="l00150"></a>00150 x.my_thread_id = 0;
-<a name="l00151"></a>00151 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00152"></a>00152 <span class="preprocessor"></span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00153"></a>00153 }
-<a name="l00154"></a>00154 <span class="keywordtype">void</span> swap( tbb_thread_v3& t ) {tbb::swap( *<span class="keyword">this</span>, t );}
-<a name="l00155"></a>00155 <span class="keywordtype">bool</span> joinable()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_handle!=0; }
-<a name="l00157"></a>00157 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD join();
-<a name="l00159"></a>00159 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD detach();
-<a name="l00160"></a>00160 ~tbb_thread_v3() {<span class="keywordflow">if</span>( joinable() ) detach();}
-<a name="l00161"></a>00161 <span class="keyword">inline</span> <span class="keywordtype">id</span> get_id() <span class="keyword">const</span>;
-<a name="l00162"></a>00162 native_handle_type native_handle() { <span class="keywordflow">return</span> my_handle; }
-<a name="l00163"></a>00163
-<a name="l00165"></a>00165
-<a name="l00174"></a>00174 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> __TBB_EXPORTED_FUNC hardware_concurrency();
-<a name="l00175"></a>00175 <span class="keyword">private</span>:
-<a name="l00176"></a>00176 native_handle_type my_handle;
-<a name="l00177"></a>00177 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span> DWORD my_thread_id;
-<a name="l00179"></a>00179 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00180"></a>00180 <span class="preprocessor"></span>
-<a name="l00182"></a>00182 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_start( __TBB_NATIVE_THREAD_ROUTINE_PTR(start_routine),
-<a name="l00183"></a>00183 <span class="keywordtype">void</span>* closure );
-<a name="l00184"></a>00184 <span class="keyword">friend</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );
-<a name="l00185"></a>00185 <span class="keyword">friend</span> <span class="keywordtype">void</span> tbb::swap( tbb_thread_v3& t1, tbb_thread_v3& t2 );
-<a name="l00186"></a>00186 };
-<a name="l00187"></a>00187
-<a name="l00188"></a>00188 <span class="keyword">class </span>tbb_thread_v3::id {
-<a name="l00189"></a>00189 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00190"></a>00190 <span class="preprocessor"></span> DWORD my_id;
-<a name="l00191"></a>00191 id( DWORD id_ ) : my_id(id_) {}
-<a name="l00192"></a>00192 <span class="preprocessor">#else</span>
-<a name="l00193"></a>00193 <span class="preprocessor"></span> pthread_t my_id;
-<a name="l00194"></a>00194 id( pthread_t id_ ) : my_id(id_) {}
-<a name="l00195"></a>00195 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00196"></a>00196 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span>tbb_thread_v3;
-<a name="l00197"></a>00197 <span class="keyword">public</span>:
-<a name="l00198"></a>00198 id() : my_id(0) {}
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00201"></a>00201 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00202"></a>00202 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00203"></a>00203 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<=( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00204"></a>00204 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator>( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00205"></a>00205 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator>=( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00206"></a>00206
-<a name="l00207"></a>00207 <span class="keyword">template</span><<span class="keyword">class</span> <span class="keywordtype">char</span>T, <span class="keyword">class</span> traits>
-<a name="l00208"></a>00208 <span class="keyword">friend</span> std::basic_ostream<charT, traits>&
-<a name="l00209"></a>00209 operator<< (std::basic_ostream<charT, traits> &out,
-<a name="l00210"></a>00210 tbb_thread_v3::id id)
-<a name="l00211"></a>00211 {
-<a name="l00212"></a>00212 out << <span class="keywordtype">id</span>.my_id;
-<a name="l00213"></a>00213 <span class="keywordflow">return</span> out;
-<a name="l00214"></a>00214 }
-<a name="l00215"></a>00215 <span class="keyword">friend</span> tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();
-<a name="l00216"></a>00216 }; <span class="comment">// tbb_thread_v3::id</span>
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 tbb_thread_v3::id tbb_thread_v3::get_id()<span class="keyword"> const </span>{
-<a name="l00219"></a>00219 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00220"></a>00220 <span class="preprocessor"></span> <span class="keywordflow">return</span> id(my_thread_id);
-<a name="l00221"></a>00221 <span class="preprocessor">#else</span>
-<a name="l00222"></a>00222 <span class="preprocessor"></span> <span class="keywordflow">return</span> id(my_handle);
-<a name="l00223"></a>00223 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00224"></a>00224 <span class="preprocessor"></span> }
-<a name="l00225"></a>00225 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );
-<a name="l00226"></a>00226 tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();
-<a name="l00227"></a>00227 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC thread_yield_v3();
-<a name="l00228"></a>00228 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC thread_sleep_v3(<span class="keyword">const</span> tick_count::interval_t &i);
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00231"></a>00231 {
-<a name="l00232"></a>00232 <span class="keywordflow">return</span> x.my_id == y.my_id;
-<a name="l00233"></a>00233 }
-<a name="l00234"></a>00234 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00235"></a>00235 {
-<a name="l00236"></a>00236 <span class="keywordflow">return</span> x.my_id != y.my_id;
-<a name="l00237"></a>00237 }
-<a name="l00238"></a>00238 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00239"></a>00239 {
-<a name="l00240"></a>00240 <span class="keywordflow">return</span> x.my_id < y.my_id;
-<a name="l00241"></a>00241 }
-<a name="l00242"></a>00242 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<=(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00243"></a>00243 {
-<a name="l00244"></a>00244 <span class="keywordflow">return</span> x.my_id <= y.my_id;
-<a name="l00245"></a>00245 }
-<a name="l00246"></a>00246 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00247"></a>00247 {
-<a name="l00248"></a>00248 <span class="keywordflow">return</span> x.my_id > y.my_id;
-<a name="l00249"></a>00249 }
-<a name="l00250"></a>00250 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>=(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00251"></a>00251 {
-<a name="l00252"></a>00252 <span class="keywordflow">return</span> x.my_id >= y.my_id;
-<a name="l00253"></a>00253 }
-<a name="l00254"></a>00254
-<a name="l00255"></a>00255 } <span class="comment">// namespace internal;</span>
-<a name="l00256"></a>00256
-<a name="l00258"></a>00258 <span class="keyword">typedef</span> internal::tbb_thread_v3 tbb_thread;
-<a name="l00259"></a>00259
-<a name="l00260"></a>00260 <span class="keyword">using</span> internal::operator==;
-<a name="l00261"></a>00261 <span class="keyword">using</span> internal::operator!=;
-<a name="l00262"></a>00262 <span class="keyword">using</span> internal::operator<;
-<a name="l00263"></a>00263 <span class="keyword">using</span> internal::operator>;
-<a name="l00264"></a>00264 <span class="keyword">using</span> internal::operator<=;
-<a name="l00265"></a>00265 <span class="keyword">using</span> internal::operator>=;
-<a name="l00266"></a>00266
-<a name="l00267"></a>00267 <span class="keyword">inline</span> <span class="keywordtype">void</span> move( tbb_thread& t1, tbb_thread& t2 ) {
-<a name="l00268"></a>00268 internal::move_v3(t1, t2);
-<a name="l00269"></a>00269 }
-<a name="l00270"></a>00270
-<a name="l00271"></a>00271 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ) {
-<a name="l00272"></a>00272 tbb::tbb_thread::native_handle_type h = t1.my_handle;
-<a name="l00273"></a>00273 t1.my_handle = t2.my_handle;
-<a name="l00274"></a>00274 t2.my_handle = h;
-<a name="l00275"></a>00275 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00276"></a>00276 <span class="preprocessor"></span> DWORD i = t1.my_thread_id;
-<a name="l00277"></a>00277 t1.my_thread_id = t2.my_thread_id;
-<a name="l00278"></a>00278 t2.my_thread_id = i;
-<a name="l00279"></a>00279 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00280"></a>00280 }
-<a name="l00281"></a>00281
-<a name="l00282"></a>00282 <span class="keyword">namespace </span>this_tbb_thread {
-<a name="l00283"></a>00283 <span class="keyword">inline</span> tbb_thread::id get_id() { <span class="keywordflow">return</span> internal::thread_get_id_v3(); }
-<a name="l00285"></a>00285 <span class="keyword">inline</span> <span class="keywordtype">void</span> yield() { internal::thread_yield_v3(); }
-<a name="l00287"></a>00287 <span class="keyword">inline</span> <span class="keywordtype">void</span> sleep(<span class="keyword">const</span> tick_count::interval_t &i) {
-<a name="l00288"></a>00288 internal::thread_sleep_v3(i);
-<a name="l00289"></a>00289 }
-<a name="l00290"></a>00290 } <span class="comment">// namespace this_tbb_thread</span>
-<a name="l00291"></a>00291
-<a name="l00292"></a>00292 } <span class="comment">// namespace tbb</span>
-<a name="l00293"></a>00293
-<a name="l00294"></a>00294 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_thread_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00663.html b/doc/html/a00663.html
deleted file mode 100644
index ad2e389..0000000
--- a/doc/html/a00663.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbbmalloc_proxy.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbbmalloc_proxy.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="comment">/*</span>
-<a name="l00022"></a>00022 <span class="comment">Replacing the standard memory allocation routines in Microsoft* C/C++ RTL </span>
-<a name="l00023"></a>00023 <span class="comment">(malloc/free, global new/delete, etc.) with the TBB memory allocator. </span>
-<a name="l00024"></a>00024 <span class="comment"></span>
-<a name="l00025"></a>00025 <span class="comment">Include the following header to a source of any binary which is loaded during </span>
-<a name="l00026"></a>00026 <span class="comment">application startup</span>
-<a name="l00027"></a>00027 <span class="comment"></span>
-<a name="l00028"></a>00028 <span class="comment">#include "tbb/tbbmalloc_proxy.h"</span>
-<a name="l00029"></a>00029 <span class="comment"></span>
-<a name="l00030"></a>00030 <span class="comment">or add following parameters to the linker options for the binary which is </span>
-<a name="l00031"></a>00031 <span class="comment">loaded during application startup. It can be either exe-file or dll.</span>
-<a name="l00032"></a>00032 <span class="comment"></span>
-<a name="l00033"></a>00033 <span class="comment">For win32</span>
-<a name="l00034"></a>00034 <span class="comment">tbbmalloc_proxy.lib /INCLUDE:"___TBB_malloc_proxy"</span>
-<a name="l00035"></a>00035 <span class="comment">win64</span>
-<a name="l00036"></a>00036 <span class="comment">tbbmalloc_proxy.lib /INCLUDE:"__TBB_malloc_proxy"</span>
-<a name="l00037"></a>00037 <span class="comment">*/</span>
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="preprocessor">#ifndef __TBB_tbbmalloc_proxy_H</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbbmalloc_proxy_H</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00042"></a>00042 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span>
-<a name="l00044"></a>00044 <span class="preprocessor">#ifdef _DEBUG</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, "tbbmalloc_proxy_debug.lib")</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, "tbbmalloc_proxy.lib")</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span>
-<a name="l00050"></a>00050 <span class="preprocessor">#if defined(_WIN64)</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(linker, "/include:__TBB_malloc_proxy")</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(linker, "/include:___TBB_malloc_proxy")</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span>
-<a name="l00056"></a>00056 <span class="preprocessor">#else</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="comment">/* Primarily to support MinGW */</span>
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">void</span> __TBB_malloc_proxy();
-<a name="l00060"></a>00060 <span class="keyword">struct </span>__TBB_malloc_proxy_caller {
-<a name="l00061"></a>00061 __TBB_malloc_proxy_caller() { __TBB_malloc_proxy(); }
-<a name="l00062"></a>00062 } <span class="keyword">volatile</span> __TBB_malloc_proxy_helper_object;
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="preprocessor">#endif // _MSC_VER</span>
-<a name="l00065"></a>00065 <span class="preprocessor"></span>
-<a name="l00066"></a>00066 <span class="preprocessor">#endif //__TBB_tbbmalloc_proxy_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00665.html b/doc/html/a00665.html
deleted file mode 100644
index e6ecab1..0000000
--- a/doc/html/a00665.html
+++ /dev/null
@@ -1,164 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tick_count.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tick_count.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tick_count_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tick_count_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#elif __linux__</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#include <ctime></span>
-<a name="l00030"></a>00030 <span class="preprocessor">#else </span><span class="comment">/* generic Unix */</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include <sys/time.h></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#endif </span><span class="comment">/* (choice of OS) */</span>
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="keyword">namespace </span>tbb {
-<a name="l00035"></a>00035
-<a name="l00037"></a>00037
-<a name="l00038"></a><a class="code" href="a00349.html">00038</a> <span class="keyword">class </span><a class="code" href="a00349.html">tick_count</a> {
-<a name="l00039"></a>00039 <span class="keyword">public</span>:
-<a name="l00041"></a><a class="code" href="a00350.html">00041</a> <span class="keyword">class </span><a class="code" href="a00350.html">interval_t</a> {
-<a name="l00042"></a>00042 <span class="keywordtype">long</span> <span class="keywordtype">long</span> value;
-<a name="l00043"></a>00043 <span class="keyword">explicit</span> <a class="code" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">long</span> <span class="keywordtype">long</span> value_ ) : value(value_) {}
-<a name="l00044"></a>00044 <span class="keyword">public</span>:
-<a name="l00046"></a><a class="code" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">00046</a> <a class="code" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>() : value(0) {};
-<a name="l00047"></a>00047
-<a name="l00049"></a>00049 <span class="keyword">explicit</span> <a class="code" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">double</span> sec );
-<a name="l00050"></a>00050
-<a name="l00052"></a>00052 <span class="keywordtype">double</span> <a class="code" href="a00350.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() <span class="keyword">const</span>;
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00349.html">tbb::tick_count</a>;
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057 <span class="keyword">friend</span> <a class="code" href="a00350.html">interval_t</a> <a class="code" href="a00350.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00349.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00349.html">tick_count</a>& t0 );
-<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00350.html#5871ead1ca230efbe52a5008470e6428">00060</a> <span class="keyword">friend</span> <a class="code" href="a00350.html">interval_t</a> <a class="code" href="a00350.html#5871ead1ca230efbe52a5008470e6428">operator+</a>( <span class="keyword">const</span> <a class="code" href="a00350.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00350.html">interval_t</a>& j ) {
-<a name="l00061"></a>00061 <span class="keywordflow">return</span> <a class="code" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00350.html#beea71acda120af3e3e29f10e8cb5c10">value</a>+j.<a class="code" href="a00350.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
-<a name="l00062"></a>00062 }
-<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00350.html#fa509691e1d689830931e36edd274f76">00065</a> <span class="keyword">friend</span> <a class="code" href="a00350.html">interval_t</a> <a class="code" href="a00350.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00350.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00350.html">interval_t</a>& j ) {
-<a name="l00066"></a>00066 <span class="keywordflow">return</span> <a class="code" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00350.html#beea71acda120af3e3e29f10e8cb5c10">value</a>-j.<a class="code" href="a00350.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
-<a name="l00067"></a>00067 }
-<a name="l00068"></a>00068
-<a name="l00070"></a><a class="code" href="a00350.html#cd9814947902e26463a69a111530f81b">00070</a> <a class="code" href="a00350.html">interval_t</a>& <a class="code" href="a00350.html#cd9814947902e26463a69a111530f81b">operator+=</a>( <span class="keyword">const</span> <a class="code" href="a00350.html">interval_t</a>& i ) {value += i.<a class="code" href="a00350.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
-<a name="l00071"></a>00071
-<a name="l00073"></a><a class="code" href="a00350.html#35ff7eaf7c2031b4a991402ac9ecb940">00073</a> <a class="code" href="a00350.html">interval_t</a>& <a class="code" href="a00350.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>( <span class="keyword">const</span> <a class="code" href="a00350.html">interval_t</a>& i ) {value -= i.<a class="code" href="a00350.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
-<a name="l00074"></a>00074 };
-<a name="l00075"></a>00075
-<a name="l00077"></a><a class="code" href="a00349.html#34593326ae4191e02a13c7cbdab9de4c">00077</a> <a class="code" href="a00349.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>() : my_count(0) {};
-<a name="l00078"></a>00078
-<a name="l00080"></a>00080 <span class="keyword">static</span> <a class="code" href="a00349.html">tick_count</a> <a class="code" href="a00349.html#fb7f78ca61cf28398645ace66e284473">now</a>();
-<a name="l00081"></a>00081
-<a name="l00083"></a>00083 <span class="keyword">friend</span> interval_t <a class="code" href="a00349.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00349.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00349.html">tick_count</a>& t0 );
-<a name="l00084"></a>00084
-<a name="l00085"></a>00085 <span class="keyword">private</span>:
-<a name="l00086"></a>00086 <span class="keywordtype">long</span> <span class="keywordtype">long</span> my_count;
-<a name="l00087"></a>00087 };
-<a name="l00088"></a>00088
-<a name="l00089"></a><a class="code" href="a00349.html#fb7f78ca61cf28398645ace66e284473">00089</a> <span class="keyword">inline</span> <a class="code" href="a00349.html">tick_count</a> <a class="code" href="a00349.html#fb7f78ca61cf28398645ace66e284473">tick_count::now</a>() {
-<a name="l00090"></a>00090 <a class="code" href="a00349.html">tick_count</a> result;
-<a name="l00091"></a>00091 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span> LARGE_INTEGER qpcnt;
-<a name="l00093"></a>00093 QueryPerformanceCounter(&qpcnt);
-<a name="l00094"></a>00094 result.<a class="code" href="a00349.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = qpcnt.QuadPart;
-<a name="l00095"></a>00095 <span class="preprocessor">#elif __linux__</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span> <span class="keyword">struct </span>timespec ts;
-<a name="l00097"></a>00097 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span> <span class="keywordtype">int</span> status =
-<a name="l00099"></a>00099 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00100"></a>00100 clock_gettime( CLOCK_REALTIME, &ts );
-<a name="l00101"></a>00101 __TBB_ASSERT( status==0, <span class="stringliteral">"CLOCK_REALTIME not supported"</span> );
-<a name="l00102"></a>00102 result.<a class="code" href="a00349.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = static_cast<long long>(1000000000UL)*static_cast<long long>(ts.tv_sec) + static_cast<long long>(ts.tv_nsec);
-<a name="l00103"></a>00103 <span class="preprocessor">#else </span><span class="comment">/* generic Unix */</span>
-<a name="l00104"></a>00104 <span class="keyword">struct </span>timeval tv;
-<a name="l00105"></a>00105 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span> <span class="keywordtype">int</span> status =
-<a name="l00107"></a>00107 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00108"></a>00108 gettimeofday(&tv, NULL);
-<a name="l00109"></a>00109 __TBB_ASSERT( status==0, <span class="stringliteral">"gettimeofday failed"</span> );
-<a name="l00110"></a>00110 result.<a class="code" href="a00349.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = static_cast<long long>(1000000)*static_cast<long long>(tv.tv_sec) + static_cast<long long>(tv.tv_usec);
-<a name="l00111"></a>00111 <span class="preprocessor">#endif </span><span class="comment">/*(choice of OS) */</span>
-<a name="l00112"></a>00112 <span class="keywordflow">return</span> result;
-<a name="l00113"></a>00113 }
-<a name="l00114"></a>00114
-<a name="l00115"></a><a class="code" href="a00350.html#1a21a428e00cced2e6a49e0f5f2258bf">00115</a> <span class="keyword">inline</span> <a class="code" href="a00350.html#75a9a0949f8a8a84d6758835f1b48dad">tick_count::interval_t::interval_t</a>( <span class="keywordtype">double</span> sec )
-<a name="l00116"></a>00116 {
-<a name="l00117"></a>00117 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00118"></a>00118 <span class="preprocessor"></span> LARGE_INTEGER qpfreq;
-<a name="l00119"></a>00119 QueryPerformanceFrequency(&qpfreq);
-<a name="l00120"></a>00120 value = static_cast<long long>(sec*qpfreq.QuadPart);
-<a name="l00121"></a>00121 <span class="preprocessor">#elif __linux__</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span> value = static_cast<long long>(sec*1E9);
-<a name="l00123"></a>00123 <span class="preprocessor">#else </span><span class="comment">/* generic Unix */</span>
-<a name="l00124"></a>00124 value = static_cast<long long>(sec*1E6);
-<a name="l00125"></a>00125 <span class="preprocessor">#endif </span><span class="comment">/* (choice of OS) */</span>
-<a name="l00126"></a>00126 }
-<a name="l00127"></a>00127
-<a name="l00128"></a><a class="code" href="a00349.html#09dde78a4100800c11bb883d6204b586">00128</a> <span class="keyword">inline</span> <a class="code" href="a00350.html">tick_count::interval_t</a> <a class="code" href="a00349.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00349.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00349.html">tick_count</a>& t0 ) {
-<a name="l00129"></a>00129 <span class="keywordflow">return</span> <a class="code" href="a00350.html">tick_count::interval_t</a>( t1.<a class="code" href="a00349.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a>-t0.<a class="code" href="a00349.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> );
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131
-<a name="l00132"></a><a class="code" href="a00350.html#d5d8429c0bc59cf6131b2abc7929fa59">00132</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00350.html#d5d8429c0bc59cf6131b2abc7929fa59">tick_count::interval_t::seconds</a>()<span class="keyword"> const </span>{
-<a name="l00133"></a>00133 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span> LARGE_INTEGER qpfreq;
-<a name="l00135"></a>00135 QueryPerformanceFrequency(&qpfreq);
-<a name="l00136"></a>00136 <span class="keywordflow">return</span> value/(double)qpfreq.QuadPart;
-<a name="l00137"></a>00137 #elif __linux__
-<a name="l00138"></a>00138 <span class="keywordflow">return</span> value*1E-9;
-<a name="l00139"></a>00139 #<span class="keywordflow">else</span> <span class="comment">/* generic Unix */</span>
-<a name="l00140"></a>00140 <span class="keywordflow">return</span> value*1E-6;
-<a name="l00141"></a>00141 #endif <span class="comment">/* (choice of OS) */</span>
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 } <span class="comment">// namespace tbb</span>
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tick_count_H */</span>
-<a name="l00147"></a>00147
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
index 2293f51..0757de2 100644
--- a/doc/html/annotated.html
+++ b/doc/html/annotated.html
@@ -21,116 +21,117 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<h1>Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table>
- <tr><td class="indexkey"><a class="el" href="a00249.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a></td><td class="indexvalue">Defines entry point for affinity partitioner into tbb run-time library </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00251.html">tbb::interface6::aggregator</a></td><td class="indexvalue">Basic aggregator interface </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td class="indexvalue">Aggregator base class and expert interface </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00253.html">tbb::aligned_space< T, N ></a></td><td class="indexvalue">Block of space aligned sufficiently to construct an array T with N elements </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00254.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00255.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00255.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00256.html">tbb::internal::atomic_backoff</a></td><td class="indexvalue">Class that implements exponential backoff </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00257.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00258.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00259.html">tbb::blocked_range< Value ></a></td><td class="indexvalue">A range over which to iterate </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td class="indexvalue">A 2-dimensional range that models the Range concept </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td class="indexvalue">A 3-dimensional range that models the Range concept </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a></td><td class="indexvalue">Forwards messages of type T to all successors </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td class="indexvalue">Forwards messages in arbitrary order </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00266.html">tbb::captured_exception</a></td><td class="indexvalue">This class is used by TBB to propagate information about unhandled exceptions into the root thread </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00267.html">tbb::combinable< T ></a></td><td class="indexvalue">Thread-local storage with optional reduction </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td class="indexvalue">Unordered map from Key to T </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00270.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td class="indexvalue">Allows write access to elements and combines data access, locking, and garbage collection </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00271.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td class="indexvalue">Bucket accessor is to find, rehash, acquire a lock, and access a bucket </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td class="indexvalue">Combines data access, locking, and garbage collection </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td class="indexvalue">Concurrent priority queue </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe non-blocking concurrent queue </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00277.html">tbb::flow::interface6::continue_msg</a></td><td class="indexvalue">An empty class used for messages that mean "I'm done" </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a></td><td class="indexvalue">Implements an executable node that supports <a class="el" href="a00277.html">continue_msg</a> -> Output </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a></td><td class="indexvalue">Base class for receivers of completion messages </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00280.html">tbb::empty_task</a></td><td class="indexvalue">Task that does nothing. Useful for synchronization </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The <a class="el" href="a00281.html">enumerable_thread_specific</a> container </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00282.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a></td><td class="indexvalue">Class representing a chain of type-safe pipeline filters </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00284.html">tbb::final_scan_tag</a></td><td class="indexvalue">Used to indicate that the final scan is being performed </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00285.html">tbb::interface6::flow_control</a></td><td class="indexvalue">Input_filter control to signal end-of-input for parallel_pipeline </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td class="indexvalue">Implements a function node that supports Input -> Output </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td class="indexvalue">Implements a function node that supports Input -> Output </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00288.html">tbb::flow::interface6::graph</a></td><td class="indexvalue">The graph class </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a></td><td class="indexvalue">The base of all graph nodes </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00290.html">tbb::improper_lock</a></td><td class="indexvalue">Exception for PPL locks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00291.html">tbb::invalid_multiple_scheduling</a></td><td class="indexvalue">Exception for repeated scheduling of the same task_handle </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a></td><td class="indexvalue">Forwards messages only if the threshold has not been reached </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00293.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><a class="el" href="a00295.html">tbb::interface6::memory_pool< Alloc ></a></td><td class="indexvalue">Thread-safe growable pool allocator for variable-size requests </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00298.html">tbb::missing_wait</a></td><td class="indexvalue">Exception for missing wait on structured_task_group </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a></td><td class="indexvalue">Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td class="indexvalue">Implements a function node that supports Input -> (set of outputs) </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00301.html">tbb::mutex</a></td><td class="indexvalue">Wrapper around the platform's native reader-writer lock </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00302.html">tbb::mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00303.html">tbb::null_mutex</a></td><td class="indexvalue">A mutex which does nothing </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00305.html">tbb::null_rw_mutex</a></td><td class="indexvalue">A rw mutex which does nothing </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00307.html">tbb::parallel_do_feeder< Item ></a></td><td class="indexvalue">Class the user supplied algorithm body uses to add new tasks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00308.html">tbb::parallel_while< Body ></a></td><td class="indexvalue">Parallel iteration over a stream, with optional addition of more work </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00309.html">tbb::internal::partition_type_base</a></td><td class="indexvalue">Provides backward-compatible methods for partition objects without affinity </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00310.html">tbb::pipeline</a></td><td class="indexvalue">A processing pipeline that applies filters to items </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00311.html">tbb::pre_scan_tag</a></td><td class="indexvalue">Used to indicate that the initial scan is being performed </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td class="indexvalue">Forwards messages in priority order </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a></td><td class="indexvalue">Forwards messages in FIFO order </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00314.html">tbb::queuing_mutex</a></td><td class="indexvalue">Queuing mutex with local-only spinning </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00315.html">tbb::queuing_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00316.html">tbb::queuing_rw_mutex</a></td><td class="indexvalue">Queuing reader-writer mutex with local-only spinning </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a></td><td class="indexvalue">Writer-preference reader-writer lock with local-only spinning on readers </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td class="indexvalue">The scoped lock pattern for write locks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td class="indexvalue">The scoped lock pattern for read locks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a></td><td class="indexvalue">Pure virtual template class that defines a receiver of messages of type T </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00322.html">tbb::recursive_mutex</a></td><td class="indexvalue">Mutex that allows recursive mutex acquisition </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a></td><td class="indexvalue">Load TBB at runtime </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00326.html">tbb::scalable_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a></td><td class="indexvalue">Pure virtual template class that defines a sender of messages of type T </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td class="indexvalue">Forwards messages in sequence order </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00329.html">tbb::simple_partitioner</a></td><td class="indexvalue">A simple partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a></td><td class="indexvalue">An executable node that acts as a source, i.e. it has no predecessors </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00331.html">tbb::spin_mutex</a></td><td class="indexvalue">A lock that occupies a single byte </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a></td><td class="indexvalue">Fast, unfair, spinning reader-writer lock with backoff and writer-preference </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00335.html">tbb::split</a></td><td class="indexvalue">Dummy type that distinguishes splitting constructor from copy constructor </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td class="indexvalue">Split_node: accepts a tuple as input, forwards each element of the tuple to its </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00337.html">tbb::task</a></td><td class="indexvalue">Base class for user-defined tasks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00338.html">tbb::interface5::internal::task_base</a></td><td class="indexvalue">Base class for methods that became static in TBB 3.0 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00339.html">tbb::task_group_context</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><a class="el" href="a00340.html">tbb::task_group_context</a></td><td class="indexvalue">Used to form groups of tasks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00341.html">tbb::task_list</a></td><td class="indexvalue">A list of children </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00342.html">tbb::task_scheduler_init</a></td><td class="indexvalue">Class delimiting the scope of task scheduler activity </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00344.html">tbb::tbb_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00345.html">tbb::tbb_exception</a></td><td class="indexvalue">Interface to be implemented by all exceptions TBB recognizes and propagates across the threads </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a></td><td class="indexvalue">Exception container that preserves the exact copy of the original exception </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00347.html">tbb::tbb_hash_compare< Key ></a></td><td class="indexvalue">Hash_compare that is default argument for concurrent_hash_map </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00348.html">tbb::thread_bound_filter</a></td><td class="indexvalue">A stage in a pipeline served by a user thread </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00349.html">tbb::tick_count</a></td><td class="indexvalue">Absolute timestamp </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00350.html">tbb::tick_count::interval_t</a></td><td class="indexvalue">Relative time interval </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00351.html">tbb::user_abort</a></td><td class="indexvalue">Exception for user-initiated abort </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00352.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td class="indexvalue">Work around for bug in GNU 3.2 and MSVC compilers </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00261.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a></td><td class="indexvalue">Defines entry point for affinity partitioner into tbb run-time library </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00263.html">tbb::interface6::aggregator</a></td><td class="indexvalue">Basic aggregator interface </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a></td><td class="indexvalue">Aggregator base class and expert interface </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00265.html">tbb::aligned_space< T, N ></a></td><td class="indexvalue">Block of space aligned sufficiently to construct an array T with N elements </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00266.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00267.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00267.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00268.html">tbb::internal::atomic_backoff</a></td><td class="indexvalue">Class that implements exponential backoff </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00269.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00270.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00271.html">tbb::blocked_range< Value ></a></td><td class="indexvalue">A range over which to iterate </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td class="indexvalue">A 2-dimensional range that models the Range concept </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td class="indexvalue">A 3-dimensional range that models the Range concept </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a></td><td class="indexvalue">Forwards messages of type T to all successors </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td class="indexvalue">Forwards messages in arbitrary order </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00278.html">tbb::captured_exception</a></td><td class="indexvalue">This class is used by TBB to propagate information about unhandled exceptions into the root thread </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00279.html">tbb::combinable< T ></a></td><td class="indexvalue">Thread-local storage with optional reduction </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td class="indexvalue">Unordered map from Key to T </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00282.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td class="indexvalue">Allows write access to elements and combines data access, locking, and garbage collection </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00283.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td class="indexvalue">Bucket accessor is to find, rehash, acquire a lock, and access a bucket </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td class="indexvalue">Combines data access, locking, and garbage collection </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td class="indexvalue">Concurrent priority queue </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe non-blocking concurrent queue </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00289.html">tbb::flow::interface6::continue_msg</a></td><td class="indexvalue">An empty class used for messages that mean "I'm done" </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a></td><td class="indexvalue">Implements an executable node that supports <a class="el" href="a00289.html">continue_msg</a> -> Output </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a></td><td class="indexvalue">Base class for receivers of completion messages </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00292.html">tbb::empty_task</a></td><td class="indexvalue">Task that does nothing. Useful for synchronization </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The <a class="el" href="a00293.html">enumerable_thread_specific</a> container </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00294.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a></td><td class="indexvalue">Class representing a chain of type-safe pipeline filters </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00296.html">tbb::final_scan_tag</a></td><td class="indexvalue">Used to indicate that the final scan is being performed </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00297.html">tbb::interface6::flow_control</a></td><td class="indexvalue">Input_filter control to signal end-of-input for parallel_pipeline </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td class="indexvalue">Implements a function node that supports Input -> Output </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td class="indexvalue">Implements a function node that supports Input -> Output </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00300.html">tbb::flow::interface6::graph</a></td><td class="indexvalue">The graph class </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a></td><td class="indexvalue">The base of all graph nodes </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00302.html">tbb::improper_lock</a></td><td class="indexvalue">Exception for PPL locks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00303.html">tbb::invalid_multiple_scheduling</a></td><td class="indexvalue">Exception for repeated scheduling of the same task_handle </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a></td><td class="indexvalue">Forwards messages only if the threshold has not been reached </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00305.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00306.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00307.html">tbb::interface6::memory_pool< Alloc ></a></td><td class="indexvalue">Thread-safe growable pool allocator for variable-size requests </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00310.html">tbb::missing_wait</a></td><td class="indexvalue">Exception for missing wait on structured_task_group </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a></td><td class="indexvalue">Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a></td><td class="indexvalue">Implements a function node that supports Input -> (set of outputs) </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00313.html">tbb::mutex</a></td><td class="indexvalue">Wrapper around the platform's native reader-writer lock </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00314.html">tbb::mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00315.html">tbb::null_mutex</a></td><td class="indexvalue">A mutex which does nothing </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00317.html">tbb::null_rw_mutex</a></td><td class="indexvalue">A rw mutex which does nothing </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00319.html">tbb::parallel_do_feeder< Item ></a></td><td class="indexvalue">Class the user supplied algorithm body uses to add new tasks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00320.html">tbb::parallel_while< Body ></a></td><td class="indexvalue">Parallel iteration over a stream, with optional addition of more work </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00321.html">tbb::internal::partition_type_base</a></td><td class="indexvalue">Provides backward-compatible methods for partition objects without affinity </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00322.html">tbb::pipeline</a></td><td class="indexvalue">A processing pipeline that applies filters to items </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00323.html">tbb::pre_scan_tag</a></td><td class="indexvalue">Used to indicate that the initial scan is being performed </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td class="indexvalue">Forwards messages in priority order </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a></td><td class="indexvalue">Forwards messages in FIFO order </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00326.html">tbb::queuing_mutex</a></td><td class="indexvalue">Queuing mutex with local-only spinning </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00327.html">tbb::queuing_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00328.html">tbb::queuing_rw_mutex</a></td><td class="indexvalue">Queuing reader-writer mutex with local-only spinning </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a></td><td class="indexvalue">Writer-preference reader-writer lock with local-only spinning on readers </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td class="indexvalue">The scoped lock pattern for write locks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td class="indexvalue">The scoped lock pattern for read locks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a></td><td class="indexvalue">Pure virtual template class that defines a receiver of messages of type T </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00334.html">tbb::recursive_mutex</a></td><td class="indexvalue">Mutex that allows recursive mutex acquisition </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a></td><td class="indexvalue">Load TBB at runtime </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00338.html">tbb::scalable_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a></td><td class="indexvalue">Pure virtual template class that defines a sender of messages of type T </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td class="indexvalue">Forwards messages in sequence order </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00341.html">tbb::simple_partitioner</a></td><td class="indexvalue">A simple partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a></td><td class="indexvalue">An executable node that acts as a source, i.e. it has no predecessors </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00343.html">tbb::spin_mutex</a></td><td class="indexvalue">A lock that occupies a single byte </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a></td><td class="indexvalue">Fast, unfair, spinning reader-writer lock with backoff and writer-preference </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00347.html">tbb::split</a></td><td class="indexvalue">Dummy type that distinguishes splitting constructor from copy constructor </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td class="indexvalue">Split_node: accepts a tuple as input, forwards each element of the tuple to its </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00349.html">tbb::task</a></td><td class="indexvalue">Base class for user-defined tasks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00350.html">tbb::interface6::task_arena</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00351.html">tbb::interface5::internal::task_base</a></td><td class="indexvalue">Base class for methods that became static in TBB 3.0 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00352.html">tbb::task_group_context</a></td><td class="indexvalue">Used to form groups of tasks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00353.html">tbb::task_group_context</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00354.html">tbb::task_list</a></td><td class="indexvalue">A list of children </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00355.html">tbb::task_scheduler_init</a></td><td class="indexvalue">Class delimiting the scope of task scheduler activity </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00357.html">tbb::tbb_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00358.html">tbb::tbb_exception</a></td><td class="indexvalue">Interface to be implemented by all exceptions TBB recognizes and propagates across the threads </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a></td><td class="indexvalue">Exception container that preserves the exact copy of the original exception </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00360.html">tbb::tbb_hash_compare< Key ></a></td><td class="indexvalue">Hash_compare that is default argument for concurrent_hash_map </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00361.html">tbb::thread_bound_filter</a></td><td class="indexvalue">A stage in a pipeline served by a user thread </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00362.html">tbb::tick_count</a></td><td class="indexvalue">Absolute timestamp </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00363.html">tbb::tick_count::interval_t</a></td><td class="indexvalue">Relative time interval </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00364.html">tbb::user_abort</a></td><td class="indexvalue">Exception for user-initiated abort </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00365.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td class="indexvalue">Work around for bug in GNU 3.2 and MSVC compilers </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/concepts.html b/doc/html/concepts.html
index 75a2bf9..ebca114 100644
--- a/doc/html/concepts.html
+++ b/doc/html/concepts.html
@@ -22,7 +22,7 @@ TBB defines a set of minimal requirements each concept must conform to. Here is
<li><a class="el" href="range_req.html">Requirements on range concept</a></li><li><a class="el" href="parallel_do_body_req.html">Requirements on parallel_do body</a></li><li><a class="el" href="parallel_for_body_req.html">Requirements on parallel_for body</a></li><li><a class="el" href="parallel_reduce_body_req.html">Requirements on parallel_reduce body</a></li><li><a class="el" href="parallel_scan_body_req.html">Requirements on parallel_scan body</a></li><li><a class="el" href="parallel [...]
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/deprecated.html b/doc/html/deprecated.html
index 66a2611..ee13035 100644
--- a/doc/html/deprecated.html
+++ b/doc/html/deprecated.html
@@ -15,12 +15,12 @@
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
<h1><a class="anchor" name="deprecated">Deprecated List</a></h1><a class="anchor" name="_deprecated000001"></a> <dl>
-<dt>Member <a class="el" href="a00275.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
+<dt>Member <a class="el" href="a00287.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
<dd>Use try_pop() </dd>
</dl>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/files.html b/doc/html/files.html
index 2013158..1502140 100644
--- a/doc/html/files.html
+++ b/doc/html/files.html
@@ -20,64 +20,13 @@
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
<h1>File List</h1>Here is a list of all documented files with brief descriptions:<table>
- <tr><td class="indexkey"><b>aggregator.h</b> <a href="a00432.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>aligned_space.h</b> <a href="a00440.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>atomic.h</b> <a href="a00441.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range.h</b> <a href="a00449.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range2d.h</b> <a href="a00450.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range3d.h</b> <a href="a00451.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>cache_aligned_allocator.h</b> <a href="a00452.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>combinable.h</b> <a href="a00454.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_hash_map.h</b> <a href="a00455.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_lru_cache.h</b> <a href="a00466.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_priority_queue.h</b> <a href="a00473.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_queue.h</b> <a href="a00476.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_unordered_map.h</b> <a href="a00480.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_unordered_set.h</b> <a href="a00484.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_vector.h</b> <a href="a00487.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>critical_section.h</b> <a href="a00496.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>enumerable_thread_specific.h</b> <a href="a00499.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><a class="el" href="a00372.html">flow_graph.h</a> <a href="a00511.html">[code]</a></td><td class="indexvalue">The graph related classes and functions </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00373.html">memory_pool.h</a> <a href="a00524.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>mutex.h</b> <a href="a00531.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>null_mutex.h</b> <a href="a00533.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>null_rw_mutex.h</b> <a href="a00534.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_do.h</b> <a href="a00535.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_for.h</b> <a href="a00544.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_for_each.h</b> <a href="a00548.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_invoke.h</b> <a href="a00550.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_reduce.h</b> <a href="a00556.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_scan.h</b> <a href="a00562.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_sort.h</b> <a href="a00567.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_while.h</b> <a href="a00571.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>partitioner.h</b> <a href="a00575.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>pipeline.h</b> <a href="a00587.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>queuing_mutex.h</b> <a href="a00603.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>queuing_rw_mutex.h</b> <a href="a00604.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>reader_writer_lock.h</b> <a href="a00605.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>recursive_mutex.h</b> <a href="a00606.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>runtime_loader.h</b> <a href="a00607.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><a class="el" href="a00392.html">scalable_allocator.h</a> <a href="a00608.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>spin_mutex.h</b> <a href="a00611.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>spin_rw_mutex.h</b> <a href="a00612.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task.h</b> <a href="a00613.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task_group.h</b> <a href="a00623.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task_scheduler_init.h</b> <a href="a00630.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task_scheduler_observer.h</b> <a href="a00631.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb.h</b> <a href="a00633.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_allocator.h</b> <a href="a00634.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_config.h</b> <a href="a00638.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_exception.h</b> <a href="a00639.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_machine.h</b> <a href="a00640.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_profiling.h</b> <a href="a00647.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_stddef.h</b> <a href="a00648.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_thread.h</b> <a href="a00655.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbbmalloc_proxy.h</b> <a href="a00663.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tick_count.h</b> <a href="a00665.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00385.html">flow_graph.h</a></td><td class="indexvalue">The graph related classes and functions </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00386.html">memory_pool.h</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00405.html">scalable_allocator.h</a></td><td class="indexvalue"></td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions.html b/doc/html/functions.html
index 6506554..dc01f00 100644
--- a/doc/html/functions.html
+++ b/doc/html/functions.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li id="current"><a href="functions.html#index_a"><span>a</span></a></li>
+ <li id="current"><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -60,27 +61,12 @@
<p>
Here is a list of all documented class members with links to the class documentation for each member:
<p>
-<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
-<li>abort()
-: <a class="el" href="a00268.html#86c77a6c1317239405968f5afc7b10d3">tbb::concurrent_bounded_queue< T, A ></a><li>acquire()
-: <a class="el" href="a00334.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00317.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00315.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
-: <a class="el" href="a00330.html#4b647e4a93d08ccdd8d323279e4eaaa6">tbb::flow::interface6::source_node< Output ></a><li>add()
-: <a class="el" href="a00308.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00307.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
-: <a class="el" href="a00310.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
-: <a class="el" href="a00337.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
-: <a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
-: <a class="el" href="a00346.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00343.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00325.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00296.html#365bd64d284c80d85bb2149a12681526">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00264.html#4cdeea67af6c1fcd8f1d5e9 [...]
-: <a class="el" href="a00337.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
-: <a class="el" href="a00337.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
-: <a class="el" href="a00337.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
-: <a class="el" href="a00281.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">tbb::interface5::concurrent_priority_qu [...]
-: <a class="el" href="a00276.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00276.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
-: <a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a></ul>
+<h3><a class="anchor" name="index__">- _ -</a></h3><ul>
+<li>__TBB_RECYCLE_TO_ENQUEUE
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e2a3f84c7721f6c0b859a91a5ecc660c4">tbb::task</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions.html b/doc/html/functions_0x61.html
similarity index 68%
copy from doc/html/functions.html
copy to doc/html/functions_0x61.html
index 6506554..b82e961 100644
--- a/doc/html/functions.html
+++ b/doc/html/functions_0x61.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li id="current"><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li id="current"><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,25 +63,25 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
<li>abort()
-: <a class="el" href="a00268.html#86c77a6c1317239405968f5afc7b10d3">tbb::concurrent_bounded_queue< T, A ></a><li>acquire()
-: <a class="el" href="a00334.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00317.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00315.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
-: <a class="el" href="a00330.html#4b647e4a93d08ccdd8d323279e4eaaa6">tbb::flow::interface6::source_node< Output ></a><li>add()
-: <a class="el" href="a00308.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00307.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
-: <a class="el" href="a00310.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
-: <a class="el" href="a00337.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
-: <a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
-: <a class="el" href="a00346.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00343.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00325.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00296.html#365bd64d284c80d85bb2149a12681526">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00264.html#4cdeea67af6c1fcd8f1d5e9 [...]
-: <a class="el" href="a00337.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
-: <a class="el" href="a00337.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
-: <a class="el" href="a00337.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
-: <a class="el" href="a00281.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">tbb::interface5::concurrent_priority_qu [...]
-: <a class="el" href="a00276.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00276.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
-: <a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00280.html#86c77a6c1317239405968f5afc7b10d3">tbb::concurrent_bounded_queue< T, A ></a><li>acquire()
+: <a class="el" href="a00346.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00329.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00327.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00342.html#4b647e4a93d08ccdd8d323279e4eaaa6">tbb::flow::interface6::source_node< Output ></a><li>add()
+: <a class="el" href="a00320.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00319.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
+: <a class="el" href="a00322.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
+: <a class="el" href="a00349.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
+: <a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
+: <a class="el" href="a00359.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00356.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00337.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00308.html#365bd64d284c80d85bb2149a12681526">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00276.html#4cdeea67af6c1fcd8f1d5e9 [...]
+: <a class="el" href="a00349.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
+: <a class="el" href="a00349.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
+: <a class="el" href="a00349.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
+: <a class="el" href="a00293.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">tbb::interface5::concurrent_priority_qu [...]
+: <a class="el" href="a00288.html#c04d64fe86696a084afa117d34384b5f">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00288.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
+: <a class="el" href="a00355.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a>, <a class="el" href="a00350.html#fa26370c094032900c1ed69d8e92f4e8">tbb::interface6::task_arena</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x62.html b/doc/html/functions_0x62.html
index c697e3f..60a747c 100644
--- a/doc/html/functions_0x62.html
+++ b/doc/html/functions_0x62.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li id="current"><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,14 +63,14 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
<li>back()
-: <a class="el" href="a00276.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00288.html#f63c3b7d03098b57fc16b71c57b303e5">tbb::flow::interface6::graph</a>, <a class="el" href="a00281.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00259.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00253 [...]
-: <a class="el" href="a00259.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00269.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
-: <a class="el" href="a00263.html#03ad7b85a8341437f584af06ad050cdc">tbb::flow::interface6::buffer_node< T, A ></a></ul>
+: <a class="el" href="a00288.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00300.html#f63c3b7d03098b57fc16b71c57b303e5">tbb::flow::interface6::graph</a>, <a class="el" href="a00293.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00271.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00265 [...]
+: <a class="el" href="a00271.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00281.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
+: <a class="el" href="a00275.html#03ad7b85a8341437f584af06ad050cdc">tbb::flow::interface6::buffer_node< T, A ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x63.html b/doc/html/functions_0x63.html
index c22c70c..a6f0648 100644
--- a/doc/html/functions_0x63.html
+++ b/doc/html/functions_0x63.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li id="current"><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,32 +63,33 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
<li>cancel_group_execution()
-: <a class="el" href="a00337.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00340.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00276.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
-: <a class="el" href="a00288.html#e183dfc3f89dc8f57c06ba165fb89f66">tbb::flow::interface6::graph</a>, <a class="el" href="a00276.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00288.html#4866156e6a31d0399b61c6eb82ee81fd">tbb::flow::interface6::graph</a>, <a class="el" href="a00276.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
-: <a class="el" href="a00337.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
-: <a class="el" href="a00341.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00310.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00281.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#90b31e2954c6e4596c7900435a5f [...]
-: <a class="el" href="a00261.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00260.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00276.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
-: <a class="el" href="a00268.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00269.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
-: <a class="el" href="a00273.html#c8b20e7430c5302936030bef59a562be">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
-: <a class="el" href="a00275.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00274.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00276.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00272.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
-: <a class="el" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00268.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>construct()
-: <a class="el" href="a00343.html#15c431ccb5ccc5a30e5d496edad4c143">tbb::tbb_allocator< T ></a>, <a class="el" href="a00296.html#3491a81e0597c1696a163e7c8fa8706a">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00264.html#48a7e49dfb0578edc84a90a5ac30793d">tbb::cache_aligned_allocator< T ></a><li>context()
-: <a class="el" href="a00337.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_node()
-: <a class="el" href="a00278.html#869562787fcb5c57a90aea120f26d492">tbb::flow::interface6::continue_node< Output ></a><li>continue_receiver()
-: <a class="el" href="a00279.html#a0b292ed7fa6556b2a735f6d1e82dc74">tbb::flow::interface6::continue_receiver</a><li>count()
-: <a class="el" href="a00269.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00276.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00276.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00349.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00352.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
+: <a class="el" href="a00288.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00300.html#e183dfc3f89dc8f57c06ba165fb89f66">tbb::flow::interface6::graph</a>, <a class="el" href="a00288.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00300.html#4866156e6a31d0399b61c6eb82ee81fd">tbb::flow::interface6::graph</a>, <a class="el" href="a00288.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
+: <a class="el" href="a00349.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
+: <a class="el" href="a00354.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00322.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00293.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00273.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00272.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00288.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00280.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00281.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
+: <a class="el" href="a00285.html#c8b20e7430c5302936030bef59a562be">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
+: <a class="el" href="a00287.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00286.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00288.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00284.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
+: <a class="el" href="a00271.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00280.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>construct()
+: <a class="el" href="a00356.html#3999cb92a8b6a995b65ee9ae5c31751f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00308.html#c6d3fa3032bf5d4be841729d7893e26d">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00276.html#273d07524d386efc1366bf37af5f91f4">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00349.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_node()
+: <a class="el" href="a00290.html#869562787fcb5c57a90aea120f26d492">tbb::flow::interface6::continue_node< Output ></a><li>continue_receiver()
+: <a class="el" href="a00291.html#a0b292ed7fa6556b2a735f6d1e82dc74">tbb::flow::interface6::continue_receiver</a><li>count()
+: <a class="el" href="a00281.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00288.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00288.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a><li>current_slot()
+: <a class="el" href="a00350.html#e734de6a5f4a0bd4461c0cbdaa29b6ce">tbb::interface6::task_arena</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x64.html b/doc/html/functions_0x64.html
index 4322d4f..a9a660e 100644
--- a/doc/html/functions_0x64.html
+++ b/doc/html/functions_0x64.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li id="current"><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,18 +63,17 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
<li>deallocate()
-: <a class="el" href="a00343.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00325.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00296.html#4e24a03de38638af07548383024c54ab">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00264.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement
-: <a class="el" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">tbb::flow::interface6::limiter_node< T ></a><li>decrement_ref_count()
-: <a class="el" href="a00337.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
-: <a class="el" href="a00288.html#29b85506870f13a884a21655aec2a65d">tbb::flow::interface6::graph</a><li>default_num_threads()
-: <a class="el" href="a00342.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>deferred
-: <a class="el" href="a00342.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00346.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00299.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00345.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">tbb::task</a><li>d [...]
-: <a class="el" href="a00268.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>downgrade_to_reader()
-: <a class="el" href="a00334.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00317.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00356.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00337.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00308.html#4e24a03de38638af07548383024c54ab">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00276.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement
+: <a class="el" href="a00304.html#a3344b2461966631b6ee34b79fb105c7">tbb::flow::interface6::limiter_node< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00349.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
+: <a class="el" href="a00300.html#29b85506870f13a884a21655aec2a65d">tbb::flow::interface6::graph</a><li>deferred
+: <a class="el" href="a00355.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>destroy()
+: <a class="el" href="a00359.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00311.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00358.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00349.html#dfaacf92685e5f86393bf657b2853bf8">tbb::task</a><li>d [...]
+: <a class="el" href="a00280.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>downgrade_to_reader()
+: <a class="el" href="a00346.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00329.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x65.html b/doc/html/functions_0x65.html
index 20ff978..37e872b 100644
--- a/doc/html/functions_0x65.html
+++ b/doc/html/functions_0x65.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,30 +63,30 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
<li>ec_bad_arg
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">tbb::interface6::runtime_loader</a><li>ec_bad_call
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">tbb::interface6::runtime_loader</a><li>ec_bad_lib
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">tbb::interface6::runtime_loader</a><li>ec_bad_ver
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">tbb::interface6::runtime_loader</a><li>ec_no_lib
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">tbb::interface6::runtime_loader</a><li>ec_ok
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">tbb::interface6::runtime_loader</a><li>em_abort
-: <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">tbb::interface6::runtime_loader</a><li>em_status
-: <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">tbb::interface6::runtime_loader</a><li>em_throw
-: <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">tbb::interface6::runtime_loader</a><li>empty()
-: <a class="el" href="a00341.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00281.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.htm [...]
-: <a class="el" href="a00288.html#907bd06606818c36f52420fe8d469d35">tbb::flow::interface6::graph</a>, <a class="el" href="a00281.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00253 [...]
-: <a class="el" href="a00337.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
-: <a class="el" href="a00281.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00269.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>error_code
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader</a><li>error_mode
-: <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader</a><li>exact_exception_propagation
-: <a class="el" href="a00282.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>exclude()
-: <a class="el" href="a00269.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
-: <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00279.html#40ca8b7e96c5bc3428b4d1e409725ee5">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00251.html#641c8dc43652589d12eefaef130c094d">tbb::interface6::aggregator</a><li>execute_impl()
-: <a class="el" href="a00252.html#fdd0a9ce522246b9e14ae5e44bc72d31">tbb::interface6::aggregator_ext< handler_type ></a><li>executing
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a></ul>
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">tbb::interface6::runtime_loader</a><li>ec_bad_call
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">tbb::interface6::runtime_loader</a><li>ec_bad_lib
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">tbb::interface6::runtime_loader</a><li>ec_bad_ver
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">tbb::interface6::runtime_loader</a><li>ec_no_lib
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">tbb::interface6::runtime_loader</a><li>ec_ok
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">tbb::interface6::runtime_loader</a><li>em_abort
+: <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">tbb::interface6::runtime_loader</a><li>em_status
+: <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">tbb::interface6::runtime_loader</a><li>em_throw
+: <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">tbb::interface6::runtime_loader</a><li>empty()
+: <a class="el" href="a00354.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00293.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.htm [...]
+: <a class="el" href="a00300.html#907bd06606818c36f52420fe8d469d35">tbb::flow::interface6::graph</a>, <a class="el" href="a00293.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00271.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00265 [...]
+: <a class="el" href="a00350.html#780277a89e35868abdec843fecaa2237">tbb::interface6::task_arena</a>, <a class="el" href="a00349.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
+: <a class="el" href="a00293.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00281.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>error_code
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader</a><li>error_mode
+: <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader</a><li>exact_exception_propagation
+: <a class="el" href="a00294.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>exclude()
+: <a class="el" href="a00281.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00350.html#082803bb20347e64fed2c11db8e9670e">tbb::interface6::task_arena</a>, <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00291.html#2165b726212975be532cff7b2f001834">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00263.html#641c8dc43652589d12eefaef130c094d">tbb::interface6::aggregator</a><li>execute_impl()
+: <a class="el" href="a00264.html#fdd0a9ce522246b9e14ae5e44bc72d31">tbb::interface6::aggregator_ext< handler_type ></a><li>executing
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x66.html b/doc/html/functions_0x66.html
index 7872813..c1e7534 100644
--- a/doc/html/functions_0x66.html
+++ b/doc/html/functions_0x66.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,19 +63,19 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
<li>filter_is_bound
-: <a class="el" href="a00282.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
-: <a class="el" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
-: <a class="el" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
-: <a class="el" href="a00282.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>finalize()
-: <a class="el" href="a00282.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00269.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
-: <a class="el" href="a00263.html#2648324ce0a38b40132b8502ef250e3a">tbb::flow::interface6::buffer_node< T, A ></a><li>freed
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>front()
-: <a class="el" href="a00276.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
-: <a class="el" href="a00287.html#01055081ed477714503820035db3a965">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, <a class="el" href="a00286.html#d5132323fd2ac6a00ea0c78beda78723">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></ul>
+: <a class="el" href="a00294.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
+: <a class="el" href="a00294.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
+: <a class="el" href="a00294.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
+: <a class="el" href="a00294.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>finalize()
+: <a class="el" href="a00294.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00281.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward_task()
+: <a class="el" href="a00275.html#8954338d1a7740f9be80455ba27e8eed">tbb::flow::interface6::buffer_node< T, A ></a><li>freed
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>front()
+: <a class="el" href="a00288.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
+: <a class="el" href="a00299.html#01055081ed477714503820035db3a965">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, <a class="el" href="a00298.html#d5132323fd2ac6a00ea0c78beda78723">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x67.html b/doc/html/functions_0x67.html
index 4247d32..b4a0b61 100644
--- a/doc/html/functions_0x67.html
+++ b/doc/html/functions_0x67.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,16 +63,16 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
<li>get_allocator()
-: <a class="el" href="a00276.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
-: <a class="el" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
-: <a class="el" href="a00288.html#104d4f3775f596b43177c29e6b7b7656">tbb::flow::interface6::graph</a><li>group()
-: <a class="el" href="a00337.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
-: <a class="el" href="a00337.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
-: <a class="el" href="a00276.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
-: <a class="el" href="a00276.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00288.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
+: <a class="el" href="a00271.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
+: <a class="el" href="a00300.html#104d4f3775f596b43177c29e6b7b7656">tbb::flow::interface6::graph</a><li>group()
+: <a class="el" href="a00349.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
+: <a class="el" href="a00349.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
+: <a class="el" href="a00288.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00288.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x69.html b/doc/html/functions_0x69.html
index aca7f13..f8506d4 100644
--- a/doc/html/functions_0x69.html
+++ b/doc/html/functions_0x69.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,32 +63,32 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
<li>increment_ref_count()
-: <a class="el" href="a00337.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
-: <a class="el" href="a00288.html#a993b789d1e488e0c3929135beae560e">tbb::flow::interface6::graph</a><li>init()
-: <a class="el" href="a00340.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
-: <a class="el" href="a00342.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>input_type
-: <a class="el" href="a00292.html#035196d3c9240ef041f528ebcde8baa7">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00312.html#b2829b518979874ad3d2a939e14ae7bd">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00328.html#af629f26832ff4e476e240637a78bc0c">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00313.html#1e71030845210b6c4c7380eb9e11a2ac">tbb::flow::interface6::queue_node< T, A > [...]
-: <a class="el" href="a00269.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00269.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00269.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00269.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
-: <a class="el" href="a00312.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00313.html#eadcbbb81f9a9d223afabe0f40e77ecb">tbb::flow::interface6::queue_node< T, A ></a>, <a class="el" href="a00263.html#dcbffbae514f4d95205b0845785c0a91">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_reg_succ()
-: <a class="el" href="a00263.html#df21388252b8963e839dca29d2c67ea5">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_rem_succ()
-: <a class="el" href="a00263.html#6b6cf76dff80fd679251da93351c1291">tbb::flow::interface6::buffer_node< T, A ></a><li>interval_t()
-: <a class="el" href="a00350.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
-: <a class="el" href="a00342.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00282.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
-: <a class="el" href="a00337.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a>, <a class="el" href="a00288.html#227ea140dc2c68f79a4e5a34a8367b58">tbb::flow::interface6::graph</a><li>is_divisible()
-: <a class="el" href="a00261.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00260.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00259.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
-: <a class="el" href="a00340.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00282.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
-: <a class="el" href="a00337.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00282.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
-: <a class="el" href="a00337.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer
-: <a class="el" href="a00271.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00334.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
+: <a class="el" href="a00349.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
+: <a class="el" href="a00300.html#a993b789d1e488e0c3929135beae560e">tbb::flow::interface6::graph</a><li>init()
+: <a class="el" href="a00352.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
+: <a class="el" href="a00355.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a>, <a class="el" href="a00350.html#ff36aa5ec1305ca9931396fa608981da">tbb::interface6::task_arena</a><li>input_type
+: <a class="el" href="a00304.html#035196d3c9240ef041f528ebcde8baa7">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00324.html#b2829b518979874ad3d2a939e14ae7bd">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00340.html#af629f26832ff4e476e240637a78bc0c">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00325.html#1e71030845210b6c4c7380eb9e11a2ac">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00281.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00281.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00281.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00281.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward_task()
+: <a class="el" href="a00324.html#9249c25621a6ee7a741a6b7eac710ba4">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00325.html#8eecd6591d7565cbb5b7f1e37bf97979">tbb::flow::interface6::queue_node< T, A ></a>, <a class="el" href="a00275.html#bc6ef82fe9c28ace2ef6b78abb43ffb8">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_reg_succ()
+: <a class="el" href="a00275.html#df21388252b8963e839dca29d2c67ea5">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_rem_succ()
+: <a class="el" href="a00275.html#6b6cf76dff80fd679251da93351c1291">tbb::flow::interface6::buffer_node< T, A ></a><li>interval_t()
+: <a class="el" href="a00363.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
+: <a class="el" href="a00355.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a>, <a class="el" href="a00350.html#11e35391bf67e96f877183659106583d">tbb::interface6::task_arena</a><li>is_bound()
+: <a class="el" href="a00294.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00349.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a>, <a class="el" href="a00300.html#227ea140dc2c68f79a4e5a34a8367b58">tbb::flow::interface6::graph</a><li>is_divisible()
+: <a class="el" href="a00273.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00272.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00271.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00352.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
+: <a class="el" href="a00294.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00349.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
+: <a class="el" href="a00294.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00349.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer
+: <a class="el" href="a00283.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00346.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x6c.html b/doc/html/functions_0x6c.html
index d7befaf..45696d4 100644
--- a/doc/html/functions_0x6c.html
+++ b/doc/html/functions_0x6c.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -61,16 +62,16 @@
Here is a list of all documented class members with links to the class documentation for each member:
<p>
<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
-<li>limiter_node()
-: <a class="el" href="a00292.html#83d3ab884543b070ee5b345a87f241fa">tbb::flow::interface6::limiter_node< T ></a><li>load()
-: <a class="el" href="a00324.html#5f3f6f1683386705a6931acae45f0862">tbb::interface6::runtime_loader</a><li>local()
-: <a class="el" href="a00281.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
-: <a class="el" href="a00333.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00331.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00322.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00318.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00301.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
-: <a class="el" href="a00333.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00318.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
-: <a class="el" href="a00269.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+<li>limiter_node
+: <a class="el" href="a00304.html#83d3ab884543b070ee5b345a87f241fa">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00291.html#3b6d13039c2a8c1e369e5790895b0088">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">tbb::flow::interface6::receiver< T ></a><li>load()
+: <a class="el" href="a00336.html#5f3f6f1683386705a6931acae45f0862">tbb::interface6::runtime_loader</a><li>local()
+: <a class="el" href="a00293.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00345.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00343.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00334.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00330.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00313.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
+: <a class="el" href="a00345.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00330.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
+: <a class="el" href="a00281.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x6d.html b/doc/html/functions_0x6d.html
index 6f5bde3..d972246 100644
--- a/doc/html/functions_0x6d.html
+++ b/doc/html/functions_0x6d.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,16 +63,16 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
<li>make_filter
-: <a class="el" href="a00283.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>malloc_type
-: <a class="el" href="a00343.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>max_size()
-: <a class="el" href="a00343.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00325.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00296.html#beebdb6144df8ba219fadfad4de866ea">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00276.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00269.html#2bce57fe9b594abe1e6 [...]
-: <a class="el" href="a00295.html#2822528265718a4c779591fc37c02ca8">tbb::interface6::memory_pool< Alloc ></a><li>move()
-: <a class="el" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex
-: <a class="el" href="a00301.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00334.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
-: <a class="el" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
+: <a class="el" href="a00295.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>malloc_type
+: <a class="el" href="a00356.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>max_size()
+: <a class="el" href="a00356.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00337.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00308.html#beebdb6144df8ba219fadfad4de866ea">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00288.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00281.html#2bce57fe9b594abe1e6 [...]
+: <a class="el" href="a00307.html#2822528265718a4c779591fc37c02ca8">tbb::interface6::memory_pool< Alloc ></a><li>move()
+: <a class="el" href="a00311.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex
+: <a class="el" href="a00313.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00346.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
+: <a class="el" href="a00311.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x6e.html b/doc/html/functions_0x6e.html
index 43343da..a8e400e 100644
--- a/doc/html/functions_0x6e.html
+++ b/doc/html/functions_0x6e.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,13 +63,13 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
<li>name()
-: <a class="el" href="a00299.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00345.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>native_handle_type
-: <a class="el" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>note_affinity()
-: <a class="el" href="a00337.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
-: <a class="el" href="a00349.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
+: <a class="el" href="a00311.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00358.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>native_handle_type
+: <a class="el" href="a00334.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00313.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>note_affinity()
+: <a class="el" href="a00349.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
+: <a class="el" href="a00362.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x6f.html b/doc/html/functions_0x6f.html
index 990f9a0..acd86e7 100644
--- a/doc/html/functions_0x6f.html
+++ b/doc/html/functions_0x6f.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,21 +63,21 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
<li>object_may_be_null()
-: <a class="el" href="a00282.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
-: <a class="el" href="a00270.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00272.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
-: <a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00282.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00271.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
-: <a class="el" href="a00350.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator+=()
-: <a class="el" href="a00350.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-
-: <a class="el" href="a00349.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00350.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>operator-=()
-: <a class="el" href="a00350.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00270.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00272.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00276.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00273.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00269.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00276.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a><li>output_type
-: <a class="el" href="a00292.html#6e67fc480147c0b88a483b85db6457b0">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00312.html#2cb099b590246b6bc93cc15e78c6ee5c">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00328.html#ca026eaef70e35791c407323199031a7">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00313.html#25b5a53ab1f9a342644fa3759bc0b1ad">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00294.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
+: <a class="el" href="a00282.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00284.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00358.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
+: <a class="el" href="a00294.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00283.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
+: <a class="el" href="a00363.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator+=()
+: <a class="el" href="a00363.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-
+: <a class="el" href="a00362.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00363.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>operator-=()
+: <a class="el" href="a00363.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
+: <a class="el" href="a00282.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00284.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00288.html#85cc876b1dec457b831b4745be274be1">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00285.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00281.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00288.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a><li>output_type
+: <a class="el" href="a00304.html#6e67fc480147c0b88a483b85db6457b0">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00324.html#2cb099b590246b6bc93cc15e78c6ee5c">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00340.html#ca026eaef70e35791c407323199031a7">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00325.html#25b5a53ab1f9a342644fa3759bc0b1ad">tbb::flow::interface6::queue_node< T, A > [...]
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x70.html b/doc/html/functions_0x70.html
index f754b72..937e4e4 100644
--- a/doc/html/functions_0x70.html
+++ b/doc/html/functions_0x70.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,26 +63,26 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
<li>page_range_type
-: <a class="el" href="a00261.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
-: <a class="el" href="a00261.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
-: <a class="el" href="a00308.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
-: <a class="el" href="a00337.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00256.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
-: <a class="el" href="a00310.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00268.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
-: <a class="el" href="a00341.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00275.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>predecessor_type
-: <a class="el" href="a00292.html#f89fcf44f38eb33f965ee5362d3e68e9">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00312.html#fdea783bf9d5a4c98e794ac7e0f84ccf">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00328.html#8127e36811832563fe1e9bc3ba391f79">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00313.html#5e2fdd33c45d44549dee9c1638e19898">tbb::flow::interface6::queue_node< T, A > [...]
-: <a class="el" href="a00340.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
-: <a class="el" href="a00312.html#17a4f66e23d54100b64805405e905d62">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a><li>process()
-: <a class="el" href="a00252.html#ccd88bf4333dc100ba97da8e2170277d">tbb::interface6::aggregator_ext< handler_type ></a><li>process_item()
-: <a class="el" href="a00348.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00268.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
-: <a class="el" href="a00341.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00276.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00275.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00273.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
+: <a class="el" href="a00273.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00320.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
+: <a class="el" href="a00349.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
+: <a class="el" href="a00268.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00322.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
+: <a class="el" href="a00280.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00354.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
+: <a class="el" href="a00287.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>predecessor_type
+: <a class="el" href="a00304.html#f89fcf44f38eb33f965ee5362d3e68e9">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00324.html#fdea783bf9d5a4c98e794ac7e0f84ccf">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00340.html#8127e36811832563fe1e9bc3ba391f79">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00325.html#5e2fdd33c45d44549dee9c1638e19898">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00352.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
+: <a class="el" href="a00324.html#17a4f66e23d54100b64805405e905d62">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a><li>process()
+: <a class="el" href="a00264.html#ccd88bf4333dc100ba97da8e2170277d">tbb::interface6::aggregator_ext< handler_type ></a><li>process_item()
+: <a class="el" href="a00361.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
+: <a class="el" href="a00280.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
+: <a class="el" href="a00354.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00288.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00287.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x71.html b/doc/html/functions_0x71.html
index ea52877..e49ac8d 100644
--- a/doc/html/functions_0x71.html
+++ b/doc/html/functions_0x71.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,12 +63,12 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_q">- q -</a></h3><ul>
<li>queue_node()
-: <a class="el" href="a00313.html#0226762d9ebba28311b7b1518d948ab1">tbb::flow::interface6::queue_node< T, A ></a><li>queuing_mutex()
-: <a class="el" href="a00314.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
-: <a class="el" href="a00316.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
+: <a class="el" href="a00325.html#0226762d9ebba28311b7b1518d948ab1">tbb::flow::interface6::queue_node< T, A ></a><li>queuing_mutex()
+: <a class="el" href="a00326.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
+: <a class="el" href="a00328.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x72.html b/doc/html/functions_0x72.html
index f3b1ee4..905a162 100644
--- a/doc/html/functions_0x72.html
+++ b/doc/html/functions_0x72.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,38 +63,40 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
<li>range()
-: <a class="el" href="a00281.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00276.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
-: <a class="el" href="a00318.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>ready
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recursive_mutex()
-: <a class="el" href="a00322.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>recycle_as_child_of()
-: <a class="el" href="a00337.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
-: <a class="el" href="a00337.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
-: <a class="el" href="a00337.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
-: <a class="el" href="a00337.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>reexecute
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>ref_count()
-: <a class="el" href="a00337.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>reference
-: <a class="el" href="a00268.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>register_pending_exception()
-: <a class="el" href="a00340.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
-: <a class="el" href="a00292.html#de70a0e88ce7655d8c14b6af57f7496f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00279.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver< T ></a><li>register_successor()
-: <a class="el" href="a00292.html#c76561d8d871b4769876988a4de12a9b">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00263.html#f8bf4944ede4fc106423d67715beb695">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00262.html#fd0324c9ddb51fe6f95b3d015d338941">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00330.html#22960d499df9f1569a9d8a544e35afe3">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
-: <a class="el" href="a00269.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00334.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00317.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00315.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00292.html#c530e7b469454e2340460795f2da3317">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00279.html#cb691b18416d4742265aed84d496ebbd">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver< T ></a><li>remove_successor()
-: <a class="el" href="a00292.html#275e328063c121b3e506ccef2a825d28">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00263.html#2074da0e39b9477c32897d6e5786196f">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00262.html#366efcc046ec08a104281109801ae629">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00330.html#222484bf295f39df36415a29e508e5c9">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
-: <a class="el" href="a00276.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00276.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
-: <a class="el" href="a00340.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00276.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
-: <a class="el" href="a00288.html#7f4e3ae90811a5d8b597146b5b586d10">tbb::flow::interface6::graph</a><li>row_range_type
-: <a class="el" href="a00260.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
-: <a class="el" href="a00261.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00260.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
-: <a class="el" href="a00310.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00308.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00288.html#c1145b00e063793a7e7bf994d202c7a0">tbb::flow::interface6::graph</a><li>runtime_loader()
-: <a class="el" href="a00324.html#7ae5330beb48fce0c702c32a5df0094a">tbb::interface6::runtime_loader</a></ul>
+: <a class="el" href="a00293.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00288.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00330.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>ready
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recursive_mutex()
+: <a class="el" href="a00334.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
+: <a class="el" href="a00349.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
+: <a class="el" href="a00349.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
+: <a class="el" href="a00349.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_enqueue()
+: <a class="el" href="a00349.html#076120a15237d1ee63060c992e878b29">tbb::task</a><li>recycle_to_reexecute()
+: <a class="el" href="a00349.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>reexecute
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>ref_count()
+: <a class="el" href="a00349.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>reference
+: <a class="el" href="a00280.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>register_pending_exception()
+: <a class="el" href="a00352.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
+: <a class="el" href="a00304.html#de70a0e88ce7655d8c14b6af57f7496f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00291.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver< T ></a><li>register_successor()
+: <a class="el" href="a00304.html#c76561d8d871b4769876988a4de12a9b">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00275.html#f8bf4944ede4fc106423d67715beb695">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00274.html#fd0324c9ddb51fe6f95b3d015d338941">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00342.html#22960d499df9f1569a9d8a544e35afe3">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00281.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00346.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00329.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00327.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00304.html#c530e7b469454e2340460795f2da3317">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00291.html#cb691b18416d4742265aed84d496ebbd">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver< T ></a><li>remove_successor()
+: <a class="el" href="a00304.html#275e328063c121b3e506ccef2a825d28">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00275.html#2074da0e39b9477c32897d6e5786196f">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00274.html#366efcc046ec08a104281109801ae629">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00342.html#222484bf295f39df36415a29e508e5c9">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00288.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00288.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00352.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a>, <a class="el" href="a00342.html#d751cdda02bdaa1dc90c4d9609c05df2">tbb::flow::interface6::source_node< Output ></a><li>resize()
+: <a class="el" href="a00288.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>resolution()
+: <a class="el" href="a00362.html#8aaa5ac47975a1b0fa3e95752281159e">tbb::tick_count</a><li>root_task()
+: <a class="el" href="a00300.html#7f4e3ae90811a5d8b597146b5b586d10">tbb::flow::interface6::graph</a><li>row_range_type
+: <a class="el" href="a00272.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
+: <a class="el" href="a00273.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00272.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00322.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00320.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00300.html#c1145b00e063793a7e7bf994d202c7a0">tbb::flow::interface6::graph</a><li>run_and_put_task
+: <a class="el" href="a00304.html#621bab40a858d214db69ef08d88b67c1">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00275.html#621bab40a858d214db69ef08d88b67c1">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00274.html#621bab40a858d214db69ef08d88b67c1">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00291.html#621bab40a858d214db69ef08d88b67c1">tbb::flow::interface6::continue_receiver</a>, <a class="el" href=" [...]
+: <a class="el" href="a00336.html#7ae5330beb48fce0c702c32a5df0094a">tbb::interface6::runtime_loader</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x73.html b/doc/html/functions_0x73.html
index 93d374e..d4516be 100644
--- a/doc/html/functions_0x73.html
+++ b/doc/html/functions_0x73.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,35 +63,35 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
<li>scoped_lock()
-: <a class="el" href="a00334.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00319.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00317.html#fbb8798792d3aebb136c46fc63d [...]
-: <a class="el" href="a00320.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
-: <a class="el" href="a00350.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
-: <a class="el" href="a00337.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
-: <a class="el" href="a00328.html#b38e7a070552960384bcc1d91af13a5c">tbb::flow::interface6::sequencer_node< T, A ></a><li>set_affinity()
-: <a class="el" href="a00337.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00268.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
-: <a class="el" href="a00337.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_parent()
-: <a class="el" href="a00337.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">tbb::task</a><li>set_priority()
-: <a class="el" href="a00340.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
-: <a class="el" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
-: <a class="el" href="a00301.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
-: <a class="el" href="a00276.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
-: <a class="el" href="a00281.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00273.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T, [...]
-: <a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>source_node()
-: <a class="el" href="a00330.html#adaac111fbcace95804219a5f2929304">tbb::flow::interface6::source_node< Output ></a><li>spawn_and_wait_for_all()
-: <a class="el" href="a00337.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
-: <a class="el" href="a00337.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
-: <a class="el" href="a00331.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
-: <a class="el" href="a00333.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
-: <a class="el" href="a00337.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>state_type
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status()
-: <a class="el" href="a00324.html#78d938ed2e54d38dd38d6609e6c60389">tbb::interface6::runtime_loader</a><li>status_t
-: <a class="el" href="a00318.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a><li>successor_type
-: <a class="el" href="a00292.html#e8945e4dd6ea759ff9e4735da13f12ef">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00312.html#09ab5064ca8192e68c03da47603e68eb">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00328.html#795f3ee75f133b9d3b159172fc4a197f">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00313.html#f35076a19f256f9e7a61bed77ca1ccc5">tbb::flow::interface6::queue_node< T, A > [...]
-: <a class="el" href="a00276.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00273.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00269.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00346.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00331.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00329.html#fbb8798792d3aebb136c46fc63d [...]
+: <a class="el" href="a00332.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
+: <a class="el" href="a00363.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
+: <a class="el" href="a00349.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
+: <a class="el" href="a00340.html#b38e7a070552960384bcc1d91af13a5c">tbb::flow::interface6::sequencer_node< T, A ></a><li>set_affinity()
+: <a class="el" href="a00349.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
+: <a class="el" href="a00280.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
+: <a class="el" href="a00349.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_parent()
+: <a class="el" href="a00349.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">tbb::task</a><li>set_priority()
+: <a class="el" href="a00352.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
+: <a class="el" href="a00349.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
+: <a class="el" href="a00313.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
+: <a class="el" href="a00288.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00293.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00285.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T, [...]
+: <a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>source_node()
+: <a class="el" href="a00342.html#adaac111fbcace95804219a5f2929304">tbb::flow::interface6::source_node< Output ></a><li>spawn_and_wait_for_all()
+: <a class="el" href="a00349.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
+: <a class="el" href="a00349.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
+: <a class="el" href="a00343.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
+: <a class="el" href="a00345.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
+: <a class="el" href="a00349.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>state_type
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status()
+: <a class="el" href="a00336.html#78d938ed2e54d38dd38d6609e6c60389">tbb::interface6::runtime_loader</a><li>status_t
+: <a class="el" href="a00330.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a><li>successor_type
+: <a class="el" href="a00304.html#e8945e4dd6ea759ff9e4735da13f12ef">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00324.html#09ab5064ca8192e68c03da47603e68eb">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00340.html#795f3ee75f133b9d3b159172fc4a197f">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00325.html#f35076a19f256f9e7a61bed77ca1ccc5">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00288.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00285.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00281.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x74.html b/doc/html/functions_0x74.html
index 6e9c379..f866e03 100644
--- a/doc/html/functions_0x74.html
+++ b/doc/html/functions_0x74.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,27 +63,29 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
<li>task()
-: <a class="el" href="a00337.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
-: <a class="el" href="a00340.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
-: <a class="el" href="a00341.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
-: <a class="el" href="a00342.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
-: <a class="el" href="a00342.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00346.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00299.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00345.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
-: <a class="el" href="a00349.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
-: <a class="el" href="a00334.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00317.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00315.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
-: <a class="el" href="a00263.html#8ef07c434eb763d947a7b4e80c086a49">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00330.html#2c7fcc29e2894b29138be3c1edce9bc9">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00327.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a><li>try_get()
-: <a class="el" href="a00263.html#aeb8aec46ca99ca022356a792c46735e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00330.html#41073ad4d3510ed5a8b6bda9c0f58636">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00327.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a><li>try_lock()
-: <a class="el" href="a00333.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00331.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00322.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00318.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00301.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
-: <a class="el" href="a00333.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00318.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
-: <a class="el" href="a00268.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
-: <a class="el" href="a00348.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00268.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
-: <a class="el" href="a00292.html#55a02d458a4d8ffa6accd7a70605da2f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00263.html#2b02fe332e704bbe14f297802298b63a">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00262.html#29eb768c10b377880bbf83d31ee49acf">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00279.html#3969c70fb89c0a982f142ae9eb5facae">tbb::flow::interface6::continue_receiver</a>, <a class="el" href=" [...]
-: <a class="el" href="a00263.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00330.html#494678baf9096835268736b800824460">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00327.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a><li>try_reserve()
-: <a class="el" href="a00263.html#1cc889bb6c38bcb81757d0ebbc3a5e64">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00330.html#ad459713ff3c1c9ad0f4826daa141f65">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00327.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a></ul>
+: <a class="el" href="a00349.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_arena()
+: <a class="el" href="a00350.html#27ac2706e3f2a989487ba7944b07cb94">tbb::interface6::task_arena</a><li>task_group_context()
+: <a class="el" href="a00352.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
+: <a class="el" href="a00354.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
+: <a class="el" href="a00355.html#5dbd23c83603b3b09dffa7982112cc95">tbb::task_scheduler_init</a><li>terminate()
+: <a class="el" href="a00355.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a>, <a class="el" href="a00350.html#ee3f3f736da03bfe8b82acfa822624a6">tbb::interface6::task_arena</a><li>throw_self()
+: <a class="el" href="a00359.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00311.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00358.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00362.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
+: <a class="el" href="a00346.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00329.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00327.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
+: <a class="el" href="a00275.html#8ef07c434eb763d947a7b4e80c086a49">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00342.html#2c7fcc29e2894b29138be3c1edce9bc9">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00339.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a><li>try_get()
+: <a class="el" href="a00275.html#aeb8aec46ca99ca022356a792c46735e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00342.html#41073ad4d3510ed5a8b6bda9c0f58636">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00339.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a><li>try_lock()
+: <a class="el" href="a00345.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00343.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00334.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00330.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00313.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
+: <a class="el" href="a00345.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00330.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
+: <a class="el" href="a00280.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
+: <a class="el" href="a00361.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
+: <a class="el" href="a00280.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
+: <a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">tbb::flow::interface6::receiver< T ></a><li>try_put_task()
+: <a class="el" href="a00304.html#ca2ff9f3379b8b5a3de2ababbca4a476">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00275.html#84d939049fa8c3205aec91ced0980e03">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00274.html#b4804d99e0fb0576f1061ab7269e5939">tbb::flow::interface6::broadcast_node< T ></a><li>try_release()
+: <a class="el" href="a00275.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00342.html#494678baf9096835268736b800824460">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00339.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a><li>try_reserve()
+: <a class="el" href="a00275.html#1cc889bb6c38bcb81757d0ebbc3a5e64">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00342.html#ad459713ff3c1c9ad0f4826daa141f65">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00339.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x75.html b/doc/html/functions_0x75.html
index 8ba813c..21f2dc2 100644
--- a/doc/html/functions_0x75.html
+++ b/doc/html/functions_0x75.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,12 +63,12 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
<li>unlock()
-: <a class="el" href="a00333.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00331.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00322.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00318.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00301.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00274.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
-: <a class="el" href="a00334.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00317.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00345.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00343.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00334.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00330.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00313.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
+: <a class="el" href="a00286.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00346.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00329.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x76.html b/doc/html/functions_0x76.html
index 6dbc36c..a5812d2 100644
--- a/doc/html/functions_0x76.html
+++ b/doc/html/functions_0x76.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,10 +63,10 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_v">- v -</a></h3><ul>
<li>value_type
-: <a class="el" href="a00308.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00268.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" [...]
+: <a class="el" href="a00320.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00280.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" [...]
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x77.html b/doc/html/functions_0x77.html
index 6d15f6d..b0d8b44 100644
--- a/doc/html/functions_0x77.html
+++ b/doc/html/functions_0x77.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,11 +63,12 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
<li>wait_for_all()
-: <a class="el" href="a00337.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">tbb::flow::interface6::graph</a><li>what()
-: <a class="el" href="a00299.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00345.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00349.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00300.html#a66b0020f7514b86d030fa8aea073d37">tbb::flow::interface6::graph</a><li>wait_until_empty()
+: <a class="el" href="a00350.html#776e73ba196e5bbb8b8ed489fc2b77d3">tbb::interface6::task_arena</a><li>what()
+: <a class="el" href="a00311.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00358.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_0x7e.html b/doc/html/functions_0x7e.html
index 9220fce..a95cf04 100644
--- a/doc/html/functions_0x7e.html
+++ b/doc/html/functions_0x7e.html
@@ -33,7 +33,8 @@
</div>
<div class="tabs">
<ul>
- <li><a href="functions.html#index_a"><span>a</span></a></li>
+ <li><a href="functions.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
<li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
<li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
<li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
@@ -62,34 +63,34 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
<li>~combinable()
-: <a class="el" href="a00267.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00268.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00269.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00274.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00276.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00272.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
-: <a class="el" href="a00279.html#1e14828fa079b9835ff7267df5ee45d7">tbb::flow::interface6::continue_receiver</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00281.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00282.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
-: <a class="el" href="a00288.html#8a7d424c0616a1c37a908ead182e2fe5">tbb::flow::interface6::graph</a><li>~memory_pool()
-: <a class="el" href="a00295.html#fdad7c4ed08332ec384491a71b721957">tbb::interface6::memory_pool< Alloc ></a><li>~parallel_while()
-: <a class="el" href="a00308.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
-: <a class="el" href="a00310.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
-: <a class="el" href="a00316.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
-: <a class="el" href="a00318.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
-: <a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">tbb::flow::interface6::receiver< T ></a><li>~runtime_loader()
-: <a class="el" href="a00324.html#c25fec923a751a3e03f5cbe969f1f0c5">tbb::interface6::runtime_loader</a><li>~scoped_lock()
-: <a class="el" href="a00334.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00319.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00317.html#32c7d67a660d23ebbaab1a1d282 [...]
-: <a class="el" href="a00320.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
-: <a class="el" href="a00328.html#93d3d8f6a72b3e1387047282116ed6ee">tbb::flow::interface6::sequencer_node< T, A ></a><li>~source_node()
-: <a class="el" href="a00330.html#61700b0865fc17188b0abe26bbde65b6">tbb::flow::interface6::source_node< Output ></a><li>~spin_rw_mutex_v3()
-: <a class="el" href="a00333.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
-: <a class="el" href="a00337.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
-: <a class="el" href="a00341.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
-: <a class="el" href="a00342.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00279.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00280.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00281.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00286.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00288.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00284.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
+: <a class="el" href="a00291.html#1e14828fa079b9835ff7267df5ee45d7">tbb::flow::interface6::continue_receiver</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00293.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00294.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
+: <a class="el" href="a00300.html#8a7d424c0616a1c37a908ead182e2fe5">tbb::flow::interface6::graph</a><li>~memory_pool()
+: <a class="el" href="a00307.html#fdad7c4ed08332ec384491a71b721957">tbb::interface6::memory_pool< Alloc ></a><li>~parallel_while()
+: <a class="el" href="a00320.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
+: <a class="el" href="a00322.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
+: <a class="el" href="a00328.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
+: <a class="el" href="a00330.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
+: <a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">tbb::flow::interface6::receiver< T ></a><li>~runtime_loader()
+: <a class="el" href="a00336.html#c25fec923a751a3e03f5cbe969f1f0c5">tbb::interface6::runtime_loader</a><li>~scoped_lock()
+: <a class="el" href="a00346.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00331.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00329.html#32c7d67a660d23ebbaab1a1d282 [...]
+: <a class="el" href="a00332.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
+: <a class="el" href="a00340.html#93d3d8f6a72b3e1387047282116ed6ee">tbb::flow::interface6::sequencer_node< T, A ></a><li>~source_node()
+: <a class="el" href="a00342.html#61700b0865fc17188b0abe26bbde65b6">tbb::flow::interface6::source_node< Output ></a><li>~spin_rw_mutex_v3()
+: <a class="el" href="a00345.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
+: <a class="el" href="a00349.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_arena()
+: <a class="el" href="a00350.html#fec24e9b3fa07a6e7b20add7c7e0a660">tbb::interface6::task_arena</a><li>~task_list()
+: <a class="el" href="a00354.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_enum.html b/doc/html/functions_enum.html
index 3adb98c..a5180a5 100644
--- a/doc/html/functions_enum.html
+++ b/doc/html/functions_enum.html
@@ -35,14 +35,14 @@
<p>
<ul>
<li>error_code
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader</a><li>error_mode
-: <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader</a><li>malloc_type
-: <a class="el" href="a00343.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>state_type
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
-: <a class="el" href="a00318.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a></ul>
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader</a><li>error_mode
+: <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader</a><li>malloc_type
+: <a class="el" href="a00356.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>state_type
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
+: <a class="el" href="a00330.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_eval.html b/doc/html/functions_eval.html
index 2e4b60e..75195f9 100644
--- a/doc/html/functions_eval.html
+++ b/doc/html/functions_eval.html
@@ -34,25 +34,25 @@
<p>
<ul>
-<li>allocated
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>ec_bad_arg
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">tbb::interface6::runtime_loader</a><li>ec_bad_call
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">tbb::interface6::runtime_loader</a><li>ec_bad_lib
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">tbb::interface6::runtime_loader</a><li>ec_bad_ver
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">tbb::interface6::runtime_loader</a><li>ec_no_lib
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">tbb::interface6::runtime_loader</a><li>ec_ok
-: <a class="el" href="a00324.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">tbb::interface6::runtime_loader</a><li>em_abort
-: <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">tbb::interface6::runtime_loader</a><li>em_status
-: <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">tbb::interface6::runtime_loader</a><li>em_throw
-: <a class="el" href="a00324.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">tbb::interface6::runtime_loader</a><li>executing
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a><li>freed
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>ready
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recycle
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>reexecute
-: <a class="el" href="a00337.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a></ul>
+<li>__TBB_RECYCLE_TO_ENQUEUE
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e2a3f84c7721f6c0b859a91a5ecc660c4">tbb::task</a><li>allocated
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>ec_bad_arg
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">tbb::interface6::runtime_loader</a><li>ec_bad_call
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">tbb::interface6::runtime_loader</a><li>ec_bad_lib
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">tbb::interface6::runtime_loader</a><li>ec_bad_ver
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">tbb::interface6::runtime_loader</a><li>ec_no_lib
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">tbb::interface6::runtime_loader</a><li>ec_ok
+: <a class="el" href="a00336.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">tbb::interface6::runtime_loader</a><li>em_abort
+: <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">tbb::interface6::runtime_loader</a><li>em_status
+: <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">tbb::interface6::runtime_loader</a><li>em_throw
+: <a class="el" href="a00336.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">tbb::interface6::runtime_loader</a><li>executing
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a><li>freed
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>ready
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>reexecute
+: <a class="el" href="a00349.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html
index ad36560..5e2f0d5 100644
--- a/doc/html/functions_func.html
+++ b/doc/html/functions_func.html
@@ -61,21 +61,21 @@
<p>
<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
<li>abort()
-: <a class="el" href="a00268.html#86c77a6c1317239405968f5afc7b10d3">tbb::concurrent_bounded_queue< T, A ></a><li>acquire()
-: <a class="el" href="a00334.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00317.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00315.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
-: <a class="el" href="a00330.html#4b647e4a93d08ccdd8d323279e4eaaa6">tbb::flow::interface6::source_node< Output ></a><li>add()
-: <a class="el" href="a00308.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00307.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
-: <a class="el" href="a00310.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
-: <a class="el" href="a00337.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>allocate()
-: <a class="el" href="a00346.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00343.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00325.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00296.html#365bd64d284c80d85bb2149a12681526">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00264.html#4cdeea67af6c1fcd8f1d5e9 [...]
-: <a class="el" href="a00337.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
-: <a class="el" href="a00337.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
-: <a class="el" href="a00337.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>assign()
-: <a class="el" href="a00276.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00276.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00280.html#86c77a6c1317239405968f5afc7b10d3">tbb::concurrent_bounded_queue< T, A ></a><li>acquire()
+: <a class="el" href="a00346.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00329.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00327.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00342.html#4b647e4a93d08ccdd8d323279e4eaaa6">tbb::flow::interface6::source_node< Output ></a><li>add()
+: <a class="el" href="a00320.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00319.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
+: <a class="el" href="a00322.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
+: <a class="el" href="a00349.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>allocate()
+: <a class="el" href="a00359.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00356.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00337.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00308.html#365bd64d284c80d85bb2149a12681526">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00276.html#4cdeea67af6c1fcd8f1d5e9 [...]
+: <a class="el" href="a00349.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
+: <a class="el" href="a00349.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
+: <a class="el" href="a00349.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>assign()
+: <a class="el" href="a00288.html#c04d64fe86696a084afa117d34384b5f">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00288.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x62.html b/doc/html/functions_func_0x62.html
index fc5b63f..9c20c3f 100644
--- a/doc/html/functions_func_0x62.html
+++ b/doc/html/functions_func_0x62.html
@@ -61,14 +61,14 @@
<p>
<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
<li>back()
-: <a class="el" href="a00276.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00288.html#f63c3b7d03098b57fc16b71c57b303e5">tbb::flow::interface6::graph</a>, <a class="el" href="a00281.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00259.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00253 [...]
-: <a class="el" href="a00259.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00269.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
-: <a class="el" href="a00263.html#03ad7b85a8341437f584af06ad050cdc">tbb::flow::interface6::buffer_node< T, A ></a></ul>
+: <a class="el" href="a00288.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00300.html#f63c3b7d03098b57fc16b71c57b303e5">tbb::flow::interface6::graph</a>, <a class="el" href="a00293.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00271.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00265 [...]
+: <a class="el" href="a00271.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00281.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
+: <a class="el" href="a00275.html#03ad7b85a8341437f584af06ad050cdc">tbb::flow::interface6::buffer_node< T, A ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x63.html b/doc/html/functions_func_0x63.html
index 20e2186..f0f86b1 100644
--- a/doc/html/functions_func_0x63.html
+++ b/doc/html/functions_func_0x63.html
@@ -61,30 +61,31 @@
<p>
<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
<li>cancel_group_execution()
-: <a class="el" href="a00337.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00340.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00276.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
-: <a class="el" href="a00288.html#e183dfc3f89dc8f57c06ba165fb89f66">tbb::flow::interface6::graph</a>, <a class="el" href="a00276.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00288.html#4866156e6a31d0399b61c6eb82ee81fd">tbb::flow::interface6::graph</a>, <a class="el" href="a00276.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
-: <a class="el" href="a00337.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
-: <a class="el" href="a00341.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00310.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00281.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#90b31e2954c6e4596c7900435a5f [...]
-: <a class="el" href="a00261.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00260.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00276.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
-: <a class="el" href="a00268.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00269.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
-: <a class="el" href="a00273.html#c8b20e7430c5302936030bef59a562be">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
-: <a class="el" href="a00275.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00274.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00276.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00272.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
-: <a class="el" href="a00343.html#15c431ccb5ccc5a30e5d496edad4c143">tbb::tbb_allocator< T ></a>, <a class="el" href="a00296.html#3491a81e0597c1696a163e7c8fa8706a">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00264.html#48a7e49dfb0578edc84a90a5ac30793d">tbb::cache_aligned_allocator< T ></a><li>context()
-: <a class="el" href="a00337.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_node()
-: <a class="el" href="a00278.html#869562787fcb5c57a90aea120f26d492">tbb::flow::interface6::continue_node< Output ></a><li>continue_receiver()
-: <a class="el" href="a00279.html#a0b292ed7fa6556b2a735f6d1e82dc74">tbb::flow::interface6::continue_receiver</a><li>count()
-: <a class="el" href="a00269.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00276.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00276.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00349.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00352.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
+: <a class="el" href="a00288.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00300.html#e183dfc3f89dc8f57c06ba165fb89f66">tbb::flow::interface6::graph</a>, <a class="el" href="a00288.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00300.html#4866156e6a31d0399b61c6eb82ee81fd">tbb::flow::interface6::graph</a>, <a class="el" href="a00288.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
+: <a class="el" href="a00349.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
+: <a class="el" href="a00354.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00322.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00293.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00273.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00272.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00288.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00280.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00281.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
+: <a class="el" href="a00285.html#c8b20e7430c5302936030bef59a562be">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
+: <a class="el" href="a00287.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00286.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00288.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00284.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
+: <a class="el" href="a00356.html#3999cb92a8b6a995b65ee9ae5c31751f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00308.html#c6d3fa3032bf5d4be841729d7893e26d">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00276.html#273d07524d386efc1366bf37af5f91f4">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00349.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_node()
+: <a class="el" href="a00290.html#869562787fcb5c57a90aea120f26d492">tbb::flow::interface6::continue_node< Output ></a><li>continue_receiver()
+: <a class="el" href="a00291.html#a0b292ed7fa6556b2a735f6d1e82dc74">tbb::flow::interface6::continue_receiver</a><li>count()
+: <a class="el" href="a00281.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00288.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00288.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a><li>current_slot()
+: <a class="el" href="a00350.html#e734de6a5f4a0bd4461c0cbdaa29b6ce">tbb::interface6::task_arena</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x64.html b/doc/html/functions_func_0x64.html
index accd1e1..5948b5b 100644
--- a/doc/html/functions_func_0x64.html
+++ b/doc/html/functions_func_0x64.html
@@ -61,15 +61,14 @@
<p>
<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
<li>deallocate()
-: <a class="el" href="a00343.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00325.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00296.html#4e24a03de38638af07548383024c54ab">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00264.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
-: <a class="el" href="a00337.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
-: <a class="el" href="a00288.html#29b85506870f13a884a21655aec2a65d">tbb::flow::interface6::graph</a><li>default_num_threads()
-: <a class="el" href="a00342.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00346.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00299.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00345.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00337.html#dfaacf92685e5f86393bf657b2853bf8">tbb::task</a><li>d [...]
-: <a class="el" href="a00334.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00317.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00356.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00337.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00308.html#4e24a03de38638af07548383024c54ab">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00276.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00349.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
+: <a class="el" href="a00300.html#29b85506870f13a884a21655aec2a65d">tbb::flow::interface6::graph</a><li>destroy()
+: <a class="el" href="a00359.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00311.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00358.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00349.html#dfaacf92685e5f86393bf657b2853bf8">tbb::task</a><li>d [...]
+: <a class="el" href="a00346.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00329.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x65.html b/doc/html/functions_func_0x65.html
index 59f24b5..1faa242 100644
--- a/doc/html/functions_func_0x65.html
+++ b/doc/html/functions_func_0x65.html
@@ -61,17 +61,17 @@
<p>
<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
<li>empty()
-: <a class="el" href="a00341.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00281.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.htm [...]
-: <a class="el" href="a00288.html#907bd06606818c36f52420fe8d469d35">tbb::flow::interface6::graph</a>, <a class="el" href="a00281.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00259.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00253 [...]
-: <a class="el" href="a00337.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
-: <a class="el" href="a00281.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00269.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
-: <a class="el" href="a00269.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
-: <a class="el" href="a00337.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00279.html#40ca8b7e96c5bc3428b4d1e409725ee5">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00251.html#641c8dc43652589d12eefaef130c094d">tbb::interface6::aggregator</a><li>execute_impl()
-: <a class="el" href="a00252.html#fdd0a9ce522246b9e14ae5e44bc72d31">tbb::interface6::aggregator_ext< handler_type ></a></ul>
+: <a class="el" href="a00354.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00293.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.htm [...]
+: <a class="el" href="a00300.html#907bd06606818c36f52420fe8d469d35">tbb::flow::interface6::graph</a>, <a class="el" href="a00293.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00271.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00265 [...]
+: <a class="el" href="a00350.html#780277a89e35868abdec843fecaa2237">tbb::interface6::task_arena</a>, <a class="el" href="a00349.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
+: <a class="el" href="a00293.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00281.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
+: <a class="el" href="a00281.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00350.html#082803bb20347e64fed2c11db8e9670e">tbb::interface6::task_arena</a>, <a class="el" href="a00349.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00291.html#2165b726212975be532cff7b2f001834">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00263.html#641c8dc43652589d12eefaef130c094d">tbb::interface6::aggregator</a><li>execute_impl()
+: <a class="el" href="a00264.html#fdd0a9ce522246b9e14ae5e44bc72d31">tbb::interface6::aggregator_ext< handler_type ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x66.html b/doc/html/functions_func_0x66.html
index 8ea4b35..ce669c8 100644
--- a/doc/html/functions_func_0x66.html
+++ b/doc/html/functions_func_0x66.html
@@ -61,14 +61,14 @@
<p>
<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
<li>finalize()
-: <a class="el" href="a00282.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00269.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
-: <a class="el" href="a00263.html#2648324ce0a38b40132b8502ef250e3a">tbb::flow::interface6::buffer_node< T, A ></a><li>front()
-: <a class="el" href="a00276.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
-: <a class="el" href="a00287.html#01055081ed477714503820035db3a965">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, <a class="el" href="a00286.html#d5132323fd2ac6a00ea0c78beda78723">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></ul>
+: <a class="el" href="a00294.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00281.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward_task()
+: <a class="el" href="a00275.html#8954338d1a7740f9be80455ba27e8eed">tbb::flow::interface6::buffer_node< T, A ></a><li>front()
+: <a class="el" href="a00288.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
+: <a class="el" href="a00299.html#01055081ed477714503820035db3a965">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, <a class="el" href="a00298.html#d5132323fd2ac6a00ea0c78beda78723">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x67.html b/doc/html/functions_func_0x67.html
index b02d40d..f5798b4 100644
--- a/doc/html/functions_func_0x67.html
+++ b/doc/html/functions_func_0x67.html
@@ -61,16 +61,16 @@
<p>
<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
<li>get_allocator()
-: <a class="el" href="a00276.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
-: <a class="el" href="a00259.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
-: <a class="el" href="a00288.html#104d4f3775f596b43177c29e6b7b7656">tbb::flow::interface6::graph</a><li>group()
-: <a class="el" href="a00337.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
-: <a class="el" href="a00337.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
-: <a class="el" href="a00276.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
-: <a class="el" href="a00276.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00288.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
+: <a class="el" href="a00271.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
+: <a class="el" href="a00300.html#104d4f3775f596b43177c29e6b7b7656">tbb::flow::interface6::graph</a><li>group()
+: <a class="el" href="a00349.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
+: <a class="el" href="a00349.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
+: <a class="el" href="a00288.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00288.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x69.html b/doc/html/functions_func_0x69.html
index 3072e1b..e092979 100644
--- a/doc/html/functions_func_0x69.html
+++ b/doc/html/functions_func_0x69.html
@@ -61,31 +61,31 @@
<p>
<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
<li>increment_ref_count()
-: <a class="el" href="a00337.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
-: <a class="el" href="a00288.html#a993b789d1e488e0c3929135beae560e">tbb::flow::interface6::graph</a><li>init()
-: <a class="el" href="a00340.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
-: <a class="el" href="a00342.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
-: <a class="el" href="a00269.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00269.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00269.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00269.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
-: <a class="el" href="a00312.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00313.html#eadcbbb81f9a9d223afabe0f40e77ecb">tbb::flow::interface6::queue_node< T, A ></a>, <a class="el" href="a00263.html#dcbffbae514f4d95205b0845785c0a91">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_reg_succ()
-: <a class="el" href="a00263.html#df21388252b8963e839dca29d2c67ea5">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_rem_succ()
-: <a class="el" href="a00263.html#6b6cf76dff80fd679251da93351c1291">tbb::flow::interface6::buffer_node< T, A ></a><li>interval_t()
-: <a class="el" href="a00350.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
-: <a class="el" href="a00342.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00282.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
-: <a class="el" href="a00337.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a>, <a class="el" href="a00288.html#227ea140dc2c68f79a4e5a34a8367b58">tbb::flow::interface6::graph</a><li>is_divisible()
-: <a class="el" href="a00261.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00260.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00259.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
-: <a class="el" href="a00340.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00282.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
-: <a class="el" href="a00337.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00282.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
-: <a class="el" href="a00337.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
-: <a class="el" href="a00271.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00334.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
+: <a class="el" href="a00349.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
+: <a class="el" href="a00300.html#a993b789d1e488e0c3929135beae560e">tbb::flow::interface6::graph</a><li>init()
+: <a class="el" href="a00352.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
+: <a class="el" href="a00355.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a>, <a class="el" href="a00350.html#ff36aa5ec1305ca9931396fa608981da">tbb::interface6::task_arena</a><li>insert()
+: <a class="el" href="a00281.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00281.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00281.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00281.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward_task()
+: <a class="el" href="a00324.html#9249c25621a6ee7a741a6b7eac710ba4">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00325.html#8eecd6591d7565cbb5b7f1e37bf97979">tbb::flow::interface6::queue_node< T, A ></a>, <a class="el" href="a00275.html#bc6ef82fe9c28ace2ef6b78abb43ffb8">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_reg_succ()
+: <a class="el" href="a00275.html#df21388252b8963e839dca29d2c67ea5">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_rem_succ()
+: <a class="el" href="a00275.html#6b6cf76dff80fd679251da93351c1291">tbb::flow::interface6::buffer_node< T, A ></a><li>interval_t()
+: <a class="el" href="a00363.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
+: <a class="el" href="a00355.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a>, <a class="el" href="a00350.html#11e35391bf67e96f877183659106583d">tbb::interface6::task_arena</a><li>is_bound()
+: <a class="el" href="a00294.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00349.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a>, <a class="el" href="a00300.html#227ea140dc2c68f79a4e5a34a8367b58">tbb::flow::interface6::graph</a><li>is_divisible()
+: <a class="el" href="a00273.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00272.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00271.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00352.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
+: <a class="el" href="a00294.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00349.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
+: <a class="el" href="a00294.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00349.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
+: <a class="el" href="a00283.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00346.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x6c.html b/doc/html/functions_func_0x6c.html
index 6935655..716fb78 100644
--- a/doc/html/functions_func_0x6c.html
+++ b/doc/html/functions_func_0x6c.html
@@ -61,15 +61,15 @@
<p>
<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
<li>limiter_node()
-: <a class="el" href="a00292.html#83d3ab884543b070ee5b345a87f241fa">tbb::flow::interface6::limiter_node< T ></a><li>load()
-: <a class="el" href="a00324.html#5f3f6f1683386705a6931acae45f0862">tbb::interface6::runtime_loader</a><li>local()
-: <a class="el" href="a00281.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
-: <a class="el" href="a00333.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00331.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00322.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00318.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00301.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
-: <a class="el" href="a00333.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00318.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
-: <a class="el" href="a00269.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00304.html#83d3ab884543b070ee5b345a87f241fa">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00291.html#3b6d13039c2a8c1e369e5790895b0088">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">tbb::flow::interface6::receiver< T ></a><li>load()
+: <a class="el" href="a00336.html#5f3f6f1683386705a6931acae45f0862">tbb::interface6::runtime_loader</a><li>local()
+: <a class="el" href="a00293.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00345.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00343.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00334.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00330.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00313.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
+: <a class="el" href="a00345.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00330.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
+: <a class="el" href="a00281.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x6d.html b/doc/html/functions_func_0x6d.html
index 5568614..6a7dbeb 100644
--- a/doc/html/functions_func_0x6d.html
+++ b/doc/html/functions_func_0x6d.html
@@ -61,13 +61,13 @@
<p>
<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
<li>max_size()
-: <a class="el" href="a00343.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00325.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00296.html#beebdb6144df8ba219fadfad4de866ea">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00276.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00269.html#2bce57fe9b594abe1e6 [...]
-: <a class="el" href="a00295.html#2822528265718a4c779591fc37c02ca8">tbb::interface6::memory_pool< Alloc ></a><li>move()
-: <a class="el" href="a00299.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00345.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
-: <a class="el" href="a00301.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00334.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
+: <a class="el" href="a00356.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00337.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00308.html#beebdb6144df8ba219fadfad4de866ea">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00288.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00281.html#2bce57fe9b594abe1e6 [...]
+: <a class="el" href="a00307.html#2822528265718a4c779591fc37c02ca8">tbb::interface6::memory_pool< Alloc ></a><li>move()
+: <a class="el" href="a00311.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00358.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
+: <a class="el" href="a00313.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00346.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x6e.html b/doc/html/functions_func_0x6e.html
index d6305b7..ec28eee 100644
--- a/doc/html/functions_func_0x6e.html
+++ b/doc/html/functions_func_0x6e.html
@@ -61,12 +61,12 @@
<p>
<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
<li>name()
-: <a class="el" href="a00299.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00345.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
-: <a class="el" href="a00337.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
-: <a class="el" href="a00349.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
+: <a class="el" href="a00311.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00358.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
+: <a class="el" href="a00349.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
+: <a class="el" href="a00362.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x6f.html b/doc/html/functions_func_0x6f.html
index 0eaaf02..ccad019 100644
--- a/doc/html/functions_func_0x6f.html
+++ b/doc/html/functions_func_0x6f.html
@@ -61,18 +61,18 @@
<p>
<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
<li>object_may_be_null()
-: <a class="el" href="a00282.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
-: <a class="el" href="a00270.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00272.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
-: <a class="el" href="a00345.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00282.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00271.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
-: <a class="el" href="a00350.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-=()
-: <a class="el" href="a00350.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00270.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00272.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00276.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00273.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00269.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00276.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00294.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
+: <a class="el" href="a00282.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00284.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00358.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
+: <a class="el" href="a00294.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00283.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
+: <a class="el" href="a00363.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-=()
+: <a class="el" href="a00363.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
+: <a class="el" href="a00282.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00284.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00288.html#85cc876b1dec457b831b4745be274be1">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00285.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00281.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00288.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x70.html b/doc/html/functions_func_0x70.html
index 1660308..1a9251c 100644
--- a/doc/html/functions_func_0x70.html
+++ b/doc/html/functions_func_0x70.html
@@ -61,24 +61,24 @@
<p>
<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
<li>pages()
-: <a class="el" href="a00261.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
-: <a class="el" href="a00308.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
-: <a class="el" href="a00337.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00256.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
-: <a class="el" href="a00310.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00268.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
-: <a class="el" href="a00341.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00275.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>priority()
-: <a class="el" href="a00340.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
-: <a class="el" href="a00312.html#17a4f66e23d54100b64805405e905d62">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a><li>process()
-: <a class="el" href="a00252.html#ccd88bf4333dc100ba97da8e2170277d">tbb::interface6::aggregator_ext< handler_type ></a><li>process_item()
-: <a class="el" href="a00348.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00268.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
-: <a class="el" href="a00341.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00276.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00275.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00273.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00320.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
+: <a class="el" href="a00349.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
+: <a class="el" href="a00268.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00322.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
+: <a class="el" href="a00280.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00354.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
+: <a class="el" href="a00287.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>priority()
+: <a class="el" href="a00352.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
+: <a class="el" href="a00324.html#17a4f66e23d54100b64805405e905d62">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a><li>process()
+: <a class="el" href="a00264.html#ccd88bf4333dc100ba97da8e2170277d">tbb::interface6::aggregator_ext< handler_type ></a><li>process_item()
+: <a class="el" href="a00361.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
+: <a class="el" href="a00280.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
+: <a class="el" href="a00354.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00288.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00287.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x71.html b/doc/html/functions_func_0x71.html
index 77e504c..6a5af9a 100644
--- a/doc/html/functions_func_0x71.html
+++ b/doc/html/functions_func_0x71.html
@@ -61,12 +61,12 @@
<p>
<h3><a class="anchor" name="index_q">- q -</a></h3><ul>
<li>queue_node()
-: <a class="el" href="a00313.html#0226762d9ebba28311b7b1518d948ab1">tbb::flow::interface6::queue_node< T, A ></a><li>queuing_mutex()
-: <a class="el" href="a00314.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
-: <a class="el" href="a00316.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
+: <a class="el" href="a00325.html#0226762d9ebba28311b7b1518d948ab1">tbb::flow::interface6::queue_node< T, A ></a><li>queuing_mutex()
+: <a class="el" href="a00326.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
+: <a class="el" href="a00328.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x72.html b/doc/html/functions_func_0x72.html
index a633329..55de147 100644
--- a/doc/html/functions_func_0x72.html
+++ b/doc/html/functions_func_0x72.html
@@ -61,33 +61,35 @@
<p>
<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
<li>range()
-: <a class="el" href="a00281.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00276.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
-: <a class="el" href="a00318.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>recursive_mutex()
-: <a class="el" href="a00322.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
-: <a class="el" href="a00337.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
-: <a class="el" href="a00337.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
-: <a class="el" href="a00337.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
-: <a class="el" href="a00337.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>ref_count()
-: <a class="el" href="a00337.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>register_pending_exception()
-: <a class="el" href="a00340.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
-: <a class="el" href="a00292.html#de70a0e88ce7655d8c14b6af57f7496f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00279.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00321.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver< T ></a><li>register_successor()
-: <a class="el" href="a00292.html#c76561d8d871b4769876988a4de12a9b">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00263.html#f8bf4944ede4fc106423d67715beb695">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00262.html#fd0324c9ddb51fe6f95b3d015d338941">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00330.html#22960d499df9f1569a9d8a544e35afe3">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
-: <a class="el" href="a00269.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00334.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00317.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00315.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00292.html#c530e7b469454e2340460795f2da3317">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00279.html#cb691b18416d4742265aed84d496ebbd">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00321.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver< T ></a><li>remove_successor()
-: <a class="el" href="a00292.html#275e328063c121b3e506ccef2a825d28">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00263.html#2074da0e39b9477c32897d6e5786196f">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00262.html#366efcc046ec08a104281109801ae629">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00330.html#222484bf295f39df36415a29e508e5c9">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
-: <a class="el" href="a00276.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00276.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
-: <a class="el" href="a00340.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00276.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
-: <a class="el" href="a00288.html#7f4e3ae90811a5d8b597146b5b586d10">tbb::flow::interface6::graph</a><li>rows()
-: <a class="el" href="a00261.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00260.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
-: <a class="el" href="a00310.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00308.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00288.html#c1145b00e063793a7e7bf994d202c7a0">tbb::flow::interface6::graph</a><li>runtime_loader()
-: <a class="el" href="a00324.html#7ae5330beb48fce0c702c32a5df0094a">tbb::interface6::runtime_loader</a></ul>
+: <a class="el" href="a00293.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00288.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00330.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>recursive_mutex()
+: <a class="el" href="a00334.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
+: <a class="el" href="a00349.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
+: <a class="el" href="a00349.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
+: <a class="el" href="a00349.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_enqueue()
+: <a class="el" href="a00349.html#076120a15237d1ee63060c992e878b29">tbb::task</a><li>recycle_to_reexecute()
+: <a class="el" href="a00349.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>ref_count()
+: <a class="el" href="a00349.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>register_pending_exception()
+: <a class="el" href="a00352.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
+: <a class="el" href="a00304.html#de70a0e88ce7655d8c14b6af57f7496f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00291.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00333.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver< T ></a><li>register_successor()
+: <a class="el" href="a00304.html#c76561d8d871b4769876988a4de12a9b">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00275.html#f8bf4944ede4fc106423d67715beb695">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00274.html#fd0324c9ddb51fe6f95b3d015d338941">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00342.html#22960d499df9f1569a9d8a544e35afe3">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00281.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00346.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00329.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00327.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00304.html#c530e7b469454e2340460795f2da3317">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00291.html#cb691b18416d4742265aed84d496ebbd">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00333.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver< T ></a><li>remove_successor()
+: <a class="el" href="a00304.html#275e328063c121b3e506ccef2a825d28">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00275.html#2074da0e39b9477c32897d6e5786196f">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00274.html#366efcc046ec08a104281109801ae629">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00342.html#222484bf295f39df36415a29e508e5c9">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00288.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00288.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00352.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a>, <a class="el" href="a00342.html#d751cdda02bdaa1dc90c4d9609c05df2">tbb::flow::interface6::source_node< Output ></a><li>resize()
+: <a class="el" href="a00288.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>resolution()
+: <a class="el" href="a00362.html#8aaa5ac47975a1b0fa3e95752281159e">tbb::tick_count</a><li>root_task()
+: <a class="el" href="a00300.html#7f4e3ae90811a5d8b597146b5b586d10">tbb::flow::interface6::graph</a><li>rows()
+: <a class="el" href="a00273.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00272.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00322.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00320.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00300.html#c1145b00e063793a7e7bf994d202c7a0">tbb::flow::interface6::graph</a><li>runtime_loader()
+: <a class="el" href="a00336.html#7ae5330beb48fce0c702c32a5df0094a">tbb::interface6::runtime_loader</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x73.html b/doc/html/functions_func_0x73.html
index 2135a1f..0403c35 100644
--- a/doc/html/functions_func_0x73.html
+++ b/doc/html/functions_func_0x73.html
@@ -61,31 +61,31 @@
<p>
<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
<li>scoped_lock()
-: <a class="el" href="a00334.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00319.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00317.html#fbb8798792d3aebb136c46fc63d [...]
-: <a class="el" href="a00320.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
-: <a class="el" href="a00350.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
-: <a class="el" href="a00337.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
-: <a class="el" href="a00328.html#b38e7a070552960384bcc1d91af13a5c">tbb::flow::interface6::sequencer_node< T, A ></a><li>set_affinity()
-: <a class="el" href="a00337.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00268.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
-: <a class="el" href="a00337.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_parent()
-: <a class="el" href="a00337.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">tbb::task</a><li>set_priority()
-: <a class="el" href="a00340.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
-: <a class="el" href="a00337.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
-: <a class="el" href="a00301.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
-: <a class="el" href="a00276.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
-: <a class="el" href="a00281.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00276.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00268.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00273.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T, [...]
-: <a class="el" href="a00330.html#adaac111fbcace95804219a5f2929304">tbb::flow::interface6::source_node< Output ></a><li>spawn_and_wait_for_all()
-: <a class="el" href="a00337.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
-: <a class="el" href="a00337.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
-: <a class="el" href="a00331.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
-: <a class="el" href="a00333.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
-: <a class="el" href="a00337.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>status()
-: <a class="el" href="a00324.html#78d938ed2e54d38dd38d6609e6c60389">tbb::interface6::runtime_loader</a><li>swap()
-: <a class="el" href="a00276.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00273.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00269.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00346.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00331.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00329.html#fbb8798792d3aebb136c46fc63d [...]
+: <a class="el" href="a00332.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
+: <a class="el" href="a00363.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
+: <a class="el" href="a00349.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
+: <a class="el" href="a00340.html#b38e7a070552960384bcc1d91af13a5c">tbb::flow::interface6::sequencer_node< T, A ></a><li>set_affinity()
+: <a class="el" href="a00349.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
+: <a class="el" href="a00280.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
+: <a class="el" href="a00349.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_parent()
+: <a class="el" href="a00349.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">tbb::task</a><li>set_priority()
+: <a class="el" href="a00352.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
+: <a class="el" href="a00349.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
+: <a class="el" href="a00313.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
+: <a class="el" href="a00288.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00293.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00288.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00280.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00285.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T, [...]
+: <a class="el" href="a00342.html#adaac111fbcace95804219a5f2929304">tbb::flow::interface6::source_node< Output ></a><li>spawn_and_wait_for_all()
+: <a class="el" href="a00349.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
+: <a class="el" href="a00349.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
+: <a class="el" href="a00343.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
+: <a class="el" href="a00345.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
+: <a class="el" href="a00349.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>status()
+: <a class="el" href="a00336.html#78d938ed2e54d38dd38d6609e6c60389">tbb::interface6::runtime_loader</a><li>swap()
+: <a class="el" href="a00288.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00285.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00281.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x74.html b/doc/html/functions_func_0x74.html
index 8f00301..7db5c91 100644
--- a/doc/html/functions_func_0x74.html
+++ b/doc/html/functions_func_0x74.html
@@ -61,27 +61,29 @@
<p>
<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
<li>task()
-: <a class="el" href="a00337.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
-: <a class="el" href="a00340.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
-: <a class="el" href="a00341.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
-: <a class="el" href="a00342.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
-: <a class="el" href="a00342.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00346.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00299.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00345.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
-: <a class="el" href="a00349.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
-: <a class="el" href="a00334.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00317.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00315.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
-: <a class="el" href="a00263.html#8ef07c434eb763d947a7b4e80c086a49">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00330.html#2c7fcc29e2894b29138be3c1edce9bc9">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00327.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a><li>try_get()
-: <a class="el" href="a00263.html#aeb8aec46ca99ca022356a792c46735e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00330.html#41073ad4d3510ed5a8b6bda9c0f58636">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00327.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a><li>try_lock()
-: <a class="el" href="a00333.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00331.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00322.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00318.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00301.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
-: <a class="el" href="a00333.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00318.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
-: <a class="el" href="a00268.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
-: <a class="el" href="a00348.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00268.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
-: <a class="el" href="a00292.html#55a02d458a4d8ffa6accd7a70605da2f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00263.html#2b02fe332e704bbe14f297802298b63a">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00262.html#29eb768c10b377880bbf83d31ee49acf">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00279.html#3969c70fb89c0a982f142ae9eb5facae">tbb::flow::interface6::continue_receiver</a>, <a class="el" href=" [...]
-: <a class="el" href="a00263.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00330.html#494678baf9096835268736b800824460">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00327.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a><li>try_reserve()
-: <a class="el" href="a00263.html#1cc889bb6c38bcb81757d0ebbc3a5e64">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00330.html#ad459713ff3c1c9ad0f4826daa141f65">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00327.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a></ul>
+: <a class="el" href="a00349.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_arena()
+: <a class="el" href="a00350.html#27ac2706e3f2a989487ba7944b07cb94">tbb::interface6::task_arena</a><li>task_group_context()
+: <a class="el" href="a00352.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
+: <a class="el" href="a00354.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
+: <a class="el" href="a00355.html#5dbd23c83603b3b09dffa7982112cc95">tbb::task_scheduler_init</a><li>terminate()
+: <a class="el" href="a00355.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a>, <a class="el" href="a00350.html#ee3f3f736da03bfe8b82acfa822624a6">tbb::interface6::task_arena</a><li>throw_self()
+: <a class="el" href="a00359.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00311.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00358.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00362.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
+: <a class="el" href="a00346.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00329.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00327.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
+: <a class="el" href="a00275.html#8ef07c434eb763d947a7b4e80c086a49">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00342.html#2c7fcc29e2894b29138be3c1edce9bc9">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00339.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a><li>try_get()
+: <a class="el" href="a00275.html#aeb8aec46ca99ca022356a792c46735e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00342.html#41073ad4d3510ed5a8b6bda9c0f58636">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00339.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a><li>try_lock()
+: <a class="el" href="a00345.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00343.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00334.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00330.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00313.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
+: <a class="el" href="a00345.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00330.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
+: <a class="el" href="a00280.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
+: <a class="el" href="a00361.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
+: <a class="el" href="a00280.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
+: <a class="el" href="a00333.html#e1adb4060a7cbac837cd24da57c5a846">tbb::flow::interface6::receiver< T ></a><li>try_put_task()
+: <a class="el" href="a00304.html#ca2ff9f3379b8b5a3de2ababbca4a476">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00275.html#84d939049fa8c3205aec91ced0980e03">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00274.html#b4804d99e0fb0576f1061ab7269e5939">tbb::flow::interface6::broadcast_node< T ></a><li>try_release()
+: <a class="el" href="a00275.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00342.html#494678baf9096835268736b800824460">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00339.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a><li>try_reserve()
+: <a class="el" href="a00275.html#1cc889bb6c38bcb81757d0ebbc3a5e64">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00342.html#ad459713ff3c1c9ad0f4826daa141f65">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00339.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x75.html b/doc/html/functions_func_0x75.html
index 380d3df..2693d34 100644
--- a/doc/html/functions_func_0x75.html
+++ b/doc/html/functions_func_0x75.html
@@ -61,12 +61,12 @@
<p>
<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
<li>unlock()
-: <a class="el" href="a00333.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00331.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00322.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00318.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00301.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00274.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
-: <a class="el" href="a00334.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00317.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00345.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00343.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00334.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00330.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00313.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
+: <a class="el" href="a00286.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00346.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00329.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x77.html b/doc/html/functions_func_0x77.html
index dd067aa..77801e8 100644
--- a/doc/html/functions_func_0x77.html
+++ b/doc/html/functions_func_0x77.html
@@ -61,11 +61,12 @@
<p>
<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
<li>wait_for_all()
-: <a class="el" href="a00337.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00288.html#a66b0020f7514b86d030fa8aea073d37">tbb::flow::interface6::graph</a><li>what()
-: <a class="el" href="a00299.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00266.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00345.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00349.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00300.html#a66b0020f7514b86d030fa8aea073d37">tbb::flow::interface6::graph</a><li>wait_until_empty()
+: <a class="el" href="a00350.html#776e73ba196e5bbb8b8ed489fc2b77d3">tbb::interface6::task_arena</a><li>what()
+: <a class="el" href="a00311.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00278.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00358.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func_0x7e.html b/doc/html/functions_func_0x7e.html
index 6cd6e45..5b42dd8 100644
--- a/doc/html/functions_func_0x7e.html
+++ b/doc/html/functions_func_0x7e.html
@@ -61,34 +61,34 @@
<p>
<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
<li>~combinable()
-: <a class="el" href="a00267.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00268.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00269.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00274.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00276.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00272.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
-: <a class="el" href="a00279.html#1e14828fa079b9835ff7267df5ee45d7">tbb::flow::interface6::continue_receiver</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00281.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00282.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
-: <a class="el" href="a00288.html#8a7d424c0616a1c37a908ead182e2fe5">tbb::flow::interface6::graph</a><li>~memory_pool()
-: <a class="el" href="a00295.html#fdad7c4ed08332ec384491a71b721957">tbb::interface6::memory_pool< Alloc ></a><li>~parallel_while()
-: <a class="el" href="a00308.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
-: <a class="el" href="a00310.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
-: <a class="el" href="a00316.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
-: <a class="el" href="a00318.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
-: <a class="el" href="a00321.html#b00699b235435f7b65b663d5063624a1">tbb::flow::interface6::receiver< T ></a><li>~runtime_loader()
-: <a class="el" href="a00324.html#c25fec923a751a3e03f5cbe969f1f0c5">tbb::interface6::runtime_loader</a><li>~scoped_lock()
-: <a class="el" href="a00334.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00332.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00323.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00319.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00317.html#32c7d67a660d23ebbaab1a1d282 [...]
-: <a class="el" href="a00320.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
-: <a class="el" href="a00328.html#93d3d8f6a72b3e1387047282116ed6ee">tbb::flow::interface6::sequencer_node< T, A ></a><li>~source_node()
-: <a class="el" href="a00330.html#61700b0865fc17188b0abe26bbde65b6">tbb::flow::interface6::source_node< Output ></a><li>~spin_rw_mutex_v3()
-: <a class="el" href="a00333.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
-: <a class="el" href="a00337.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
-: <a class="el" href="a00341.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
-: <a class="el" href="a00342.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00279.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00280.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00281.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00286.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00288.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00284.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
+: <a class="el" href="a00291.html#1e14828fa079b9835ff7267df5ee45d7">tbb::flow::interface6::continue_receiver</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00293.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00294.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
+: <a class="el" href="a00300.html#8a7d424c0616a1c37a908ead182e2fe5">tbb::flow::interface6::graph</a><li>~memory_pool()
+: <a class="el" href="a00307.html#fdad7c4ed08332ec384491a71b721957">tbb::interface6::memory_pool< Alloc ></a><li>~parallel_while()
+: <a class="el" href="a00320.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
+: <a class="el" href="a00322.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
+: <a class="el" href="a00328.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
+: <a class="el" href="a00330.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
+: <a class="el" href="a00333.html#b00699b235435f7b65b663d5063624a1">tbb::flow::interface6::receiver< T ></a><li>~runtime_loader()
+: <a class="el" href="a00336.html#c25fec923a751a3e03f5cbe969f1f0c5">tbb::interface6::runtime_loader</a><li>~scoped_lock()
+: <a class="el" href="a00346.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00344.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00335.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00331.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00329.html#32c7d67a660d23ebbaab1a1d282 [...]
+: <a class="el" href="a00332.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
+: <a class="el" href="a00340.html#93d3d8f6a72b3e1387047282116ed6ee">tbb::flow::interface6::sequencer_node< T, A ></a><li>~source_node()
+: <a class="el" href="a00342.html#61700b0865fc17188b0abe26bbde65b6">tbb::flow::interface6::source_node< Output ></a><li>~spin_rw_mutex_v3()
+: <a class="el" href="a00345.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
+: <a class="el" href="a00349.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_arena()
+: <a class="el" href="a00350.html#fec24e9b3fa07a6e7b20add7c7e0a660">tbb::interface6::task_arena</a><li>~task_list()
+: <a class="el" href="a00354.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_rela.html b/doc/html/functions_rela.html
index 00b0793..5266452 100644
--- a/doc/html/functions_rela.html
+++ b/doc/html/functions_rela.html
@@ -34,13 +34,15 @@
<p>
<ul>
-<li>make_filter
-: <a class="el" href="a00283.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>operator+
-: <a class="el" href="a00350.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator-
-: <a class="el" href="a00349.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00350.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a></ul>
+<li>limiter_node
+: <a class="el" href="a00304.html#83d3ab884543b070ee5b345a87f241fa">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00291.html#3b6d13039c2a8c1e369e5790895b0088">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00333.html#3b6d13039c2a8c1e369e5790895b0088">tbb::flow::interface6::receiver< T ></a><li>make_filter
+: <a class="el" href="a00295.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>operator+
+: <a class="el" href="a00363.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator-
+: <a class="el" href="a00362.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00363.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>run_and_put_task
+: <a class="el" href="a00304.html#621bab40a858d214db69ef08d88b67c1">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00275.html#621bab40a858d214db69ef08d88b67c1">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00274.html#621bab40a858d214db69ef08d88b67c1">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00291.html#621bab40a858d214db69ef08d88b67c1">tbb::flow::interface6::continue_receiver</a>, <a class="el" href=" [...]
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_type.html b/doc/html/functions_type.html
index d75b769..dc17e74 100644
--- a/doc/html/functions_type.html
+++ b/doc/html/functions_type.html
@@ -35,24 +35,24 @@
<p>
<ul>
<li>affinity_id
-: <a class="el" href="a00337.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocator_type
-: <a class="el" href="a00281.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00268.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#1712cb3a46bc1821fccc5e2cd83d5cd7">tbb::interface5::concurrent_priority_qu [...]
-: <a class="el" href="a00259.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00268.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>difference_type
-: <a class="el" href="a00268.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>input_type
-: <a class="el" href="a00292.html#035196d3c9240ef041f528ebcde8baa7">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00312.html#b2829b518979874ad3d2a939e14ae7bd">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00328.html#af629f26832ff4e476e240637a78bc0c">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00313.html#1e71030845210b6c4c7380eb9e11a2ac">tbb::flow::interface6::queue_node< T, A > [...]
-: <a class="el" href="a00322.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00301.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>output_type
-: <a class="el" href="a00292.html#6e67fc480147c0b88a483b85db6457b0">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00312.html#2cb099b590246b6bc93cc15e78c6ee5c">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00328.html#ca026eaef70e35791c407323199031a7">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00313.html#25b5a53ab1f9a342644fa3759bc0b1ad">tbb::flow::interface6::queue_node< T, A > [...]
-: <a class="el" href="a00261.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>predecessor_type
-: <a class="el" href="a00292.html#f89fcf44f38eb33f965ee5362d3e68e9">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00312.html#fdea783bf9d5a4c98e794ac7e0f84ccf">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00328.html#8127e36811832563fe1e9bc3ba391f79">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00313.html#5e2fdd33c45d44549dee9c1638e19898">tbb::flow::interface6::queue_node< T, A > [...]
-: <a class="el" href="a00268.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>row_range_type
-: <a class="el" href="a00260.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
-: <a class="el" href="a00268.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00259.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>successor_type
-: <a class="el" href="a00292.html#e8945e4dd6ea759ff9e4735da13f12ef">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00312.html#09ab5064ca8192e68c03da47603e68eb">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00328.html#795f3ee75f133b9d3b159172fc4a197f">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00313.html#f35076a19f256f9e7a61bed77ca1ccc5">tbb::flow::interface6::queue_node< T, A > [...]
-: <a class="el" href="a00308.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00268.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00274.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00273.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" [...]
+: <a class="el" href="a00349.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocator_type
+: <a class="el" href="a00293.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00280.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#1712cb3a46bc1821fccc5e2cd83d5cd7">tbb::interface5::concurrent_priority_qu [...]
+: <a class="el" href="a00271.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00280.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>difference_type
+: <a class="el" href="a00280.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>input_type
+: <a class="el" href="a00304.html#035196d3c9240ef041f528ebcde8baa7">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00324.html#b2829b518979874ad3d2a939e14ae7bd">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00340.html#af629f26832ff4e476e240637a78bc0c">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00325.html#1e71030845210b6c4c7380eb9e11a2ac">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00334.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00313.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>output_type
+: <a class="el" href="a00304.html#6e67fc480147c0b88a483b85db6457b0">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00324.html#2cb099b590246b6bc93cc15e78c6ee5c">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00340.html#ca026eaef70e35791c407323199031a7">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00325.html#25b5a53ab1f9a342644fa3759bc0b1ad">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00273.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>predecessor_type
+: <a class="el" href="a00304.html#f89fcf44f38eb33f965ee5362d3e68e9">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00324.html#fdea783bf9d5a4c98e794ac7e0f84ccf">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00340.html#8127e36811832563fe1e9bc3ba391f79">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00325.html#5e2fdd33c45d44549dee9c1638e19898">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00280.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>row_range_type
+: <a class="el" href="a00272.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
+: <a class="el" href="a00280.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00271.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>successor_type
+: <a class="el" href="a00304.html#e8945e4dd6ea759ff9e4735da13f12ef">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00324.html#09ab5064ca8192e68c03da47603e68eb">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00340.html#795f3ee75f133b9d3b159172fc4a197f">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00325.html#f35076a19f256f9e7a61bed77ca1ccc5">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00320.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00280.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00286.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00285.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" [...]
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html
index f45ce51..877ef51 100644
--- a/doc/html/functions_vars.html
+++ b/doc/html/functions_vars.html
@@ -35,20 +35,20 @@
<p>
<ul>
<li>automatic
-: <a class="el" href="a00342.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a><li>decrement
-: <a class="el" href="a00292.html#a3344b2461966631b6ee34b79fb105c7">tbb::flow::interface6::limiter_node< T ></a><li>deferred
-: <a class="el" href="a00342.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>exact_exception_propagation
-: <a class="el" href="a00282.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>filter_is_bound
-: <a class="el" href="a00282.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
-: <a class="el" href="a00282.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
-: <a class="el" href="a00282.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
-: <a class="el" href="a00282.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>is_writer
-: <a class="el" href="a00271.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00334.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a><li>mutex
-: <a class="el" href="a00301.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00334.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
-: <a class="el" href="a00299.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
+: <a class="el" href="a00355.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a>, <a class="el" href="a00350.html#fa26370c094032900c1ed69d8e92f4e8">tbb::interface6::task_arena</a><li>decrement
+: <a class="el" href="a00304.html#a3344b2461966631b6ee34b79fb105c7">tbb::flow::interface6::limiter_node< T ></a><li>deferred
+: <a class="el" href="a00355.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>exact_exception_propagation
+: <a class="el" href="a00294.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>filter_is_bound
+: <a class="el" href="a00294.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
+: <a class="el" href="a00294.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
+: <a class="el" href="a00294.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
+: <a class="el" href="a00294.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>is_writer
+: <a class="el" href="a00283.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00346.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a><li>mutex
+: <a class="el" href="a00313.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00346.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
+: <a class="el" href="a00311.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/globals.html b/doc/html/globals.html
index ff26950..8c6e928 100644
--- a/doc/html/globals.html
+++ b/doc/html/globals.html
@@ -29,18 +29,19 @@ Here is a list of all documented file members with links to the documentation:
<p>
<ul>
<li>scalable_aligned_free()
-: <a class="el" href="a00428.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00428.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00428.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00428.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00428.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00428.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00428.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00428.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00428.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+: <a class="el" href="a00443.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00443.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00443.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_allocation_mode()
+: <a class="el" href="a00443.html#gb9ee52ffc5400f15c3d8af8c7613c05a">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00443.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00443.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00443.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00443.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00443.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00443.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
index 359a759..65325a7 100644
--- a/doc/html/globals_func.html
+++ b/doc/html/globals_func.html
@@ -29,18 +29,19 @@
<p>
<ul>
<li>scalable_aligned_free()
-: <a class="el" href="a00428.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00428.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00428.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00428.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00428.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00428.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00428.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00428.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00428.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+: <a class="el" href="a00443.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00443.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00443.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_allocation_mode()
+: <a class="el" href="a00443.html#gb9ee52ffc5400f15c3d8af8c7613c05a">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00443.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00443.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00443.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00443.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00443.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00443.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html
index e84d06c..e6280d5 100644
--- a/doc/html/hierarchy.html
+++ b/doc/html/hierarchy.html
@@ -21,158 +21,159 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<h1>Class Hierarchy</h1>This inheritance list is sorted roughly, but not completely, alphabetically:<ul>
-<li><a class="el" href="a00250.html">tbb::internal::affinity_partitioner_base_v3</a>
+<li><a class="el" href="a00262.html">tbb::internal::affinity_partitioner_base_v3</a>
<ul>
-<li><a class="el" href="a00249.html">tbb::affinity_partitioner</a>
+<li><a class="el" href="a00261.html">tbb::affinity_partitioner</a>
</ul>
-<li><a class="el" href="a00252.html">tbb::interface6::aggregator_ext< handler_type ></a>
+<li><a class="el" href="a00264.html">tbb::interface6::aggregator_ext< handler_type ></a>
<ul>
-<li><a class="el" href="a00251.html">tbb::interface6::aggregator</a>
-</ul>
-<li><a class="el" href="a00253.html">tbb::aligned_space< T, N ></a>
-<li><a class="el" href="a00254.html">tbb::atomic< T ></a>
-<li><a class="el" href="a00255.html">tbb::atomic< void * ></a>
-<li><a class="el" href="a00256.html">tbb::internal::atomic_backoff</a>
-<li><a class="el" href="a00257.html">tbb::auto_partitioner</a>
-<li><a class="el" href="a00258.html">tbb::bad_last_alloc</a>
-<li><a class="el" href="a00259.html">tbb::blocked_range< Value ></a>
-<li><a class="el" href="a00260.html">tbb::blocked_range2d< RowValue, ColValue ></a>
-<li><a class="el" href="a00261.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
-<li><a class="el" href="a00259.html">tbb::blocked_range< I ></a>
-<li><a class="el" href="a00264.html">tbb::cache_aligned_allocator< T ></a>
-<li><a class="el" href="a00265.html">tbb::cache_aligned_allocator< void ></a>
-<li><a class="el" href="a00267.html">tbb::combinable< T ></a>
-<li><a class="el" href="a00268.html">tbb::concurrent_bounded_queue< T, A ></a>
+<li><a class="el" href="a00263.html">tbb::interface6::aggregator</a>
+</ul>
+<li><a class="el" href="a00265.html">tbb::aligned_space< T, N ></a>
+<li><a class="el" href="a00266.html">tbb::atomic< T ></a>
+<li><a class="el" href="a00267.html">tbb::atomic< void * ></a>
+<li><a class="el" href="a00268.html">tbb::internal::atomic_backoff</a>
+<li><a class="el" href="a00269.html">tbb::auto_partitioner</a>
+<li><a class="el" href="a00270.html">tbb::bad_last_alloc</a>
+<li><a class="el" href="a00271.html">tbb::blocked_range< Value ></a>
+<li><a class="el" href="a00272.html">tbb::blocked_range2d< RowValue, ColValue ></a>
+<li><a class="el" href="a00273.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
+<li><a class="el" href="a00271.html">tbb::blocked_range< I ></a>
+<li><a class="el" href="a00276.html">tbb::cache_aligned_allocator< T ></a>
+<li><a class="el" href="a00277.html">tbb::cache_aligned_allocator< void ></a>
+<li><a class="el" href="a00279.html">tbb::combinable< T ></a>
+<li><a class="el" href="a00280.html">tbb::concurrent_bounded_queue< T, A ></a>
<ul>
-<li><a class="el" href="a00275.html">tbb::deprecated::concurrent_queue< T, A ></a>
+<li><a class="el" href="a00287.html">tbb::deprecated::concurrent_queue< T, A ></a>
</ul>
-<li><a class="el" href="a00269.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
-<li><a class="el" href="a00271.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
-<li><a class="el" href="a00272.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
+<li><a class="el" href="a00281.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
+<li><a class="el" href="a00283.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
+<li><a class="el" href="a00284.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
<ul>
-<li><a class="el" href="a00270.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
-</ul>
-<li><a class="el" href="a00273.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>
-<li><a class="el" href="a00274.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
-<li><a class="el" href="a00276.html">tbb::concurrent_vector< T, A ></a>
-<li><a class="el" href="a00277.html">tbb::flow::interface6::continue_msg</a>
-<li><a class="el" href="a00281.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
-<li><a class="el" href="a00282.html">tbb::filter</a>
+<li><a class="el" href="a00282.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
+</ul>
+<li><a class="el" href="a00285.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>
+<li><a class="el" href="a00286.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
+<li><a class="el" href="a00288.html">tbb::concurrent_vector< T, A ></a>
+<li><a class="el" href="a00289.html">tbb::flow::interface6::continue_msg</a>
+<li><a class="el" href="a00293.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
+<li><a class="el" href="a00294.html">tbb::filter</a>
<ul>
-<li><a class="el" href="a00348.html">tbb::thread_bound_filter</a>
+<li><a class="el" href="a00361.html">tbb::thread_bound_filter</a>
</ul>
-<li><a class="el" href="a00283.html">tbb::interface6::filter_t< T, U ></a>
-<li><a class="el" href="a00284.html">tbb::final_scan_tag</a>
-<li><a class="el" href="a00285.html">tbb::interface6::flow_control</a>
-<li><a class="el" href="a00288.html">tbb::flow::interface6::graph</a>
-<li><a class="el" href="a00289.html">tbb::flow::interface6::graph_node</a>
+<li><a class="el" href="a00295.html">tbb::interface6::filter_t< T, U ></a>
+<li><a class="el" href="a00296.html">tbb::final_scan_tag</a>
+<li><a class="el" href="a00297.html">tbb::interface6::flow_control</a>
+<li><a class="el" href="a00300.html">tbb::flow::interface6::graph</a>
+<li><a class="el" href="a00301.html">tbb::flow::interface6::graph_node</a>
<ul>
-<li><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a>
-<li><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>
+<li><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>
+<li><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>
<ul>
-<li><a class="el" href="a00312.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>
-<li><a class="el" href="a00313.html">tbb::flow::interface6::queue_node< T, A ></a>
+<li><a class="el" href="a00324.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>
+<li><a class="el" href="a00325.html">tbb::flow::interface6::queue_node< T, A ></a>
<ul>
-<li><a class="el" href="a00328.html">tbb::flow::interface6::sequencer_node< T, A ></a>
+<li><a class="el" href="a00340.html">tbb::flow::interface6::sequencer_node< T, A ></a>
</ul>
</ul>
-<li><a class="el" href="a00278.html">tbb::flow::interface6::continue_node< Output ></a>
-<li><a class="el" href="a00286.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>
-<li><a class="el" href="a00287.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>
-<li><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a>
-<li><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>
-<li><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a>
+<li><a class="el" href="a00290.html">tbb::flow::interface6::continue_node< Output ></a>
+<li><a class="el" href="a00298.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>
+<li><a class="el" href="a00299.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>
+<li><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>
+<li><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< Input, Output,, Allocator ></a>
+<li><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a>
<ul>
-<li><a class="el" href="a00336.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>
+<li><a class="el" href="a00348.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>
</ul>
-<li><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a>
+<li><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a>
</ul>
-<li><a class="el" href="a00290.html">tbb::improper_lock</a>
+<li><a class="el" href="a00302.html">tbb::improper_lock</a>
<li><b>atomic_impl</b><li><b>multifunction_input</b><ul>
-<li><a class="el" href="a00300.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a>
-</ul>
-<li><a class="el" href="a00291.html">tbb::invalid_multiple_scheduling</a>
-<li><a class="el" href="a00293.html">tbb::internal::machine_load_store_relaxed< T, S ></a>
-<li><a class="el" href="a00294.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>
-<li><a class="el" href="a00295.html">tbb::interface6::memory_pool< Alloc ></a>
-<li><a class="el" href="a00296.html">tbb::interface6::memory_pool_allocator< T, P ></a>
-<li><a class="el" href="a00297.html">tbb::interface6::memory_pool_allocator< void, P ></a>
-<li><a class="el" href="a00298.html">tbb::missing_wait</a>
-<li><a class="el" href="a00301.html">tbb::mutex</a>
-<li><a class="el" href="a00302.html">tbb::mutex::scoped_lock</a>
-<li><b>no_copy</b><li><a class="el" href="a00303.html">tbb::null_mutex</a>
-<li><a class="el" href="a00304.html">tbb::null_mutex::scoped_lock</a>
-<li><a class="el" href="a00305.html">tbb::null_rw_mutex</a>
-<li><a class="el" href="a00306.html">tbb::null_rw_mutex::scoped_lock</a>
-<li><a class="el" href="a00307.html">tbb::parallel_do_feeder< Item ></a>
-<li><a class="el" href="a00308.html">tbb::parallel_while< Body ></a>
-<li><a class="el" href="a00309.html">tbb::internal::partition_type_base</a>
-<li><a class="el" href="a00310.html">tbb::pipeline</a>
-<li><a class="el" href="a00311.html">tbb::pre_scan_tag</a>
-<li><a class="el" href="a00314.html">tbb::queuing_mutex</a>
-<li><a class="el" href="a00315.html">tbb::queuing_mutex::scoped_lock</a>
-<li><a class="el" href="a00316.html">tbb::queuing_rw_mutex</a>
-<li><a class="el" href="a00317.html">tbb::queuing_rw_mutex::scoped_lock</a>
-<li><a class="el" href="a00318.html">tbb::interface5::reader_writer_lock</a>
-<li><a class="el" href="a00319.html">tbb::interface5::reader_writer_lock::scoped_lock</a>
-<li><a class="el" href="a00320.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>
-<li><a class="el" href="a00321.html">tbb::flow::interface6::receiver< T ></a>
+<li><a class="el" href="a00312.html">tbb::flow::interface6::multifunction_node< TupleType, TupleType, rejecting, Allocator ></a>
+</ul>
+<li><a class="el" href="a00303.html">tbb::invalid_multiple_scheduling</a>
+<li><a class="el" href="a00305.html">tbb::internal::machine_load_store_relaxed< T, S ></a>
+<li><a class="el" href="a00306.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>
+<li><a class="el" href="a00307.html">tbb::interface6::memory_pool< Alloc ></a>
+<li><a class="el" href="a00308.html">tbb::interface6::memory_pool_allocator< T, P ></a>
+<li><a class="el" href="a00309.html">tbb::interface6::memory_pool_allocator< void, P ></a>
+<li><a class="el" href="a00310.html">tbb::missing_wait</a>
+<li><a class="el" href="a00313.html">tbb::mutex</a>
+<li><a class="el" href="a00314.html">tbb::mutex::scoped_lock</a>
+<li><b>no_copy</b><li><a class="el" href="a00315.html">tbb::null_mutex</a>
+<li><a class="el" href="a00316.html">tbb::null_mutex::scoped_lock</a>
+<li><a class="el" href="a00317.html">tbb::null_rw_mutex</a>
+<li><a class="el" href="a00318.html">tbb::null_rw_mutex::scoped_lock</a>
+<li><a class="el" href="a00319.html">tbb::parallel_do_feeder< Item ></a>
+<li><a class="el" href="a00320.html">tbb::parallel_while< Body ></a>
+<li><a class="el" href="a00321.html">tbb::internal::partition_type_base</a>
+<li><a class="el" href="a00322.html">tbb::pipeline</a>
+<li><a class="el" href="a00323.html">tbb::pre_scan_tag</a>
+<li><a class="el" href="a00326.html">tbb::queuing_mutex</a>
+<li><a class="el" href="a00327.html">tbb::queuing_mutex::scoped_lock</a>
+<li><a class="el" href="a00328.html">tbb::queuing_rw_mutex</a>
+<li><a class="el" href="a00329.html">tbb::queuing_rw_mutex::scoped_lock</a>
+<li><a class="el" href="a00330.html">tbb::interface5::reader_writer_lock</a>
+<li><a class="el" href="a00331.html">tbb::interface5::reader_writer_lock::scoped_lock</a>
+<li><a class="el" href="a00332.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>
+<li><a class="el" href="a00333.html">tbb::flow::interface6::receiver< T ></a>
<ul>
-<li><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a>
-<li><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>
-<li><a class="el" href="a00279.html">tbb::flow::interface6::continue_receiver</a>
-<li><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a>
-</ul>
-<li><a class="el" href="a00321.html">tbb::flow::interface6::receiver< tbb::flow::interface6::continue_msg ></a>
-<li><a class="el" href="a00322.html">tbb::recursive_mutex</a>
-<li><a class="el" href="a00323.html">tbb::recursive_mutex::scoped_lock</a>
-<li><a class="el" href="a00324.html">tbb::interface6::runtime_loader</a>
-<li><a class="el" href="a00325.html">tbb::scalable_allocator< T ></a>
-<li><a class="el" href="a00326.html">tbb::scalable_allocator< void ></a>
-<li><a class="el" href="a00327.html">tbb::flow::interface6::sender< T ></a>
+<li><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>
+<li><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>
+<li><a class="el" href="a00291.html">tbb::flow::interface6::continue_receiver</a>
+<li><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>
+</ul>
+<li><a class="el" href="a00333.html">tbb::flow::interface6::receiver< tbb::flow::interface6::continue_msg ></a>
+<li><a class="el" href="a00334.html">tbb::recursive_mutex</a>
+<li><a class="el" href="a00335.html">tbb::recursive_mutex::scoped_lock</a>
+<li><a class="el" href="a00336.html">tbb::interface6::runtime_loader</a>
+<li><a class="el" href="a00337.html">tbb::scalable_allocator< T ></a>
+<li><a class="el" href="a00338.html">tbb::scalable_allocator< void ></a>
+<li><a class="el" href="a00339.html">tbb::flow::interface6::sender< T ></a>
<ul>
-<li><a class="el" href="a00262.html">tbb::flow::interface6::broadcast_node< T ></a>
-<li><a class="el" href="a00263.html">tbb::flow::interface6::buffer_node< T, A ></a>
-<li><a class="el" href="a00292.html">tbb::flow::interface6::limiter_node< T ></a>
+<li><a class="el" href="a00274.html">tbb::flow::interface6::broadcast_node< T ></a>
+<li><a class="el" href="a00275.html">tbb::flow::interface6::buffer_node< T, A ></a>
+<li><a class="el" href="a00304.html">tbb::flow::interface6::limiter_node< T ></a>
</ul>
-<li><a class="el" href="a00327.html">tbb::flow::interface6::sender< Output ></a>
+<li><a class="el" href="a00339.html">tbb::flow::interface6::sender< Output ></a>
<ul>
-<li><a class="el" href="a00330.html">tbb::flow::interface6::source_node< Output ></a>
-</ul>
-<li><a class="el" href="a00329.html">tbb::simple_partitioner</a>
-<li><a class="el" href="a00331.html">tbb::spin_mutex</a>
-<li><a class="el" href="a00332.html">tbb::spin_mutex::scoped_lock</a>
-<li><a class="el" href="a00333.html">tbb::spin_rw_mutex_v3</a>
-<li><a class="el" href="a00334.html">tbb::spin_rw_mutex_v3::scoped_lock</a>
-<li><a class="el" href="a00335.html">tbb::split</a>
-<li><a class="el" href="a00337.html">tbb::task</a>
+<li><a class="el" href="a00342.html">tbb::flow::interface6::source_node< Output ></a>
+</ul>
+<li><a class="el" href="a00341.html">tbb::simple_partitioner</a>
+<li><a class="el" href="a00343.html">tbb::spin_mutex</a>
+<li><a class="el" href="a00344.html">tbb::spin_mutex::scoped_lock</a>
+<li><a class="el" href="a00345.html">tbb::spin_rw_mutex_v3</a>
+<li><a class="el" href="a00346.html">tbb::spin_rw_mutex_v3::scoped_lock</a>
+<li><a class="el" href="a00347.html">tbb::split</a>
+<li><a class="el" href="a00349.html">tbb::task</a>
<ul>
-<li><a class="el" href="a00280.html">tbb::empty_task</a>
-</ul>
-<li><a class="el" href="a00338.html">tbb::interface5::internal::task_base</a>
-<li><a class="el" href="a00339.html">tbb::task_group_context</a>
-<li><a class="el" href="a00340.html">tbb::task_group_context</a>
-<li><a class="el" href="a00341.html">tbb::task_list</a>
-<li><a class="el" href="a00342.html">tbb::task_scheduler_init</a>
-<li><a class="el" href="a00343.html">tbb::tbb_allocator< T ></a>
-<li><a class="el" href="a00344.html">tbb::tbb_allocator< void ></a>
-<li><a class="el" href="a00345.html">tbb::tbb_exception</a>
+<li><a class="el" href="a00292.html">tbb::empty_task</a>
+</ul>
+<li><a class="el" href="a00350.html">tbb::interface6::task_arena</a>
+<li><a class="el" href="a00351.html">tbb::interface5::internal::task_base</a>
+<li><a class="el" href="a00352.html">tbb::task_group_context</a>
+<li><a class="el" href="a00353.html">tbb::task_group_context</a>
+<li><a class="el" href="a00354.html">tbb::task_list</a>
+<li><a class="el" href="a00355.html">tbb::task_scheduler_init</a>
+<li><a class="el" href="a00356.html">tbb::tbb_allocator< T ></a>
+<li><a class="el" href="a00357.html">tbb::tbb_allocator< void ></a>
+<li><a class="el" href="a00358.html">tbb::tbb_exception</a>
<ul>
-<li><a class="el" href="a00266.html">tbb::captured_exception</a>
-<li><a class="el" href="a00299.html">tbb::movable_exception< ExceptionData ></a>
-</ul>
-<li><a class="el" href="a00346.html">tbb::internal::tbb_exception_ptr</a>
-<li><a class="el" href="a00347.html">tbb::tbb_hash_compare< Key ></a>
-<li><a class="el" href="a00349.html">tbb::tick_count</a>
-<li><a class="el" href="a00350.html">tbb::tick_count::interval_t</a>
-<li><a class="el" href="a00351.html">tbb::user_abort</a>
-<li><a class="el" href="a00352.html">tbb::internal::work_around_alignment_bug< Size, T ></a>
-<li><a class="el" href="a00353.html">tbb::zero_allocator< T, Allocator ></a>
-<li><a class="el" href="a00354.html">tbb::zero_allocator< void, Allocator ></a>
+<li><a class="el" href="a00278.html">tbb::captured_exception</a>
+<li><a class="el" href="a00311.html">tbb::movable_exception< ExceptionData ></a>
+</ul>
+<li><a class="el" href="a00359.html">tbb::internal::tbb_exception_ptr</a>
+<li><a class="el" href="a00360.html">tbb::tbb_hash_compare< Key ></a>
+<li><a class="el" href="a00362.html">tbb::tick_count</a>
+<li><a class="el" href="a00363.html">tbb::tick_count::interval_t</a>
+<li><a class="el" href="a00364.html">tbb::user_abort</a>
+<li><a class="el" href="a00365.html">tbb::internal::work_around_alignment_bug< Size, T ></a>
+<li><a class="el" href="a00366.html">tbb::zero_allocator< T, Allocator ></a>
+<li><a class="el" href="a00367.html">tbb::zero_allocator< void, Allocator ></a>
</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/index.html b/doc/html/index.html
index 611b2d7..05885c2 100644
--- a/doc/html/index.html
+++ b/doc/html/index.html
@@ -23,7 +23,7 @@ Additional pieces of information can be found here<ul>
<li><a class="el" href="concepts.html">TBB concepts</a></li></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/modules.html b/doc/html/modules.html
index f258e2f..9a0c2b5 100644
--- a/doc/html/modules.html
+++ b/doc/html/modules.html
@@ -15,16 +15,16 @@
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
<h1>Modules</h1>Here is a list of all modules:<ul>
-<li><a class="el" href="a00426.html">Algorithms</a>
-<li><a class="el" href="a00427.html">Containers</a>
-<li><a class="el" href="a00428.html">Memory Allocation</a>
-<li><a class="el" href="a00429.html">Synchronization</a>
-<li><a class="el" href="a00430.html">Timing</a>
-<li><a class="el" href="a00431.html">Task Scheduling</a>
+<li><a class="el" href="a00441.html">Algorithms</a>
+<li><a class="el" href="a00442.html">Containers</a>
+<li><a class="el" href="a00443.html">Memory Allocation</a>
+<li><a class="el" href="a00444.html">Synchronization</a>
+<li><a class="el" href="a00445.html">Timing</a>
+<li><a class="el" href="a00446.html">Task Scheduling</a>
</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html
index 9a710ac..c7a3f12 100644
--- a/doc/html/namespacemembers.html
+++ b/doc/html/namespacemembers.html
@@ -31,26 +31,26 @@ Here is a list of all documented namespace members with links to the namespaces
<p>
<ul>
<li>__TBB_DECL_ATOMIC_ALT()
-: <a class="el" href="a00414.html#ad165cf61abbe349d413df2589679add">tbb</a><li>acquire
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>atomic_fence()
-: <a class="el" href="a00414.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>ets_key_usage_type
-: <a class="el" href="a00414.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>full_fence
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">tbb</a><li>memory_semantics
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef">tbb</a><li>parallel_deterministic_reduce()
-: <a class="el" href="a00426.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb</a><li>parallel_do()
-: <a class="el" href="a00426.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00426.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00426.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00426.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00426.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00426.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>relaxed
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">tbb</a><li>release
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a><li>TBB_runtime_interface_version()
-: <a class="el" href="a00414.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
+: <a class="el" href="a00428.html#ad165cf61abbe349d413df2589679add">tbb</a><li>acquire
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>atomic_fence()
+: <a class="el" href="a00428.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>ets_key_usage_type
+: <a class="el" href="a00428.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>full_fence
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">tbb</a><li>memory_semantics
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef">tbb</a><li>parallel_deterministic_reduce()
+: <a class="el" href="a00441.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb</a><li>parallel_do()
+: <a class="el" href="a00441.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00441.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00441.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00441.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00441.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00441.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00441.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>relaxed
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">tbb</a><li>release
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a><li>TBB_runtime_interface_version()
+: <a class="el" href="a00428.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers_enum.html b/doc/html/namespacemembers_enum.html
index 07bd92e..137232c 100644
--- a/doc/html/namespacemembers_enum.html
+++ b/doc/html/namespacemembers_enum.html
@@ -31,11 +31,11 @@
<p>
<ul>
<li>ets_key_usage_type
-: <a class="el" href="a00414.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef">tbb</a></ul>
+: <a class="el" href="a00428.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef">tbb</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers_eval.html b/doc/html/namespacemembers_eval.html
index d8a2486..48ba999 100644
--- a/doc/html/namespacemembers_eval.html
+++ b/doc/html/namespacemembers_eval.html
@@ -31,13 +31,13 @@
<p>
<ul>
<li>acquire
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>full_fence
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">tbb</a><li>relaxed
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">tbb</a><li>release
-: <a class="el" href="a00414.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a></ul>
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>full_fence
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">tbb</a><li>relaxed
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">tbb</a><li>release
+: <a class="el" href="a00428.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers_func.html b/doc/html/namespacemembers_func.html
index 30db35e..2dc8dad 100644
--- a/doc/html/namespacemembers_func.html
+++ b/doc/html/namespacemembers_func.html
@@ -31,20 +31,20 @@
<p>
<ul>
<li>__TBB_DECL_ATOMIC_ALT()
-: <a class="el" href="a00414.html#ad165cf61abbe349d413df2589679add">tbb</a><li>atomic_fence()
-: <a class="el" href="a00414.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>parallel_deterministic_reduce()
-: <a class="el" href="a00426.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb</a><li>parallel_do()
-: <a class="el" href="a00426.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00426.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00426.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00426.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00426.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00426.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00426.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>TBB_runtime_interface_version()
-: <a class="el" href="a00414.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
+: <a class="el" href="a00428.html#ad165cf61abbe349d413df2589679add">tbb</a><li>atomic_fence()
+: <a class="el" href="a00428.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>parallel_deterministic_reduce()
+: <a class="el" href="a00441.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb</a><li>parallel_do()
+: <a class="el" href="a00441.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00441.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00441.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00441.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00441.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00441.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00441.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>TBB_runtime_interface_version()
+: <a class="el" href="a00428.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html
index f7efd0e..045ffe2 100644
--- a/doc/html/namespaces.html
+++ b/doc/html/namespaces.html
@@ -20,12 +20,12 @@
<li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
</ul></div>
<h1>Namespace List</h1>Here is a list of all documented namespaces with brief descriptions:<table>
- <tr><td class="indexkey"><a class="el" href="a00411.html">rml</a></td><td class="indexvalue">Assert that x is true </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00414.html">tbb</a></td><td class="indexvalue">The namespace tbb contains all components of the library </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00425.html">rml</a></td><td class="indexvalue">Assert that x is true </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00428.html">tbb</a></td><td class="indexvalue">The namespace tbb contains all components of the library </td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/pages.html b/doc/html/pages.html
index a336994..8cec29b 100644
--- a/doc/html/pages.html
+++ b/doc/html/pages.html
@@ -22,7 +22,7 @@
</ul>
<hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_do_body_req.html b/doc/html/parallel_do_body_req.html
index 1220998..bebadc2 100644
--- a/doc/html/parallel_do_body_req.html
+++ b/doc/html/parallel_do_body_req.html
@@ -29,7 +29,7 @@
</pre></div> Copy a work item. -<div class="fragment"><pre class="fragment"> ~item_type()
</pre></div> Destroy a work item <hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_for_body_req.html b/doc/html/parallel_for_body_req.html
index 239c5be..27aaabb 100644
--- a/doc/html/parallel_for_body_req.html
+++ b/doc/html/parallel_for_body_req.html
@@ -21,7 +21,7 @@
</pre></div> Destructor -<div class="fragment"><pre class="fragment"> <span class="keywordtype">void</span> Body::operator()( Range& r ) <span class="keyword">const</span>;
</pre></div> Function call operator applying the body to range <code>r</code>. <hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_reduce_body_req.html b/doc/html/parallel_reduce_body_req.html
index ab7a76f..da8e6fb 100644
--- a/doc/html/parallel_reduce_body_req.html
+++ b/doc/html/parallel_reduce_body_req.html
@@ -22,7 +22,7 @@
</pre></div> Function call operator applying body to range <code>r</code> and accumulating the result -<div class="fragment"><pre class="fragment"> <span class="keywordtype">void</span> Body::join( Body& b );
</pre></div> Join results. The result in <code>b</code> should be merged into the result of <code>this</code> <hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_reduce_lambda_req.html b/doc/html/parallel_reduce_lambda_req.html
index ed51780..2652997 100644
--- a/doc/html/parallel_reduce_lambda_req.html
+++ b/doc/html/parallel_reduce_lambda_req.html
@@ -16,7 +16,7 @@
</ul></div>
<h1><a class="anchor" name="parallel_reduce_lambda_req">Requirements on parallel_reduce anonymous function objects (lambda functions)</a></h1>TO BE DOCUMENTED <hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_scan_body_req.html b/doc/html/parallel_scan_body_req.html
index afb27ab..b1cfa6e 100644
--- a/doc/html/parallel_scan_body_req.html
+++ b/doc/html/parallel_scan_body_req.html
@@ -23,7 +23,7 @@
</pre></div> Do final processing for iterations of range <code>r</code> -<div class="fragment"><pre class="fragment"> <span class="keywordtype">void</span> Body::reverse_join( Body& a );
</pre></div> Merge preprocessing state of <code>a</code> into <code>this</code>, where <code>a</code> was created earlier from <code>b</code> by b's splitting constructor <hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_sort_iter_req.html b/doc/html/parallel_sort_iter_req.html
index 2dd69f6..7d1806a 100644
--- a/doc/html/parallel_sort_iter_req.html
+++ b/doc/html/parallel_sort_iter_req.html
@@ -20,7 +20,7 @@
</pre></div> Swaps <code>x</code> and <code>y</code> -<div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> Compare::operator()( <span class="keyword">const</span> T& x, <span class="keyword">const</span> T& y )
</pre></div> True if x comes before y; <hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/range_req.html b/doc/html/range_req.html
index 0d72cdc..dd46099 100644
--- a/doc/html/range_req.html
+++ b/doc/html/range_req.html
@@ -23,7 +23,7 @@
</pre></div> True if range is empty -<div class="fragment"><pre class="fragment"> R::R( R& r, split );
</pre></div> Split range <code>r</code> into two subranges. <hr>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/examples/GettingStarted/index.html b/examples/GettingStarted/index.html
index 3413ef8..855518a 100644
--- a/examples/GettingStarted/index.html
+++ b/examples/GettingStarted/index.html
@@ -13,7 +13,7 @@ This directory contains the examples referenced by the Intel® Threading Buil
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/GettingStarted/sub_string_finder/Makefile b/examples/GettingStarted/sub_string_finder/Makefile
index 4a41000..167ed03 100644
--- a/examples/GettingStarted/sub_string_finder/Makefile
+++ b/examples/GettingStarted/sub_string_finder/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=sub_string_finder_extended
ARGS=
LIGHT_PROG=sub_string_finder
@@ -35,20 +36,28 @@ CXX=icc
endif # icc
ifeq ($(offload), mic)
-override CXXFLAGS += -opt-report-phase:offload -D__TBB_MIC=1
+override CXXFLAGS += -opt-report-phase:offload -D__TBB_MIC_OFFLOAD=1
endif
-ifeq ($(CXX), icc)
-TBBLIB = -tbb
-TBBLIB_DEBUG = -tbb
-else
+ifeq (,$(filter icc icpc,$(CXX)))
TBBLIB = -ltbb
TBBLIB_DEBUG = -ltbb_debug
+else
+TBBLIB = -tbb
+TBBLIB_DEBUG = -ltbb_debug
+ifeq ($(offload), mic)
+TBBLIB_DEBUG += -offload-option,mic,ld,"-ltbb_debug -L${TBBROOT}/lib/mic/"
+endif
endif
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -70,7 +79,7 @@ clean:
$(RM) sub_string_finder sub_string_finder_extended sub_string_finder_pretty *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
light_test:
./$(LIGHT_PROG) $(ARGS)
diff --git a/examples/GettingStarted/sub_string_finder/Makefile.windows b/examples/GettingStarted/sub_string_finder/Makefile.windows
index 551ecdd..39a49ac 100644
--- a/examples/GettingStarted/sub_string_finder/Makefile.windows
+++ b/examples/GettingStarted/sub_string_finder/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/GettingStarted/sub_string_finder/index.html b/examples/GettingStarted/sub_string_finder/index.html
index cd751f6..1015526 100644
--- a/examples/GettingStarted/sub_string_finder/index.html
+++ b/examples/GettingStarted/sub_string_finder/index.html
@@ -56,7 +56,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp b/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp
index 491d923..9dc3ccc 100644
--- a/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp
+++ b/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/GettingStarted/sub_string_finder/sub_string_finder_extended.cpp b/examples/GettingStarted/sub_string_finder/sub_string_finder_extended.cpp
index 4eb5b70..f7945d8 100644
--- a/examples/GettingStarted/sub_string_finder/sub_string_finder_extended.cpp
+++ b/examples/GettingStarted/sub_string_finder/sub_string_finder_extended.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,9 +26,9 @@
the GNU General Public License.
*/
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (push,target(mic))
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
#include <iostream>
#include <string>
@@ -38,11 +38,11 @@
#include "tbb/blocked_range.h"
#include "tbb/tick_count.h"
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (pop)
class __declspec(target(mic)) SubStringFinder;
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
using namespace tbb;
using namespace std;
@@ -131,7 +131,7 @@ int main(int argc, char *argv[]) {
<< "Parallel version ran in " << (parallel_t1 - parallel_t0).seconds() << " seconds" << endl
<< "Resulting in a speedup of " << (serial_t1 - serial_t0).seconds() / (parallel_t1 - parallel_t0).seconds() << endl;
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
// Do offloadable version. Do the timing on host.
size_t *max3 = new size_t[num_elem];
size_t *pos3 = new size_t[num_elem];
@@ -160,7 +160,7 @@ int main(int argc, char *argv[]) {
delete[] max3;
delete[] pos3;
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
delete[] max;
delete[] pos;
diff --git a/examples/GettingStarted/sub_string_finder/sub_string_finder_pretty.cpp b/examples/GettingStarted/sub_string_finder/sub_string_finder_pretty.cpp
index 9160dc4..dc5eeb3 100644
--- a/examples/GettingStarted/sub_string_finder/sub_string_finder_pretty.cpp
+++ b/examples/GettingStarted/sub_string_finder/sub_string_finder_pretty.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/Makefile b/examples/Makefile
index 3e6a265..571783d 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -110,18 +110,17 @@ else
endif
endif
ifeq ($(tbb_os),macos)
- # GUI for examples does not support 64-bit platforms
- ifeq ($(arch),intel64)
- export UI=con
- endif
- ifeq ($(arch),ppc64)
- export UI=con
- endif
export DYLD_LIBRARY_PATH := $(DYLD_LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug
else
- # -L necessary for non-native compilers which don't search $LIBRARY_PATH
- override CXXFLAGS += -L$(work_dir)_release -L$(work_dir)_debug
export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug
+ ifeq ($(offload),mic)
+ mic_path=$(tbb_build_dir)$(SLASH)$(tbb_mic_build_prefix)
+ export MIC_LIBRARY_PATH := $(mic_path)_release:$(mic_path)_debug:$(MIC_LIBRARY_PATH)
+ export MIC_LD_LIBRARY_PATH := $(mic_path)_release:$(mic_path)_debug:$(MIC_LD_LIBRARY_PATH)
+ else
+ # -L necessary for non-native compilers which don't search $LIBRARY_PATH
+ override CXXFLAGS += -L$(work_dir)_release -L$(work_dir)_debug
+ endif
endif
export LIBS
export LIBRARY_PATH := $(LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug
@@ -144,7 +143,7 @@ $(COMMON_TARGETS):: % : $(addsuffix %,$(EXAMPLES_DIRS))
# proxy rule for calling appropriate example
$(EXAMPLES_TARGETS)::
@echo --------------------------------------------------
- -$(MAKE) SHELL=$(SHELL) -C $(@D) -f $(EXAMPLE_MAKEFILE) $(notdir $@) CXX="$(CPLUS)" CXXFLAGS="$(CXXFLAGS)"
+ -$(MAKE) target="$(target)" SHELL=$(SHELL) -C $(@D) -f $(EXAMPLE_MAKEFILE) $(notdir $@) CXX="$(CPLUS)" CXXFLAGS="$(CXXFLAGS)"
printenv:
ifeq ($(tbb_os),windows)
diff --git a/examples/common/copy_libraries.bat b/examples/common/copy_libraries.bat
index ff77b4d..561b966 100644
--- a/examples/common/copy_libraries.bat
+++ b/examples/common/copy_libraries.bat
@@ -1,6 +1,6 @@
@echo off
REM
-REM Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+REM Copyright 2005-2013 Intel Corporation. All Rights Reserved.
REM
REM This file is part of Threading Building Blocks.
REM
@@ -41,13 +41,13 @@ if ("%4") NEQ ("") set TBBROOT=%4
if ("%TBBROOT%") == ("") set TBBROOT=%~d0%~p0..\..\
:: Getting vs folders in case vc_mt binaries are not provided
-if ("%VS80COMNTOOLS%") NEQ ("") set vc_dir=vc8
if ("%VS90COMNTOOLS%") NEQ ("") set vc_dir=vc9
if ("%VS100COMNTOOLS%") NEQ ("") set vc_dir=vc10
+if ("%VS110COMNTOOLS%") NEQ ("") set vc_dir=vc11
:: Are we standalone/oss or inside compiler?
-if exist "%TBBROOT%\bin\%arch%\vc8\tbb%postfix%.dll" set interim_path=bin\%arch%
-if exist "%TBBROOT%\..\redist\%arch%\tbb\vc8\tbb%postfix%.dll" set interim_path=..\redist\%arch%\tbb
+if exist "%TBBROOT%\bin\%arch%\vc9\tbb%postfix%.dll" set interim_path=bin\%arch%
+if exist "%TBBROOT%\..\redist\%arch%\tbb\vc9\tbb%postfix%.dll" set interim_path=..\redist\%arch%\tbb
if ("%interim_path%") == ("") goto error
:: Do we provide vc_mt binaries?
diff --git a/examples/common/gui/Makefile.gmake b/examples/common/gui/Makefile.gmake
index 6348aca..e8c1e2f 100644
--- a/examples/common/gui/Makefile.gmake
+++ b/examples/common/gui/Makefile.gmake
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -37,10 +37,12 @@ EXE = $(NAME)$(SUFFIX).exe
else
RM = rm -f
RD = rmdir -r
-# detecting x64
-ifeq ($(shell uname -m),x86_64)
-x64 ?= 64
-endif
+
+# detecting 64-bit platform
+arch ?= $(shell uname -m)
+# Possible values of interest: intel64 x86_64 amd64 ia64 ppc64 sparc sparc64
+x64 ?= $(findstring 64,$(subst sparc,sparc64,$(arch)))
+
# detecting UI ("mac", "x" or "con")
ifeq ($(shell uname),Darwin)
UI ?= mac
@@ -71,6 +73,9 @@ EXE = $(NAME)$(SUFFIX).app/Contents/MacOS/$(NAME)$(SUFFIX)
else # ! Mac
UI = con
EXE = $(NAME)$(SUFFIX)
+ifeq (file,$(origin UI))
+$(warning Note: no graphics output capability detected, building for console output.)
+endif
endif # Mac
endif # X
diff --git a/examples/common/gui/Makefile.win b/examples/common/gui/Makefile.win
index dce2cd8..3ebbb45 100644
--- a/examples/common/gui/Makefile.win
+++ b/examples/common/gui/Makefile.win
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/common/gui/convideo.cpp b/examples/common/gui/convideo.cpp
index 6d06733..8886a8c 100644
--- a/examples/common/gui/convideo.cpp
+++ b/examples/common/gui/convideo.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -54,8 +54,9 @@ struct timeval g_time;
#endif //_WIN32||_WIN64
video::video()
- : red_mask(0xff0000), red_shift(16), green_mask(0xff00),
- green_shift(8), blue_mask(0xff), blue_shift(0), depth(24)
+ // OpenGL* RGBA byte order for little-endian CPU
+ : red_mask(0xff), red_shift(0), green_mask(0xff00),
+ green_shift(8), blue_mask(0xff0000), blue_shift(16), depth(24)
{
assert(g_video == 0);
g_video = this; title = "Video"; updating = calc_fps = false;
diff --git a/examples/common/gui/d2dvideo.cpp b/examples/common/gui/d2dvideo.cpp
index 2dd545a..109bb73 100644
--- a/examples/common/gui/d2dvideo.cpp
+++ b/examples/common/gui/d2dvideo.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/common/gui/ddvideo.cpp b/examples/common/gui/ddvideo.cpp
index 3538b2f..10000f1 100644
--- a/examples/common/gui/ddvideo.cpp
+++ b/examples/common/gui/ddvideo.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/common/gui/dxcheck.bat b/examples/common/gui/dxcheck.bat
index 60bd56a..231805d 100644
--- a/examples/common/gui/dxcheck.bat
+++ b/examples/common/gui/dxcheck.bat
@@ -1,6 +1,6 @@
@echo off
REM
-REM Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+REM Copyright 2005-2013 Intel Corporation. All Rights Reserved.
REM
REM This file is part of Threading Building Blocks.
REM
diff --git a/examples/common/gui/gdivideo.cpp b/examples/common/gui/gdivideo.cpp
index 3f15121..9c50595 100644
--- a/examples/common/gui/gdivideo.cpp
+++ b/examples/common/gui/gdivideo.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/common/gui/macvideo.cpp b/examples/common/gui/macvideo.cpp
index 58863b6..3606d0c 100644
--- a/examples/common/gui/macvideo.cpp
+++ b/examples/common/gui/macvideo.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -138,7 +138,7 @@ void video::main_loop()
pthread_attr_init(&attr);
pthread_create(&handle,&attr,&thread_func,(void*)NULL);
pthread_detach(handle);
- cocoa_main( NULL, NULL );
+ cocoa_main( 0, NULL );
}
//! Change window title
diff --git a/examples/common/gui/video.h b/examples/common/gui/video.h
index 4c8ef90..f31af90 100644
--- a/examples/common/gui/video.h
+++ b/examples/common/gui/video.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -48,7 +48,7 @@ typedef signed char depth_t;
//! Class for getting access to drawing memory
class drawing_memory
{
-#ifdef __TBB_MIC
+#ifdef __TBB_MIC_OFFLOAD
// The address is kept as uintptr_t since
// the compiler could not offload a pointer
#endif
@@ -176,7 +176,7 @@ inline color_t video::get_color(colorcomp_t red, colorcomp_t green, colorcomp_t
register depth_t bs = blue_shift, rs = red_shift;
if(blue_shift < 0) blue >>= -bs, bs = 0;
else /*red_shift < 0*/ red >>= -rs, rs = 0;
- return (red<<rs)&red_mask | (green<<green_shift)&green_mask | (blue<<bs)&blue_mask;
+ return ((red<<rs)&red_mask) | ((green<<green_shift)&green_mask) | ((blue<<bs)&blue_mask);
} else { // UYVY colorspace
register unsigned y, u, v;
y = red * 77 + green * 150 + blue * 29; // sum(77+150+29=256) * max(=255): limit->2^16
diff --git a/examples/common/gui/winvideo.h b/examples/common/gui/winvideo.h
index 00b6152..2c66c66 100644
--- a/examples/common/gui/winvideo.h
+++ b/examples/common/gui/winvideo.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/common/gui/xcode/tbbExample/Info.plist b/examples/common/gui/xcode/tbbExample/Info.plist
index b94b968..b2b5e04 100644
--- a/examples/common/gui/xcode/tbbExample/Info.plist
+++ b/examples/common/gui/xcode/tbbExample/Info.plist
@@ -50,7 +50,7 @@
<key>LSMinimumSystemVersion</key>
<string>10.7</string>
<key>NSHumanReadableCopyright</key>
- <string>Copyright 2005-2012 Intel Corporation. All Rights Reserved.</string>
+ <string>Copyright 2005-2013 Intel Corporation. All Rights Reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
diff --git a/examples/common/gui/xcode/tbbExample/OpenGLView.h b/examples/common/gui/xcode/tbbExample/OpenGLView.h
index 61f3616..eddfbb2 100644
--- a/examples/common/gui/xcode/tbbExample/OpenGLView.h
+++ b/examples/common/gui/xcode/tbbExample/OpenGLView.h
@@ -1,28 +1,37 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
- */
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
- at interface OpenGLView : NSOpenGLView
-{}
+ at interface OpenGLView : NSOpenGLView{
+ NSTimer *timer;
+}
@property (nonatomic,retain) NSTimer *timer;
diff --git a/examples/common/gui/xcode/tbbExample/OpenGLView.m b/examples/common/gui/xcode/tbbExample/OpenGLView.m
index 9c0c410..fdd5d0d 100644
--- a/examples/common/gui/xcode/tbbExample/OpenGLView.m
+++ b/examples/common/gui/xcode/tbbExample/OpenGLView.m
@@ -1,48 +1,42 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
- */
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
#import "OpenGLView.h"
#import <OpenGL/gl.h>
#import "tbbAppDelegate.h"
-int x,y;
-void on_mouse_func(int x, int y, int k);
-void on_key_func(int x);
-void* windows_ptr=0;
-
-//defined in cpp-file
+// defined in macvideo.cpp
extern char* window_title;
extern int cocoa_update;
extern int g_sizex, g_sizey;
extern unsigned int *g_pImg;
-
-void draw(void)
-{
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- glClearColor(0, 0, 0, 0);
- glClear(GL_COLOR_BUFFER_BIT);
- glBegin(GL_POINT);
- glDrawPixels(g_sizex, g_sizey, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, g_pImg);
- glEnd();
- glFlush();
-}
+void on_mouse_func(int x, int y, int k);
+void on_key_func(int x);
@implementation OpenGLView
@@ -50,36 +44,32 @@ void draw(void)
- (void) drawRect:(NSRect)start
{
- x=g_sizex;
- y=g_sizey;
- glClearColor(0, 0, 0, 0);
- glClear(GL_COLOR_BUFFER_BIT);
- draw();
+ glWindowPos2i(0, (int)self.visibleRect.size.height);
+ glPixelZoom( (float)self.visibleRect.size.width /(float)g_sizex,
+ -(float)self.visibleRect.size.height/(float)g_sizey);
+ glDrawPixels(g_sizex, g_sizey, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, g_pImg);
glFlush();
+
timer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(update_window) userInfo:nil repeats:YES];
}
-(void) update_window{
- if( cocoa_update ) draw();
- if( window_title )[_window setTitle:[NSString stringWithFormat:@"%s", window_title]];
- return;
+ if( cocoa_update ) [self setNeedsDisplay:YES]; // TODO also clear cocoa_update?
+ if( window_title ) [_window setTitle:[NSString stringWithFormat:@"%s", window_title]];
}
-(void) keyDown:(NSEvent *)theEvent{
on_key_func([theEvent.characters characterAtIndex:0]);
- return;
}
-(void) mouseDown:(NSEvent *)theEvent{
// mouse event for seismic and fractal
NSPoint point= theEvent.locationInWindow;
- x = point.x;
- y = point.y;
+ const int x = (int)point.x;
+ const int y = (int)point.y;
NSRect rect = self.visibleRect;
- on_mouse_func(x*g_sizex/rect.size.width,y*g_sizey/rect.size.height,1);
- draw();
- return;
-
+ on_mouse_func(x*g_sizex/(int)rect.size.width,((int)rect.size.height-y)*g_sizey/(int)rect.size.height,1);
+ [self setNeedsDisplay:YES];
}
- (BOOL) acceptsFirstResponder
@@ -95,12 +85,9 @@ void draw(void)
-(void) viewDidEndLiveResize
{
NSRect rect = self.visibleRect;
- x=rect.size.width;
- y=rect.size.height;
- glPixelZoom((float)x/(float)g_sizex, (float)y/(float)g_sizey);
+ const int x=(int)rect.size.width;
+ const int y=(int)rect.size.height;
[_window setTitle:[NSString stringWithFormat:@"X=%d Y=%d", x,y]];
- draw();
- return;
}
@end
diff --git a/examples/common/gui/xcode/tbbExample/main.m b/examples/common/gui/xcode/tbbExample/main.m
index 82436a4..303cea4 100644
--- a/examples/common/gui/xcode/tbbExample/main.m
+++ b/examples/common/gui/xcode/tbbExample/main.m
@@ -1,23 +1,30 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
- */
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
#import <Cocoa/Cocoa.h>
diff --git a/examples/common/gui/xcode/tbbExample/tbbAppDelegate.h b/examples/common/gui/xcode/tbbExample/tbbAppDelegate.h
index 3470b5a..7c8c32e 100644
--- a/examples/common/gui/xcode/tbbExample/tbbAppDelegate.h
+++ b/examples/common/gui/xcode/tbbExample/tbbAppDelegate.h
@@ -1,22 +1,30 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
- */
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
//
// Created by Xcode* 4.3.2
@@ -24,7 +32,9 @@
#import <Cocoa/Cocoa.h>
- at interface tbbAppDelegate : NSObject <NSApplicationDelegate>
+ at interface tbbAppDelegate : NSObject <NSApplicationDelegate>{
+ __unsafe_unretained NSWindow *_window;
+}
@property (assign) IBOutlet NSWindow *window;
diff --git a/examples/common/gui/xcode/tbbExample/tbbAppDelegate.m b/examples/common/gui/xcode/tbbExample/tbbAppDelegate.m
index f39dff6..e6e65e9 100644
--- a/examples/common/gui/xcode/tbbExample/tbbAppDelegate.m
+++ b/examples/common/gui/xcode/tbbExample/tbbAppDelegate.m
@@ -1,22 +1,30 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
- */
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
//
// Created by Xcode* 4.3.2
diff --git a/examples/common/gui/xcode/tbbExample/tbbExample-Info.plist b/examples/common/gui/xcode/tbbExample/tbbExample-Info.plist
index 9a0148a..ed40bbc 100644
--- a/examples/common/gui/xcode/tbbExample/tbbExample-Info.plist
+++ b/examples/common/gui/xcode/tbbExample/tbbExample-Info.plist
@@ -36,7 +36,7 @@
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>NSHumanReadableCopyright</key>
- <string>Copyright 2005-2012 Intel Corporation. All Rights Reserved.</string>
+ <string>Copyright 2005-2013 Intel Corporation. All Rights Reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
diff --git a/examples/common/gui/xcode/tbbExample/tbbExample-Prefix.pch b/examples/common/gui/xcode/tbbExample/tbbExample-Prefix.pch
index a5f51a8..0dd49f0 100644
--- a/examples/common/gui/xcode/tbbExample/tbbExample-Prefix.pch
+++ b/examples/common/gui/xcode/tbbExample/tbbExample-Prefix.pch
@@ -1,22 +1,30 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
- */
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
//
// Prefix header for all source files of the 'tbbExample' target in the 'tbbExample' project
diff --git a/examples/common/gui/xvideo.cpp b/examples/common/gui/xvideo.cpp
index 47dcb84..0378b6f 100644
--- a/examples/common/gui/xvideo.cpp
+++ b/examples/common/gui/xvideo.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/common/index.html b/examples/common/index.html
index 3817f05..86ca8ca 100644
--- a/examples/common/index.html
+++ b/examples/common/index.html
@@ -2,7 +2,7 @@
<BODY>
<H2>Overview</H2>
-This directory contains common code that is used in the Intel® Threading Building Blocks examples.
+This directory contains common code that is used in the Intel® Threading Building Blocks (Intel® TBB) examples.
<P>
This code is not intended to be used directly. It is incorporated automatically by the examples that need it.
@@ -14,22 +14,51 @@ This code is not intended to be used directly. It is incorporated automatically
<DD>GUI code for examples that have graphical user interfaces. Currently supports:
<UL>
<LI>GDI+*, DirectDraw*, Direct2D* (Windows* systems)
- <LI>OpenGL* (Mac OS* X systems)
- <LI>X window (Linux* or Mac OS* X systems)
+ <LI>OpenGL* (OS X* systems)
+ <LI>X window (Linux* or OS X* systems)
</UL>
See the examples that use the GUI
- (<A HREF=../parallel_for/tachyon/index.html>tachyon</A> and <A HREF=../parallel_for/seismic/index.html>seismic</A>)
+ (<A HREF=../parallel_for/tachyon/index.html>tachyon</A>, <A HREF=../parallel_for/seismic/index.html>seismic</A>)
for more details.
</DL>
<DL>
<DT><A HREF="utility">utility</A>
-<DD>common driver code for examples.
+<DD>Common driver & utility code for examples. Currently provides:
+ <UL>
+ <LI>class FastRandom - a random number generator that uses linear congruental method
+ (<A HREF="utility/fast_random.h">fast_random.h</A>)
+ <LI>class thread_number_range - a class to specify the numbers of threads an example should use
+ (<A HREF="utility/utility.h">utility.h</A>)
+ <LI>support for command line interface - class cli_argument_pack and function parse_cli_arguments
+ (<A HREF="utility/utility.h">utility.h</A>)
+ </UL>
</DL>
+<H2>Common information</H2>
+<H3>Number of threads</H3>
+Most Intel TBB examples allow to specify <I>n-of-threads</I>, the set of thread numbers that should be used to run an example.
+<BR>Usually, it is a range of the form <I>low[:high[:(+|*|#)S]]</I>, where <I>low</I> and optional <I>high</I>
+are non-negative integers or 'auto' for the default choice, and optional step expression <I>(+|*|#)S</I>
+specifies how thread numbers are chosen within the range:
+ <UL>
+ <LI>With <I>+/*</I>, the previous number is incremented/multiplied by <I>S</I>.
+ E.g., expression '12:16:+1' means 12,13,14,15,16 threads, and '1:16:*2' means 1,2,4,8,16 threads.
+ <LI>With <I>#</I>, <I>S</I> is the desired number of steps between any subsequent powers of 2;
+ it must be a power of 2 on its own, with most meaningful values being 2,4, and 8.
+ For a given number of threads, the actual step value is computed as the quotient
+ of the nearest smaller power of 2 divided by the number of steps, but is at least 1.
+ E.g., '1:32:#4' means 1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32 threads;
+ note the step doubling at 8 and 16 to keep 4 steps between powers of 2.
+ </UL>
+A default value for the number of threads can be customized in an example; if not customized, it is '1:auto:#4'.
+The 'auto' parameter is substituted with a value returned by a specified function, which typically is
+tbb::task_scheduler_init::default_num_threads().
+<P/>
+
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/common/utility/fast_random.h b/examples/common/utility/fast_random.h
index c1b8d28..b3d2b83 100644
--- a/examples/common/utility/fast_random.h
+++ b/examples/common/utility/fast_random.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/common/utility/utility.h b/examples/common/utility/utility.h
index 4f6939b..2f37ff0 100644
--- a/examples/common/utility/utility.h
+++ b/examples/common/utility/utility.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -28,6 +28,7 @@
#ifndef UTILITY_H_
#define UTILITY_H_
+
#include <string>
#include <cstring>
#include <vector>
@@ -39,16 +40,37 @@
#include <stdexcept>
#include <memory>
#include <cassert>
+#include <iostream>
+#include <cstdlib>
+// TBB headers should not be used, as some examples may need to be built without TBB.
namespace utility{
namespace internal{
+
+#if ((__GNUC__*100+__GNUC_MINOR__>=404 && __GXX_EXPERIMENTAL_CXX0X__) || _MSC_VER >= 1600) && (!__INTEL_COMPILER || __INTEL_COMPILER >= 1200 )
+ // std::unique_ptr is available, and compiler can use it
+ #define smart_ptr std::unique_ptr
+ using std::swap;
+#else
+ #if __INTEL_COMPILER && __GXX_EXPERIMENTAL_CXX0X__
+ // std::unique_ptr is unavailable, so suppress std::auto_prt<> deprecation warning
+ #pragma warning(disable: 1478)
+ #endif
+ #define smart_ptr std::auto_ptr
+ // in some C++ libraries, std::swap does not work with std::auto_ptr
+ template<typename T>
+ void swap( std::auto_ptr<T>& ptr1, std::auto_ptr<T>& ptr2 ) {
+ std::auto_ptr<T> tmp; tmp = ptr2; ptr2 = ptr1; ptr1 = tmp;
+ }
+#endif
+
//TODO: add tcs
template<class dest_type>
dest_type& string_to(std::string const& s, dest_type& result){
std::stringstream stream(s);
stream>>result;
if ((!stream)||(stream.fail())){
- throw std::invalid_argument("error converting string \""+std::string(s)+"\"");
+ throw std::invalid_argument("error converting string '"+std::string(s)+"'");
}
return result;
}
@@ -59,12 +81,10 @@ namespace utility{
return string_to(s,result);
}
-
template<typename>
- struct is_bool { enum{value=false};};
-
+ struct is_bool { static bool value(){return false;}};
template<>
- struct is_bool<bool> { enum{value=true};};
+ struct is_bool<bool> { static bool value(){return true;}};
class type_base {
type_base& operator=(const type_base&);
@@ -72,10 +92,10 @@ namespace utility{
const std::string name;
const std::string description;
- type_base (std::string name, std::string description) : name(name), description(description) {}
+ type_base (std::string a_name, std::string a_description) : name(a_name), description(a_description) {}
virtual void parse_and_store (const std::string & s)=0;
virtual std::string value() const =0;
- virtual std::auto_ptr<type_base> clone()const =0;
+ virtual smart_ptr<type_base> clone()const =0;
virtual ~type_base(){}
};
template <typename type>
@@ -87,13 +107,13 @@ namespace utility{
type & target;
validating_function_type validating_function;
public:
- type_impl(std::string name, std::string description, type & target, validating_function_type validating_function = NULL)
- : type_base (name,description), target(target),validating_function(validating_function)
+ type_impl(std::string a_name, std::string a_description, type & a_target, validating_function_type a_validating_function = NULL)
+ : type_base (a_name,a_description), target(a_target),validating_function(a_validating_function)
{};
void parse_and_store (const std::string & s){
try{
- const bool is_bool_type =is_bool<type>::value;
- if ((is_bool_type)&&(s.empty())){
+ const bool is_bool = internal::is_bool<type>::value();
+ if (is_bool && s.empty()){
//to avoid directly assigning true
//(as it will impose additional layer of indirection)
//so, simply pass it as string
@@ -101,21 +121,16 @@ namespace utility{
}else {
internal::string_to(s,target);
}
- }catch(std::invalid_argument& ){
+ }catch(std::invalid_argument& e){
std::stringstream str;
- str
- <<"\""<<s<<"\""<<" is incorrect input for argument "
- <<"\""<<name<<"\""
- ;
+ str <<"'"<<s<<"' is incorrect input for argument '"<<name<<"'"
+ <<" ("<<e.what()<<")";
throw std::invalid_argument(str.str());
}
if (validating_function){
if (!((validating_function)(target))){
std::stringstream str;
- str
- <<"\""<<target<<"\" is invalid value for argument "
- <<"\""<<name<<"\""
- ;
+ str <<"'"<<target<<"' is invalid value for argument '"<<name<<"'";
throw std::invalid_argument(str.str());
}
}
@@ -125,28 +140,31 @@ namespace utility{
str<<target;
return str.str();
}
- virtual std::auto_ptr<type_base> clone()const {
- return std::auto_ptr<type_base>(new type_impl(*this));
+ virtual smart_ptr<type_base> clone() const {
+ return smart_ptr<type_base>(new type_impl(*this));
}
};
class argument{
private:
- std::auto_ptr<type_base> p_type;
+ smart_ptr<type_base> p_type;
bool matched_;
public:
- argument(argument const& other): p_type(other.p_type.get() ? other.p_type->clone():std::auto_ptr<type_base>()),matched_(other.matched_){}
+ argument(argument const& other)
+ : p_type(other.p_type.get() ? (other.p_type->clone()).release() : NULL)
+ ,matched_(other.matched_)
+ {}
argument& operator=(argument a){
this->swap(a);
return *this;
}
void swap(argument& other){
- std::auto_ptr<type_base> tmp; tmp=p_type; p_type=other.p_type; other.p_type=tmp;
+ internal::swap(p_type, other.p_type);
std::swap(matched_,other.matched_);
}
template<class type>
- argument(std::string name, std::string description, type& dest, bool(*validating_function)(const type&)= NULL)
- :p_type(new type_impl<type>(name,description,dest,validating_function))
+ argument(std::string a_name, std::string a_description, type& dest, bool(*a_validating_function)(const type&)= NULL)
+ :p_type(new type_impl<type>(a_name,a_description,dest,a_validating_function))
,matched_(false)
{}
std::string value()const{
@@ -164,8 +182,8 @@ namespace utility{
}
bool is_matched() const{return matched_;}
};
+ } // namespace internal
- }
class cli_argument_pack{
typedef std::map<std::string,internal::argument> args_map_type;
typedef std::vector<std::string> args_display_order_type;
@@ -179,7 +197,7 @@ namespace utility{
void add_arg(internal::argument const& a){
std::pair<args_map_type::iterator, bool> result = args_map.insert(std::make_pair(a.name(),a));
if (!result.second){
- throw std::invalid_argument("argument with name: \""+a.name()+"\" already registered");
+ throw std::invalid_argument("argument with name: '"+a.name()+"' already registered");
}
args_display_order.push_back(a.name());
}
@@ -188,7 +206,7 @@ namespace utility{
cli_argument_pack& arg(type& dest,std::string const& name, std::string const& description, bool(*validate)(const type &)= NULL){
internal::argument a(name,description,dest,validate);
add_arg(a);
- if (internal::is_bool<type>::value){
+ if (internal::is_bool<type>::value()){
bool_args_names.insert(name);
}
return *this;
@@ -200,17 +218,17 @@ namespace utility{
cli_argument_pack& positional_arg(type& dest,std::string const& name, std::string const& description, bool(*validate)(const type &)= NULL){
internal::argument a(name,description,dest,validate);
add_arg(a);
- if (internal::is_bool<type>::value){
+ if (internal::is_bool<type>::value()){
bool_args_names.insert(name);
}
positional_arg_names.push_back(name);
return *this;
}
- void parse(int argc, char const* argv[]){
+ void parse(std::size_t argc, char const* argv[]){
{
std::size_t current_positional_index=0;
- for (int j=1;j<argc;j++){
+ for (std::size_t j=1;j<argc;j++){
internal::argument* pa = NULL;
std::string argument_value;
@@ -219,8 +237,8 @@ namespace utility{
const char * const assign_sign = std::find(begin,end,'=');
- struct throw_unknow_parameter{ static void _(std::string const& location){
- throw std::invalid_argument(std::string("unknown parameter starting at:\"")+location+"\"");
+ struct throw_unknown_parameter{ static void _(std::string const& location){
+ throw std::invalid_argument(std::string("unknown parameter starting at:'")+location+"'");
}};
//first try to interpret it like parameter=value string
if (assign_sign!=end){
@@ -231,7 +249,7 @@ namespace utility{
pa= &((*it).second);
argument_value = std::string(assign_sign+1,end);
}else {
- throw_unknow_parameter::_(argv[j]);
+ throw_unknown_parameter::_(argv[j]);
}
}
//then see is it a named flag
@@ -244,24 +262,24 @@ namespace utility{
//then try it as positional argument without name specified
else if (current_positional_index < positional_arg_names.size()){
std::stringstream str(argv[j]);
- args_map_type::iterator it = args_map.find(positional_arg_names.at(current_positional_index));
+ args_map_type::iterator found_positional_arg = args_map.find(positional_arg_names.at(current_positional_index));
//TODO: probably use of smarter assert would help here
- assert(it!=args_map.end()/*&&"positional_arg_names and args_map are out of sync"*/);
- if (it==args_map.end()){
+ assert(found_positional_arg!=args_map.end()/*&&"positional_arg_names and args_map are out of sync"*/);
+ if (found_positional_arg==args_map.end()){
throw std::logic_error("positional_arg_names and args_map are out of sync");
}
- pa= &((*it).second);
+ pa= &((*found_positional_arg).second);
argument_value = argv[j];
current_positional_index++;
}else {
//TODO: add tc to check
- throw_unknow_parameter::_(argv[j]);
+ throw_unknown_parameter::_(argv[j]);
}
}
assert(pa);
if (pa->is_matched()){
- throw std::invalid_argument(std::string("several values specified for: \"")+pa->name()+"\" argument");
+ throw std::invalid_argument(std::string("several values specified for: '")+pa->name()+"' argument");
}
pa->parse_and_store(argument_value);
}
@@ -302,20 +320,116 @@ namespace utility{
;
return str.str();
}
- };
-}
+ }; // class cli_argument_pack
+
+ namespace internal {
+ template<typename T>
+ bool is_power_of_2( T val ) {
+ size_t intval = size_t(val);
+ return (intval&(intval-1)) == size_t(0);
+ }
+ int step_function_plus(int previous, double step){
+ return static_cast<int>(previous+step);
+ }
+ int step_function_multiply(int previous, double multiply){
+ return static_cast<int>(previous*multiply);
+ }
+ // "Power-of-2 ladder": nsteps is the desired number of steps between any subsequent powers of 2.
+ // The actual step is the quotient of the nearest smaller power of 2 divided by that number (but at least 1).
+ // E.g., '1:32:#4' means 1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32
+ int step_function_power2_ladder(int previous, double nsteps){
+ int steps = int(nsteps);
+ assert( is_power_of_2(steps) ); // must be a power of 2
+ // The actual step is 1 until the value is twice as big as nsteps
+ if( previous < 2*steps )
+ return previous+1;
+ // calculate the previous power of 2
+ int prev_power2 = previous/2; // start with half the given value
+ int rshift = 1; // and with the shift of 1;
+ while( int shifted = prev_power2>>rshift ) { // shift the value right; while the result is non-zero,
+ prev_power2 |= shifted; // add the bits set in 'shifted';
+ rshift <<= 1; // double the shift, as twice as many top bits are set;
+ } // repeat.
+ ++prev_power2; // all low bits set; now it's just one less than the desired power of 2
+ assert( is_power_of_2(prev_power2) );
+ assert( (prev_power2<=previous)&&(2*prev_power2>previous) );
+ // The actual step value is the previous power of 2 divided by steps
+ return previous + (prev_power2/steps);
+ }
+ typedef int (* step_function_ptr_type)(int,double);
+
+ struct step_function_descriptor {
+ char mnemonic;
+ step_function_ptr_type function;
+ public:
+ step_function_descriptor(char a_mnemonic, step_function_ptr_type a_function) : mnemonic(a_mnemonic), function(a_function) {}
+ private:
+ void operator=(step_function_descriptor const&);
+ };
+ step_function_descriptor step_function_descriptors[] = {
+ step_function_descriptor('*',step_function_multiply),
+ step_function_descriptor('+',step_function_plus),
+ step_function_descriptor('#',step_function_power2_ladder)
+ };
+
+ template<typename T, size_t N>
+ inline size_t array_length(const T(&)[N])
+ {
+ return N;
+ }
+
+ struct thread_range_step {
+ step_function_ptr_type step_function;
+ double step_function_argument;
+
+ thread_range_step ( step_function_ptr_type step_function_, double step_function_argument_)
+ :step_function(step_function_),step_function_argument(step_function_argument_)
+ {
+ if (!step_function_)
+ throw std::invalid_argument("step_function for thread range step should not be NULL");
+ }
+ int operator()(int previous)const {
+ assert(0<=previous); // test 0<=first and loop discipline
+ const int ret = step_function(previous,step_function_argument);
+ assert(previous<ret);
+ return ret;
+ }
+ friend std::istream& operator>>(std::istream& input_stream, thread_range_step& step){
+ char function_char;
+ double function_argument;
+ input_stream >> function_char >> function_argument;
+ size_t i = 0;
+ while ((i<array_length(step_function_descriptors)) && (step_function_descriptors[i].mnemonic!=function_char)) ++i;
+ if (i >= array_length(step_function_descriptors)){
+ throw std::invalid_argument("unknown step function mnemonic: "+std::string(1,function_char));
+ } else if ((function_char=='#') && !is_power_of_2(function_argument)) {
+ throw std::invalid_argument("the argument of # should be a power of 2");
+ }
+ step.step_function = step_function_descriptors[i].function;
+ step.step_function_argument = function_argument;
+ return input_stream;
+ }
+ };
+ } // namespace internal
-namespace utility{
struct thread_number_range{
int (*auto_number_of_threads)();
- int first;
- int last;
+ int first; // 0<=first (0 can be used as a special value)
+ int last; // first<=last
- thread_number_range( int (*auto_number_of_threads_)(),int low_=1, int high_=-1 )
+ internal::thread_range_step step;
+
+ thread_number_range( int (*auto_number_of_threads_)(),int low_=1, int high_=-1
+ , internal::thread_range_step step_ = internal::thread_range_step(internal::step_function_power2_ladder,4)
+ )
: auto_number_of_threads(auto_number_of_threads_), first(low_), last((high_>-1) ? high_ : auto_number_of_threads_())
+ ,step(step_)
{
- if (first>last){
- throw std::invalid_argument("");
+ if (first<0) {
+ throw std::invalid_argument("negative value not allowed");
+ }
+ if (first>last) {
+ throw std::invalid_argument("decreasing sequence not allowed");
}
}
friend std::istream& operator>>(std::istream& i, thread_number_range& range){
@@ -326,49 +440,54 @@ namespace utility{
int auto_value;
string_to_number_of_threads(int auto_value_):auto_value(auto_value_){}
int operator()(const std::string & value)const{
- int result=0;
- if (value=="auto"){
- result = auto_value;
- }
- else{
- internal::string_to(value,result);
- }
- return result;
+ return (value=="auto")? auto_value : internal::string_to<int>(value);
}
};
string_to_number_of_threads string_to_number_of_threads(range.auto_number_of_threads());
- int low =0;
- int high=0;
- std::size_t semicolon = s.find(':');
- if (semicolon == std::string::npos ){
- high= (low = string_to_number_of_threads(s));
- }else {
+ int low, high;
+ std::size_t colon = s.find(':');
+ if ( colon == std::string::npos ){
+ low = high = string_to_number_of_threads(s);
+ } else {
//it is a range
- std::string::iterator semicolon_it = s.begin()+semicolon;
- low = string_to_number_of_threads(std::string(s.begin(),semicolon_it));
- high = string_to_number_of_threads(std::string(semicolon_it+1,s.end()));
+ std::size_t second_colon = s.find(':',colon+1);
+
+ low = string_to_number_of_threads(std::string(s, 0, colon)); //not copying the colon
+ high = string_to_number_of_threads(std::string(s, colon+1, second_colon - (colon+1))); //not copying the colons
+ if (second_colon != std::string::npos){
+ internal::string_to(std::string(s,second_colon + 1),range.step);
+ }
}
- range = thread_number_range(range.auto_number_of_threads,low,high);
+ range = thread_number_range(range.auto_number_of_threads,low,high,range.step);
}catch(std::invalid_argument&){
i.setstate(std::ios::failbit);
+ throw;
}
return i;
}
friend std::ostream& operator<<(std::ostream& o, thread_number_range const& range){
- o<<range.first<<":"<<range.last;
+ using namespace internal;
+ size_t i = 0;
+ for (; i < array_length(step_function_descriptors) && step_function_descriptors[i].function != range.step.step_function; ++i ) {}
+ if (i >= array_length(step_function_descriptors)){
+ throw std::invalid_argument("unknown step function for thread range");
+ }
+ o<<range.first<<":"<<range.last<<":"<<step_function_descriptors[i].mnemonic<<range.step.step_function_argument;
return o;
}
+ }; // struct thread_number_range
+ //TODO: fix unused warning here
+ //TODO: update the thread range description in the .html files
+ static const char* thread_number_range_desc="number of threads to use; a range of the form low[:high[:(+|*|#)step]],"
+ "\n\twhere low and optional high are non-negative integers or 'auto' for the default choice,"
+ "\n\tand optional step expression specifies how thread numbers are chosen within the range."
+ "\n\tSee examples/common/index.html for detailed description."
+ ;
- };
-}
-#include <iostream>
-namespace utility{
inline void report_elapsed_time(double seconds){
std::cout << "elapsed time : "<<seconds<<" seconds \n";
}
-}
-#include <cstdlib>
-namespace utility{
+
inline void parse_cli_arguments(int argc, const char* argv[], utility::cli_argument_pack cli_pack){
bool show_help = false;
cli_pack.arg(show_help,"-h","show this message");
@@ -379,7 +498,7 @@ namespace utility{
}catch(std::exception& e){
std::cerr
<<"error occurred while parsing command line."<<std::endl
- <<"error text:\""<<e.what()<<"\""<<std::endl
+ <<"error text: "<<e.what()<<std::endl
<<std::flush;
invalid_input =true;
}
@@ -393,4 +512,5 @@ namespace utility{
parse_cli_arguments(argc, const_cast<const char**>(argv), cli_pack);
}
}
+
#endif /* UTILITY_H_ */
diff --git a/examples/concurrent_hash_map/count_strings/Makefile b/examples/concurrent_hash_map/count_strings/Makefile
index 2ecd86c..62e9691 100644
--- a/examples/concurrent_hash_map/count_strings/Makefile
+++ b/examples/concurrent_hash_map/count_strings/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=count_strings
ARGS=
PERF_RUN_ARGS=auto 10000000 silent
@@ -35,8 +36,13 @@ CXX=icc
endif # icc
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -50,7 +56,7 @@ clean:
$(RM) $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
perf_build: release
diff --git a/examples/concurrent_hash_map/count_strings/Makefile.windows b/examples/concurrent_hash_map/count_strings/Makefile.windows
index ba04a1c..38535a9 100644
--- a/examples/concurrent_hash_map/count_strings/Makefile.windows
+++ b/examples/concurrent_hash_map/count_strings/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/concurrent_hash_map/count_strings/count_strings.cpp b/examples/concurrent_hash_map/count_strings/count_strings.cpp
index bd671e1..58caaa4 100644
--- a/examples/concurrent_hash_map/count_strings/count_strings.cpp
+++ b/examples/concurrent_hash_map/count_strings/count_strings.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -201,8 +201,8 @@ int main( int argc, char* argv[] ) {
utility::parse_cli_arguments(argc,argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc)
.positional_arg(N,"n-of-strings","number of strings")
.arg(verbose,"verbose","verbose mode")
.arg(silent,"silent","no output except elapsed time")
@@ -214,7 +214,7 @@ int main( int argc, char* argv[] ) {
CreateData();
if ( threads.first ) {
- for(int p = threads.first; p <= threads.last; ++p ) {
+ for(int p = threads.first; p <= threads.last; p = threads.step(p)) {
if ( !silent ) printf("threads = %d ", p );
task_scheduler_init init( p );
CountOccurrences( p );
diff --git a/examples/concurrent_hash_map/count_strings/index.html b/examples/concurrent_hash_map/count_strings/index.html
index bf78a8e..fa97e58 100644
--- a/examples/concurrent_hash_map/count_strings/index.html
+++ b/examples/concurrent_hash_map/count_strings/index.html
@@ -44,7 +44,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/concurrent_hash_map/index.html b/examples/concurrent_hash_map/index.html
index 4b4db68..5859cc3 100644
--- a/examples/concurrent_hash_map/index.html
+++ b/examples/concurrent_hash_map/index.html
@@ -13,7 +13,7 @@ This directory has examples of the template <code>concurrent_hash_map</code>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/concurrent_priority_queue/shortpath/Makefile b/examples/concurrent_priority_queue/shortpath/Makefile
index 5bc5133..c3c6884 100644
--- a/examples/concurrent_priority_queue/shortpath/Makefile
+++ b/examples/concurrent_priority_queue/shortpath/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=shortpath
ARGS=4 N=1000 start=0 end=999 verbose
PERF_RUN_ARGS=auto N=1000 start=0 end=99 silent
@@ -33,13 +34,18 @@ PERF_RUN_ARGS=auto N=1000 start=0 end=99 silent
ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # which icc
-ifeq ($(CXX),icc)
+ifneq (,$(filter icc icpc,$(CXX)))
CXX0XFLAGS?=-std=c++0x -D_TBB_CPP0X
endif # icc
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -53,7 +59,7 @@ clean:
$(RM) $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
perf_build: release
diff --git a/examples/concurrent_priority_queue/shortpath/Makefile.windows b/examples/concurrent_priority_queue/shortpath/Makefile.windows
index d77b56d..3808123 100644
--- a/examples/concurrent_priority_queue/shortpath/Makefile.windows
+++ b/examples/concurrent_priority_queue/shortpath/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/concurrent_priority_queue/shortpath/index.html b/examples/concurrent_priority_queue/shortpath/index.html
index 1262435..26d5a1f 100644
--- a/examples/concurrent_priority_queue/shortpath/index.html
+++ b/examples/concurrent_priority_queue/shortpath/index.html
@@ -72,7 +72,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/concurrent_priority_queue/shortpath/shortpath.cpp b/examples/concurrent_priority_queue/shortpath/shortpath.cpp
index a28166e..ef306aa 100644
--- a/examples/concurrent_priority_queue/shortpath/shortpath.cpp
+++ b/examples/concurrent_priority_queue/shortpath/shortpath.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,9 +26,14 @@
the GNU General Public License.
*/
+// This header should come before any other one.
+// For details, see Known Issues in the Release Notes.
+#include "tbb/tbb_stddef.h"
+
#include <cstdio>
#include <vector>
#include <math.h>
+
#include "tbb/atomic.h"
#include "tbb/tick_count.h"
#include "tbb/task_scheduler_init.h"
@@ -327,11 +332,8 @@ int main(int argc, char *argv[]) {
utility::thread_number_range threads(get_default_num_threads);
utility::parse_cli_arguments(argc, argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"#threads"," number of threads to use; a range of the "
- "form low[:high]\n where low and optional high are "
- "non-negative integers,\n or 'auto' for the TBB "
- "default")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"#threads",utility::thread_number_range_desc)
.arg(verbose,"verbose"," print diagnostic output to screen")
.arg(silent,"silent"," limits output to timing info; overrides verbose")
.arg(N,"N"," number of vertices")
@@ -354,7 +356,7 @@ int main(int argc, char *argv[]) {
max_spawn = N/grainsize;
tick_count t0, t1;
InitializeGraph();
- for (int n_thr=threads.first; n_thr<=threads.last; ++n_thr) {
+ for (int n_thr=threads.first; n_thr<=threads.last; n_thr=threads.step(n_thr)) {
ResetGraph();
task_scheduler_init init(n_thr);
t0 = tick_count::now();
diff --git a/examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj b/examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj
index 41a4747..0b5b8f9 100644
--- a/examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj
+++ b/examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj
@@ -1,305 +1,305 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 46;
- objects = {
-
-/* Begin PBXBuildFile section */
- 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
- 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
- 61C4771B13CE199D0022F8F6 /* shortpath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61C4771A13CE199D0022F8F6 /* shortpath.cpp */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 8DD76F690486A84900D96B5E /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 12;
- dstPath = "";
- dstSubfolderSpec = 16;
- files = (
- 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 0E8A7310136F4A4600453C80 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = ../../../../lib/libtbb.dylib; sourceTree = "<group>"; };
- 61C4771A13CE199D0022F8F6 /* shortpath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = shortpath.cpp; path = ../shortpath.cpp; sourceTree = "<group>"; };
- 8DD76F6C0486A84900D96B5E /* Shortpath */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Shortpath; sourceTree = BUILT_PRODUCTS_DIR; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 8DD76F660486A84900D96B5E /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 08FB7794FE84155DC02AAC07 /* Shortpath */ = {
- isa = PBXGroup;
- children = (
- 08FB7795FE84155DC02AAC07 /* Source */,
- A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
- 1AB674ADFE9D54B511CA2CBB /* Products */,
- );
- name = Shortpath;
- sourceTree = "<group>";
- };
- 08FB7795FE84155DC02AAC07 /* Source */ = {
- isa = PBXGroup;
- children = (
- 61C4771A13CE199D0022F8F6 /* shortpath.cpp */,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 1AB674ADFE9D54B511CA2CBB /* Products */ = {
- isa = PBXGroup;
- children = (
- 8DD76F6C0486A84900D96B5E /* Shortpath */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
- isa = PBXGroup;
- children = (
- 0E8A7310136F4A4600453C80 /* libtbb.dylib */,
- );
- name = "External Frameworks and Libraries";
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 8DD76F620486A84900D96B5E /* Shortpath */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Shortpath" */;
- buildPhases = (
- 8DD76F640486A84900D96B5E /* Sources */,
- 8DD76F660486A84900D96B5E /* Frameworks */,
- 8DD76F690486A84900D96B5E /* CopyFiles */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = Shortpath;
- productInstallPath = "$(HOME)/bin";
- productName = Shortpath;
- productReference = 8DD76F6C0486A84900D96B5E /* Shortpath */;
- productType = "com.apple.product-type.tool";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 08FB7793FE84155DC02AAC07 /* Project object */ = {
- isa = PBXProject;
- attributes = {
- LastUpgradeCheck = 0410;
- };
- buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "shortpath" */;
- compatibilityVersion = "Xcode 3.2";
- developmentRegion = English;
- hasScannedForEncodings = 1;
- knownRegions = (
- en,
- );
- mainGroup = 08FB7794FE84155DC02AAC07 /* Shortpath */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 8DD76F620486A84900D96B5E /* Shortpath */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXSourcesBuildPhase section */
- 8DD76F640486A84900D96B5E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 61C4771B13CE199D0022F8F6 /* shortpath.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin XCBuildConfiguration section */
- 1DEB923208733DC60010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = ../../../../include;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- ../../../../lib,
- );
- PRODUCT_NAME = Shortpath;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 1DEB923308733DC60010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = ../../../../include;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- ../../../../lib,
- );
- PRODUCT_NAME = Shortpath;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 1DEB923608733DC60010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Debug;
- };
- 1DEB923708733DC60010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Release;
- };
- A1F593C60B8F0E6E00073279 /* Debug64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT)";
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = ../../../../include;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- ../../../../lib,
- );
- PRODUCT_NAME = Shortpath;
- ZERO_LINK = NO;
- };
- name = Debug64;
- };
- A1F593C70B8F0E6E00073279 /* Release64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT)";
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = ../../../../include;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- ../../../../lib,
- );
- PRODUCT_NAME = Shortpath;
- ZERO_LINK = NO;
- };
- name = Release64;
- };
- A1F593C80B8F0E6E00073279 /* Debug64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- OTHER_CPLUSPLUSFLAGS = (
- "$(OTHER_CFLAGS)",
- "-m64",
- );
- OTHER_LDFLAGS = "-m64";
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Debug64;
- };
- A1F593C90B8F0E6E00073279 /* Release64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- OTHER_CPLUSPLUSFLAGS = (
- "$(OTHER_CFLAGS)",
- "-m64",
- );
- OTHER_LDFLAGS = "-m64";
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Release64;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Shortpath" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB923208733DC60010E9CD /* Debug */,
- A1F593C60B8F0E6E00073279 /* Debug64 */,
- 1DEB923308733DC60010E9CD /* Release */,
- A1F593C70B8F0E6E00073279 /* Release64 */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "shortpath" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB923608733DC60010E9CD /* Debug */,
- A1F593C80B8F0E6E00073279 /* Debug64 */,
- 1DEB923708733DC60010E9CD /* Release */,
- A1F593C90B8F0E6E00073279 /* Release64 */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
-}
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
+ 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
+ 61C4771B13CE199D0022F8F6 /* shortpath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61C4771A13CE199D0022F8F6 /* shortpath.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 8DD76F690486A84900D96B5E /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 12;
+ dstPath = "";
+ dstSubfolderSpec = 16;
+ files = (
+ 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 0E8A7310136F4A4600453C80 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = ../../../../lib/libtbb.dylib; sourceTree = "<group>"; };
+ 61C4771A13CE199D0022F8F6 /* shortpath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = shortpath.cpp; path = ../shortpath.cpp; sourceTree = "<group>"; };
+ 8DD76F6C0486A84900D96B5E /* Shortpath */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Shortpath; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8DD76F660486A84900D96B5E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 08FB7794FE84155DC02AAC07 /* Shortpath */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB7795FE84155DC02AAC07 /* Source */,
+ A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
+ 1AB674ADFE9D54B511CA2CBB /* Products */,
+ );
+ name = Shortpath;
+ sourceTree = "<group>";
+ };
+ 08FB7795FE84155DC02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ 61C4771A13CE199D0022F8F6 /* shortpath.cpp */,
+ );
+ name = Source;
+ sourceTree = "<group>";
+ };
+ 1AB674ADFE9D54B511CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8DD76F6C0486A84900D96B5E /* Shortpath */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 0E8A7310136F4A4600453C80 /* libtbb.dylib */,
+ );
+ name = "External Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 8DD76F620486A84900D96B5E /* Shortpath */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Shortpath" */;
+ buildPhases = (
+ 8DD76F640486A84900D96B5E /* Sources */,
+ 8DD76F660486A84900D96B5E /* Frameworks */,
+ 8DD76F690486A84900D96B5E /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Shortpath;
+ productInstallPath = "$(HOME)/bin";
+ productName = Shortpath;
+ productReference = 8DD76F6C0486A84900D96B5E /* Shortpath */;
+ productType = "com.apple.product-type.tool";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
+ buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "shortpath" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 08FB7794FE84155DC02AAC07 /* Shortpath */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8DD76F620486A84900D96B5E /* Shortpath */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8DD76F640486A84900D96B5E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 61C4771B13CE199D0022F8F6 /* shortpath.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB923208733DC60010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/bin";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ ../../../../lib,
+ );
+ PRODUCT_NAME = Shortpath;
+ ZERO_LINK = NO;
+ };
+ name = Debug;
+ };
+ 1DEB923308733DC60010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/bin";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ ../../../../lib,
+ );
+ PRODUCT_NAME = Shortpath;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 1DEB923608733DC60010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = i386;
+ GCC_ENABLE_CPP_RTTI = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_VERSION = 4.0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SYMROOT = "/tmp/tbb-$(USER)";
+ };
+ name = Debug;
+ };
+ 1DEB923708733DC60010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = i386;
+ GCC_ENABLE_CPP_RTTI = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_VERSION = 4.0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SYMROOT = "/tmp/tbb-$(USER)";
+ };
+ name = Release;
+ };
+ A1F593C60B8F0E6E00073279 /* Debug64 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/bin";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ ../../../../lib,
+ );
+ PRODUCT_NAME = Shortpath;
+ ZERO_LINK = NO;
+ };
+ name = Debug64;
+ };
+ A1F593C70B8F0E6E00073279 /* Release64 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/bin";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ ../../../../lib,
+ );
+ PRODUCT_NAME = Shortpath;
+ ZERO_LINK = NO;
+ };
+ name = Release64;
+ };
+ A1F593C80B8F0E6E00073279 /* Debug64 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = i386;
+ GCC_ENABLE_CPP_RTTI = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_VERSION = 4.0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ OTHER_CPLUSPLUSFLAGS = (
+ "$(OTHER_CFLAGS)",
+ "-m64",
+ );
+ OTHER_LDFLAGS = "-m64";
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SYMROOT = "/tmp/tbb-$(USER)";
+ };
+ name = Debug64;
+ };
+ A1F593C90B8F0E6E00073279 /* Release64 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = i386;
+ GCC_ENABLE_CPP_RTTI = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_VERSION = 4.0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ OTHER_CPLUSPLUSFLAGS = (
+ "$(OTHER_CFLAGS)",
+ "-m64",
+ );
+ OTHER_LDFLAGS = "-m64";
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SYMROOT = "/tmp/tbb-$(USER)";
+ };
+ name = Release64;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Shortpath" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB923208733DC60010E9CD /* Debug */,
+ A1F593C60B8F0E6E00073279 /* Debug64 */,
+ 1DEB923308733DC60010E9CD /* Release */,
+ A1F593C70B8F0E6E00073279 /* Release64 */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "shortpath" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB923608733DC60010E9CD /* Debug */,
+ A1F593C80B8F0E6E00073279 /* Debug64 */,
+ 1DEB923708733DC60010E9CD /* Release */,
+ A1F593C90B8F0E6E00073279 /* Release64 */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
diff --git a/examples/graph/binpack/Makefile b/examples/graph/binpack/Makefile
index 570a369..09f8716 100644
--- a/examples/graph/binpack/Makefile
+++ b/examples/graph/binpack/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=binpack
ARGS=4 N=1000
PERF_RUN_ARGS=auto N=1000 silent
@@ -35,8 +36,13 @@ CXX=icc
endif # which icc
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -50,7 +56,7 @@ clean:
$(RM) $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
perf_build: release
diff --git a/examples/graph/binpack/Makefile.windows b/examples/graph/binpack/Makefile.windows
index 9f8fcbe..fe16997 100644
--- a/examples/graph/binpack/Makefile.windows
+++ b/examples/graph/binpack/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/graph/binpack/binpack.cpp b/examples/graph/binpack/binpack.cpp
index 5da84cf..c0ae73d 100644
--- a/examples/graph/binpack/binpack.cpp
+++ b/examples/graph/binpack/binpack.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -243,11 +243,8 @@ int main(int argc, char *argv[]) {
utility::thread_number_range threads(get_default_num_threads);
utility::parse_cli_arguments(argc, argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"#threads"," number of threads to use; a range of the "
- "form low[:high]\n where low and optional high are "
- "non-negative integers,\n or 'auto' for the TBB "
- "default")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"#threads",utility::thread_number_range_desc)
.arg(verbose,"verbose"," print diagnostic output to screen")
.arg(silent,"silent"," limits output to timing info; overrides verbose")
.arg(N,"N"," number of values to pack")
@@ -270,7 +267,7 @@ int main(int argc, char *argv[]) {
min_B = (item_sum % V) ? item_sum/V + 1 : item_sum/V;
tick_count start = tick_count::now();
- for(int p = threads.first; p <= threads.last; ++p ) {
+ for(int p = threads.first; p <= threads.last; p = threads.step(p)) {
task_scheduler_init init(p);
packed_sum = 0;
packed_items = 0;
diff --git a/examples/graph/binpack/index.html b/examples/graph/binpack/index.html
index 0ae3e8e..8e139f1 100644
--- a/examples/graph/binpack/index.html
+++ b/examples/graph/binpack/index.html
@@ -62,7 +62,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj b/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj
index 18c42f4..58bde8e 100644
--- a/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj
+++ b/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj
@@ -1,305 +1,305 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 46;
- objects = {
-
-/* Begin PBXBuildFile section */
- 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
- 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
- A1F593A60B8F042A00073279 /* binpack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* binpack.cpp */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 8DD76F690486A84900D96B5E /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 12;
- dstPath = "";
- dstSubfolderSpec = 16;
- files = (
- 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 0E8A7310136F4A4600453C80 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = ../../../../lib/libtbb.dylib; sourceTree = "<group>"; };
- 8DD76F6C0486A84900D96B5E /* Binpack */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Binpack; sourceTree = BUILT_PRODUCTS_DIR; };
- A1F593A50B8F042A00073279 /* binpack.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = binpack.cpp; path = ../binpack.cpp; sourceTree = SOURCE_ROOT; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 8DD76F660486A84900D96B5E /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 08FB7794FE84155DC02AAC07 /* Binpack */ = {
- isa = PBXGroup;
- children = (
- 08FB7795FE84155DC02AAC07 /* Source */,
- A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
- 1AB674ADFE9D54B511CA2CBB /* Products */,
- );
- name = Binpack;
- sourceTree = "<group>";
- };
- 08FB7795FE84155DC02AAC07 /* Source */ = {
- isa = PBXGroup;
- children = (
- A1F593A50B8F042A00073279 /* binpack.cpp */,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 1AB674ADFE9D54B511CA2CBB /* Products */ = {
- isa = PBXGroup;
- children = (
- 8DD76F6C0486A84900D96B5E /* Binpack */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
- isa = PBXGroup;
- children = (
- 0E8A7310136F4A4600453C80 /* libtbb.dylib */,
- );
- name = "External Frameworks and Libraries";
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 8DD76F620486A84900D96B5E /* Binpack */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */;
- buildPhases = (
- 8DD76F640486A84900D96B5E /* Sources */,
- 8DD76F660486A84900D96B5E /* Frameworks */,
- 8DD76F690486A84900D96B5E /* CopyFiles */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = Binpack;
- productInstallPath = "$(HOME)/bin";
- productName = Binpack;
- productReference = 8DD76F6C0486A84900D96B5E /* Binpack */;
- productType = "com.apple.product-type.tool";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 08FB7793FE84155DC02AAC07 /* Project object */ = {
- isa = PBXProject;
- attributes = {
- LastUpgradeCheck = 0410;
- };
- buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */;
- compatibilityVersion = "Xcode 3.2";
- developmentRegion = English;
- hasScannedForEncodings = 1;
- knownRegions = (
- en,
- );
- mainGroup = 08FB7794FE84155DC02AAC07 /* Binpack */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 8DD76F620486A84900D96B5E /* Binpack */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXSourcesBuildPhase section */
- 8DD76F640486A84900D96B5E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A1F593A60B8F042A00073279 /* binpack.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin XCBuildConfiguration section */
- 1DEB923208733DC60010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = ../../../../include;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- ../../../../lib,
- );
- PRODUCT_NAME = Binpack;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 1DEB923308733DC60010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = ../../../../include;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- ../../../../lib,
- );
- PRODUCT_NAME = Binpack;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 1DEB923608733DC60010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Debug;
- };
- 1DEB923708733DC60010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Release;
- };
- A1F593C60B8F0E6E00073279 /* Debug64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT)";
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = ../../../../include;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- ../../../../lib,
- );
- PRODUCT_NAME = Binpack;
- ZERO_LINK = NO;
- };
- name = Debug64;
- };
- A1F593C70B8F0E6E00073279 /* Release64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT)";
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = ../../../../include;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- ../../../../lib,
- );
- PRODUCT_NAME = Binpack;
- ZERO_LINK = NO;
- };
- name = Release64;
- };
- A1F593C80B8F0E6E00073279 /* Debug64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- OTHER_CPLUSPLUSFLAGS = (
- "$(OTHER_CFLAGS)",
- "-m64",
- );
- OTHER_LDFLAGS = "-m64";
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Debug64;
- };
- A1F593C90B8F0E6E00073279 /* Release64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- OTHER_CPLUSPLUSFLAGS = (
- "$(OTHER_CFLAGS)",
- "-m64",
- );
- OTHER_LDFLAGS = "-m64";
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Release64;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB923208733DC60010E9CD /* Debug */,
- A1F593C60B8F0E6E00073279 /* Debug64 */,
- 1DEB923308733DC60010E9CD /* Release */,
- A1F593C70B8F0E6E00073279 /* Release64 */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB923608733DC60010E9CD /* Debug */,
- A1F593C80B8F0E6E00073279 /* Debug64 */,
- 1DEB923708733DC60010E9CD /* Release */,
- A1F593C90B8F0E6E00073279 /* Release64 */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
-}
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
+ 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
+ A1F593A60B8F042A00073279 /* binpack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* binpack.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 8DD76F690486A84900D96B5E /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 12;
+ dstPath = "";
+ dstSubfolderSpec = 16;
+ files = (
+ 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 0E8A7310136F4A4600453C80 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = ../../../../lib/libtbb.dylib; sourceTree = "<group>"; };
+ 8DD76F6C0486A84900D96B5E /* Binpack */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Binpack; sourceTree = BUILT_PRODUCTS_DIR; };
+ A1F593A50B8F042A00073279 /* binpack.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = binpack.cpp; path = ../binpack.cpp; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8DD76F660486A84900D96B5E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 08FB7794FE84155DC02AAC07 /* Binpack */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB7795FE84155DC02AAC07 /* Source */,
+ A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
+ 1AB674ADFE9D54B511CA2CBB /* Products */,
+ );
+ name = Binpack;
+ sourceTree = "<group>";
+ };
+ 08FB7795FE84155DC02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ A1F593A50B8F042A00073279 /* binpack.cpp */,
+ );
+ name = Source;
+ sourceTree = "<group>";
+ };
+ 1AB674ADFE9D54B511CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8DD76F6C0486A84900D96B5E /* Binpack */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 0E8A7310136F4A4600453C80 /* libtbb.dylib */,
+ );
+ name = "External Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 8DD76F620486A84900D96B5E /* Binpack */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */;
+ buildPhases = (
+ 8DD76F640486A84900D96B5E /* Sources */,
+ 8DD76F660486A84900D96B5E /* Frameworks */,
+ 8DD76F690486A84900D96B5E /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Binpack;
+ productInstallPath = "$(HOME)/bin";
+ productName = Binpack;
+ productReference = 8DD76F6C0486A84900D96B5E /* Binpack */;
+ productType = "com.apple.product-type.tool";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
+ buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 08FB7794FE84155DC02AAC07 /* Binpack */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8DD76F620486A84900D96B5E /* Binpack */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8DD76F640486A84900D96B5E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ A1F593A60B8F042A00073279 /* binpack.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB923208733DC60010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/bin";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ ../../../../lib,
+ );
+ PRODUCT_NAME = Binpack;
+ ZERO_LINK = NO;
+ };
+ name = Debug;
+ };
+ 1DEB923308733DC60010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/bin";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ ../../../../lib,
+ );
+ PRODUCT_NAME = Binpack;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 1DEB923608733DC60010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = i386;
+ GCC_ENABLE_CPP_RTTI = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_VERSION = 4.0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SYMROOT = "/tmp/tbb-$(USER)";
+ };
+ name = Debug;
+ };
+ 1DEB923708733DC60010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = i386;
+ GCC_ENABLE_CPP_RTTI = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_VERSION = 4.0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SYMROOT = "/tmp/tbb-$(USER)";
+ };
+ name = Release;
+ };
+ A1F593C60B8F0E6E00073279 /* Debug64 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/bin";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ ../../../../lib,
+ );
+ PRODUCT_NAME = Binpack;
+ ZERO_LINK = NO;
+ };
+ name = Debug64;
+ };
+ A1F593C70B8F0E6E00073279 /* Release64 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/bin";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ ../../../../lib,
+ );
+ PRODUCT_NAME = Binpack;
+ ZERO_LINK = NO;
+ };
+ name = Release64;
+ };
+ A1F593C80B8F0E6E00073279 /* Debug64 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = i386;
+ GCC_ENABLE_CPP_RTTI = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_VERSION = 4.0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ OTHER_CPLUSPLUSFLAGS = (
+ "$(OTHER_CFLAGS)",
+ "-m64",
+ );
+ OTHER_LDFLAGS = "-m64";
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SYMROOT = "/tmp/tbb-$(USER)";
+ };
+ name = Debug64;
+ };
+ A1F593C90B8F0E6E00073279 /* Release64 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = i386;
+ GCC_ENABLE_CPP_RTTI = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_VERSION = 4.0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ OTHER_CPLUSPLUSFLAGS = (
+ "$(OTHER_CFLAGS)",
+ "-m64",
+ );
+ OTHER_LDFLAGS = "-m64";
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SYMROOT = "/tmp/tbb-$(USER)";
+ };
+ name = Release64;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB923208733DC60010E9CD /* Debug */,
+ A1F593C60B8F0E6E00073279 /* Debug64 */,
+ 1DEB923308733DC60010E9CD /* Release */,
+ A1F593C70B8F0E6E00073279 /* Release64 */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB923608733DC60010E9CD /* Debug */,
+ A1F593C80B8F0E6E00073279 /* Debug64 */,
+ 1DEB923708733DC60010E9CD /* Release */,
+ A1F593C90B8F0E6E00073279 /* Release64 */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
diff --git a/examples/graph/dining_philosophers/Makefile b/examples/graph/dining_philosophers/Makefile
index 89ad152..276b475 100644
--- a/examples/graph/dining_philosophers/Makefile
+++ b/examples/graph/dining_philosophers/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=dining_philosophers
ARGS= auto 5
LIGHT_ARGS= auto 3
@@ -34,8 +35,13 @@ CXX=icc
endif # icc
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -49,7 +55,7 @@ clean:
rm -f $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
light_test:
./$(PROG) $(LIGHT_ARGS)
diff --git a/examples/graph/dining_philosophers/Makefile.windows b/examples/graph/dining_philosophers/Makefile.windows
index f955886..9c6c60d 100644
--- a/examples/graph/dining_philosophers/Makefile.windows
+++ b/examples/graph/dining_philosophers/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/graph/dining_philosophers/dining_philosophers.cpp b/examples/graph/dining_philosophers/dining_philosophers.cpp
index b1b447d..f7e0109 100644
--- a/examples/graph/dining_philosophers/dining_philosophers.cpp
+++ b/examples/graph/dining_philosophers/dining_philosophers.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -97,7 +97,7 @@ RunOptions ParseCommandLine(int argc, char *argv[]) {
pCount += charbuf;
utility::cli_argument_pack cli_pack;
- cli_pack.positional_arg(threads, "n-of_threads", "number of threads to use, a range of the form low[:high], where low and high are non-negative integers or 'auto' for the TBB default.")
+ cli_pack.positional_arg(threads, "n-of_threads", utility::thread_number_range_desc)
.positional_arg(nPhilosophers, "n-of-philosophers", pCount)
.arg(verbose,"verbose","verbose output");
utility::parse_cli_arguments(argc, argv, cli_pack);
@@ -116,7 +116,7 @@ class chopstick {};
using namespace tbb::flow;
-typedef std::tuple<continue_msg, chopstick, chopstick> join_output;
+typedef tbb::flow::tuple<continue_msg, chopstick, chopstick> join_output;
typedef join_node< join_output, reserving > join_node_type;
typedef function_node<continue_msg, continue_msg> think_node_type;
@@ -199,10 +199,10 @@ void philosopher::check() {
void philosopher::forward( const continue_msg &/*in*/, forward_node_type::output_ports_type &out_ports ) {
if(my_count < 0) abort();
--my_count;
- (void)std::get<1>(out_ports).try_put(chopstick());
- (void)std::get<2>(out_ports).try_put(chopstick());
+ (void)tbb::flow::get<1>(out_ports).try_put(chopstick());
+ (void)tbb::flow::get<2>(out_ports).try_put(chopstick());
if (my_count > 0) {
- (void)std::get<0>(out_ports).try_put(continue_msg()); //start thinking again
+ (void)tbb::flow::get<0>(out_ports).try_put(continue_msg()); //start thinking again
} else {
if(verbose) {
tbb::spin_mutex::scoped_lock lock(my_mutex);
@@ -247,9 +247,9 @@ int main(int argc, char *argv[]) {
num_philosophers = options.number_of_philosophers;
verbose = !options.silent;
- for(num_threads = options.threads.first; num_threads <= options.threads.last; ++num_threads) {
-
- tbb::task_scheduler_init init(num_threads);
+ for(num_threads = options.threads.first; num_threads <= options.threads.last; num_threads = options.threads.step(num_threads)) {
+
+ tbb::task_scheduler_init init(num_threads);
graph g;
@@ -282,19 +282,15 @@ int main(int argc, char *argv[]) {
// attach chopstick buffers and think function_nodes to joins
for(int i = 0; i < num_philosophers; ++i) {
- think_nodes[i]->register_successor(done_vector[i]);
- done_vector[i].register_successor(input_port<0>(join_vector[i]));
- places[i].register_successor(input_port<1>(join_vector[i])); // left chopstick
- places[(i+1) % num_philosophers].register_successor(input_port<2>(join_vector[i])); // right chopstick
- // attach join to eat function_node
- join_vector[i].register_successor(*(eat_nodes[i]));
- // attach eat to forward mofn
- make_edge(*(eat_nodes[i]), *(forward_nodes[i]));
- // attach mofn to think function_nodes
- output_port<0>(*(forward_nodes[i])).register_successor(*(think_nodes[i]));
- // attach mofn to chopstick queues
- output_port<1>(*(forward_nodes[i])).register_successor(places[i]);
- output_port<2>(*(forward_nodes[i])).register_successor(places[(i+1) % num_philosophers]);
+ make_edge( *think_nodes[i], done_vector[i] );
+ make_edge( done_vector[i], input_port<0>(join_vector[i]) );
+ make_edge( places[i], input_port<1>(join_vector[i]) ); // left chopstick
+ make_edge( places[(i+1) % num_philosophers], input_port<2>(join_vector[i]) ); // right chopstick
+ make_edge( join_vector[i], *eat_nodes[i] );
+ make_edge( *eat_nodes[i], *forward_nodes[i] );
+ make_edge( output_port<0>(*forward_nodes[i]), *think_nodes[i] );
+ make_edge( output_port<1>(*forward_nodes[i]), places[i] );
+ make_edge( output_port<2>(*forward_nodes[i]), places[(i+1) % num_philosophers] );
}
// start all the philosophers thinking
diff --git a/examples/graph/dining_philosophers/index.html b/examples/graph/dining_philosophers/index.html
index 2cf345b..efa77d9 100644
--- a/examples/graph/dining_philosophers/index.html
+++ b/examples/graph/dining_philosophers/index.html
@@ -32,7 +32,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/graph/index.html b/examples/graph/index.html
index dd28c46..decf7f4 100644
--- a/examples/graph/index.html
+++ b/examples/graph/index.html
@@ -17,7 +17,7 @@ This directory has examples of <code>tbb::flow</code>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/graph/logic_sim/D_latch.h b/examples/graph/logic_sim/D_latch.h
index 15fd82e..568446e 100644
--- a/examples/graph/logic_sim/D_latch.h
+++ b/examples/graph/logic_sim/D_latch.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/graph/logic_sim/Makefile b/examples/graph/logic_sim/Makefile
index c069095..735ffda 100644
--- a/examples/graph/logic_sim/Makefile
+++ b/examples/graph/logic_sim/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=test_all
ARGS=4
PERF_RUN_ARGS=auto silent
@@ -35,8 +36,13 @@ CXX=icc
endif # which icc
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -49,7 +55,7 @@ clean:
$(RM) $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
perf_build: release
diff --git a/examples/graph/logic_sim/Makefile.windows b/examples/graph/logic_sim/Makefile.windows
index 8e3bde4..a8cd0ef 100644
--- a/examples/graph/logic_sim/Makefile.windows
+++ b/examples/graph/logic_sim/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/graph/logic_sim/basics.h b/examples/graph/logic_sim/basics.h
index 00e91cc..085c929 100644
--- a/examples/graph/logic_sim/basics.h
+++ b/examples/graph/logic_sim/basics.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -94,7 +94,7 @@ protected:
typedef multifunction_node< typename input_port_t::output_type, tuple<signal_t> > gate_fn_t;
typedef typename gate_fn_t::output_ports_type ports_type;
public:
- static const int N = std::tuple_size<GateInput>::value;
+ static const int N = tbb::flow::tuple_size<GateInput>::value;
template <typename Body>
gate(graph& g, Body b) : my_graph(g), in_ports(g), gate_fn(g, 1, b) {
@@ -118,7 +118,7 @@ template <int N>
struct or_output_helper {
template <typename OrOutputType>
static inline signal_t get_or_output(const OrOutputType& out) {
- if (N-1 == out.indx) return std::get<N-1>(out.result);
+ if (N-1 == out.indx) return tbb::flow::get<N-1>(out.result);
else return or_output_helper<N-1>::get_or_output(out);
}
};
@@ -126,7 +126,7 @@ template <>
struct or_output_helper<1> {
template <typename OrOutputType>
static inline signal_t get_or_output(const OrOutputType& out) {
- return std::get<0>(out.result);
+ return tbb::flow::get<0>(out.result);
}
};
@@ -242,9 +242,9 @@ class buffer : public gate<one_input> {
public:
buffer_body() : state(undefined), touched(false) {}
void operator()(const input_port_t::output_type &v, ports_type& p) {
- if (!touched || state != std::get<0>(v.result)) {
- state = std::get<0>(v.result);
- std::get<0>(p).try_put(state);
+ if (!touched || state != tbb::flow::get<0>(v.result)) {
+ state = tbb::flow::get<0>(v.result);
+ tbb::flow::get<0>(p).try_put(state);
touched = true;
}
}
@@ -264,11 +264,11 @@ class not_gate : public gate<one_input> {
public:
not_body() : port(undefined), touched(false) {}
void operator()(const input_port_t::output_type &v, ports_type& p) {
- if (!touched || port != std::get<0>(v.result)) {
- port = std::get<0>(v.result);
+ if (!touched || port != tbb::flow::get<0>(v.result)) {
+ port = tbb::flow::get<0>(v.result);
signal_t state = low;
if (port==low) state = high;
- std::get<0>(p).try_put(state);
+ tbb::flow::get<0>(p).try_put(state);
touched = true;
}
}
@@ -306,7 +306,7 @@ class and_gate : public gate<GateInput> {
}
if (!touched || state != new_state) {
state = new_state;
- std::get<0>(p).try_put(state);
+ tbb::flow::get<0>(p).try_put(state);
touched = true;
}
}
@@ -344,7 +344,7 @@ class or_gate : public gate<GateInput> {
}
if (!touched || state != new_state) {
state = new_state;
- std::get<0>(p).try_put(state);
+ tbb::flow::get<0>(p).try_put(state);
touched = true;
}
}
@@ -384,7 +384,7 @@ class xor_gate : public gate<GateInput> {
}
if (!touched || state != new_state) {
state = new_state;
- std::get<0>(p).try_put(state);
+ tbb::flow::get<0>(p).try_put(state);
touched = true;
}
}
@@ -424,7 +424,7 @@ class nor_gate : public gate<GateInput> {
else if (new_state == low) new_state = high;
if (!touched || state != new_state) {
state = new_state;
- std::get<0>(p).try_put(state);
+ tbb::flow::get<0>(p).try_put(state);
touched = true;
}
}
@@ -503,10 +503,10 @@ class digit : public gate<four_input> {
}
void operator()(const input_port_t::output_type& v, ports_type& p) {
unsigned int new_state = 0;
- if (v.indx == 0) ports[0] = std::get<0>(v.result);
- else if (v.indx == 1) ports[1] = std::get<1>(v.result);
- else if (v.indx == 2) ports[2] = std::get<2>(v.result);
- else if (v.indx == 3) ports[3] = std::get<3>(v.result);
+ if (v.indx == 0) ports[0] = tbb::flow::get<0>(v.result);
+ else if (v.indx == 1) ports[1] = tbb::flow::get<1>(v.result);
+ else if (v.indx == 2) ports[2] = tbb::flow::get<2>(v.result);
+ else if (v.indx == 3) ports[3] = tbb::flow::get<3>(v.result);
if (ports[0] == high) ++new_state;
if (ports[1] == high) new_state += 2;
if (ports[2] == high) new_state += 4;
diff --git a/examples/graph/logic_sim/four_bit_adder.h b/examples/graph/logic_sim/four_bit_adder.h
index ca4185b..81fc063 100644
--- a/examples/graph/logic_sim/four_bit_adder.h
+++ b/examples/graph/logic_sim/four_bit_adder.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/graph/logic_sim/index.html b/examples/graph/logic_sim/index.html
index d3940b4..13411c2 100644
--- a/examples/graph/logic_sim/index.html
+++ b/examples/graph/logic_sim/index.html
@@ -57,7 +57,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/graph/logic_sim/msvs/logic_sim_cl.sln b/examples/graph/logic_sim/msvs/logic_sim_cl.sln
index 7865512..a28e18b 100644
--- a/examples/graph/logic_sim/msvs/logic_sim_cl.sln
+++ b/examples/graph/logic_sim/msvs/logic_sim_cl.sln
@@ -1,52 +1,52 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_all", "test_all.vcproj", "{6E9B1702-78E0-4D64-B771-8B274D963B58}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|Win32.ActiveCfg = Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|Win32.Build.0 = Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|x64.ActiveCfg = Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|x64.Build.0 = Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|Win32.ActiveCfg = Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|Win32.Build.0 = Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|x64.ActiveCfg = Release|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|x64.Build.0 = Release|x64
-
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Debug|Win32.ActiveCfg = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Debug|Win32.Build.0 = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Debug|x64.Build.0 = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Release|Win32.Build.0 = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Release|x64.Build.0 = Release|x64
-
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Debug|Win32.ActiveCfg = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Debug|Win32.Build.0 = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Debug|x64.Build.0 = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Release|Win32.Build.0 = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Release|x64.Build.0 = Release|x64
-
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Debug|Win32.ActiveCfg = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Debug|Win32.Build.0 = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Debug|x64.Build.0 = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Release|Win32.Build.0 = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_all", "test_all.vcproj", "{6E9B1702-78E0-4D64-B771-8B274D963B58}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|Win32.Build.0 = Debug|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|x64.ActiveCfg = Debug|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|x64.Build.0 = Debug|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|Win32.ActiveCfg = Release|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|Win32.Build.0 = Release|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|x64.ActiveCfg = Release|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|x64.Build.0 = Release|x64
+
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Debug|Win32.ActiveCfg = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Debug|Win32.Build.0 = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Debug|x64.Build.0 = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Release|Win32.Build.0 = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.Release|x64.Build.0 = Release|x64
+
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Debug|Win32.Build.0 = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Debug|x64.Build.0 = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Release|Win32.Build.0 = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.Release|x64.Build.0 = Release|x64
+
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Debug|Win32.Build.0 = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Debug|x64.Build.0 = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Release|Win32.Build.0 = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/graph/logic_sim/msvs/logic_sim_icl.sln b/examples/graph/logic_sim/msvs/logic_sim_icl.sln
index b62ecdd..f269562 100644
--- a/examples/graph/logic_sim/msvs/logic_sim_icl.sln
+++ b/examples/graph/logic_sim/msvs/logic_sim_icl.sln
@@ -1,132 +1,132 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "test_all", "test_all.icproj", "{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}"
- ProjectSection(ProjectDependencies) = postProject
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830} = {5F685DBD-9A04-4E94-A1CA-FC48FE799830}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DD Debug|Win32 = DD Debug|Win32
- DD Debug|x64 = DD Debug|x64
- DD Release|Win32 = DD Release|Win32
- DD Release|x64 = DD Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.Build.0 = DDDebug|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.ActiveCfg = DDDebug|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.Build.0 = DDDebug|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.ActiveCfg = DDRelease|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.Build.0 = DDRelease|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.ActiveCfg = DDRelease|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.Build.0 = DDRelease|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|Win32.Build.0 = Debug|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|x64.ActiveCfg = Debug|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|x64.Build.0 = Debug|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|Win32.ActiveCfg = Release|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|Win32.Build.0 = Release|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|x64.ActiveCfg = Release|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|x64.Build.0 = Release|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.Build.0 = DDDebug|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.ActiveCfg = DDDebug|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.Build.0 = DDDebug|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.ActiveCfg = DDRelease|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.Build.0 = DDRelease|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.ActiveCfg = DDRelease|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.Build.0 = DDRelease|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|Win32.Build.0 = Debug|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|x64.ActiveCfg = Debug|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|x64.Build.0 = Debug|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|Win32.ActiveCfg = Release|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|Win32.Build.0 = Release|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|x64.ActiveCfg = Release|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|x64.Build.0 = Release|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|Win32.Build.0 = DDDebug|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.ActiveCfg = DDDebug|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.Build.0 = DDDebug|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.ActiveCfg = DDRelease|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.Build.0 = DDRelease|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.ActiveCfg = DDRelease|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.Build.0 = DDRelease|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|Win32.Build.0 = Debug|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|x64.ActiveCfg = Debug|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|x64.Build.0 = Debug|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|Win32.ActiveCfg = Release|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|Win32.Build.0 = Release|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|x64.ActiveCfg = Release|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|x64.Build.0 = Release|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|Win32.Build.0 = DDDebug|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.ActiveCfg = DDDebug|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.Build.0 = DDDebug|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.ActiveCfg = DDRelease|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.Build.0 = DDRelease|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.ActiveCfg = DDRelease|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.Build.0 = DDRelease|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|Win32.Build.0 = Debug|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|x64.ActiveCfg = Debug|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|x64.Build.0 = Debug|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|Win32.ActiveCfg = Release|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|Win32.Build.0 = Release|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|x64.ActiveCfg = Release|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|x64.Build.0 = Release|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = Release|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.Build.0 = Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.ActiveCfg = Debug|x64
-y {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.Build.0 = Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|Win32.ActiveCfg = Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|Win32.Build.0 = Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|x64.ActiveCfg = Release|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|x64.Build.0 = Release|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.Build.0 = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.Build.0 = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|Win32.Build.0 = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|x64.Build.0 = Release|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.ActiveCfg = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|Win32.Build.0 = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|x64.Build.0 = Release|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.ActiveCfg = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|Win32.Build.0 = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "test_all", "test_all.icproj", "{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}"
+ ProjectSection(ProjectDependencies) = postProject
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830} = {5F685DBD-9A04-4E94-A1CA-FC48FE799830}
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DD Debug|Win32 = DD Debug|Win32
+ DD Debug|x64 = DD Debug|x64
+ DD Release|Win32 = DD Release|Win32
+ DD Release|x64 = DD Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.Build.0 = DDDebug|x64
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.Build.0 = DDRelease|x64
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|x64.ActiveCfg = Debug|x64
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|x64.Build.0 = Debug|x64
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|Win32.Build.0 = Release|Win32
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|x64.ActiveCfg = Release|x64
+ {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|x64.Build.0 = Release|x64
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.Build.0 = DDDebug|x64
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.Build.0 = DDRelease|x64
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|x64.ActiveCfg = Debug|x64
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|x64.Build.0 = Debug|x64
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|Win32.Build.0 = Release|Win32
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|x64.ActiveCfg = Release|x64
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|x64.Build.0 = Release|x64
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.Build.0 = DDDebug|x64
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.Build.0 = DDRelease|x64
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|x64.ActiveCfg = Debug|x64
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|x64.Build.0 = Debug|x64
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|Win32.Build.0 = Release|Win32
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|x64.ActiveCfg = Release|x64
+ {E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|x64.Build.0 = Release|x64
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.Build.0 = DDDebug|x64
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.Build.0 = DDRelease|x64
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|x64.ActiveCfg = Debug|x64
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|x64.Build.0 = Debug|x64
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|Win32.Build.0 = Release|Win32
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|x64.ActiveCfg = Release|x64
+ {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|x64.Build.0 = Release|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = Debug|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = Debug|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = Release|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = Release|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.ActiveCfg = Debug|x64
+y {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.Build.0 = Debug|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|Win32.Build.0 = Release|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|x64.ActiveCfg = Release|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|x64.Build.0 = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.Build.0 = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|Win32.Build.0 = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|x64.Build.0 = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.ActiveCfg = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|Win32.Build.0 = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|x64.Build.0 = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.ActiveCfg = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|Win32.Build.0 = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/graph/logic_sim/msvs/test_all.icproj b/examples/graph/logic_sim/msvs/test_all.icproj
index f10414a..259a8ce 100644
--- a/examples/graph/logic_sim/msvs/test_all.icproj
+++ b/examples/graph/logic_sim/msvs/test_all.icproj
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Intel C++ Project"
- Version="11.1"
- Name="test_all"
- ProjectGUID="{CB292CD9-903E-464C-AAFE-E7A49003565C}"
- VCNestedProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
- VCNestedProjectFileName="test_all.vcproj">
- <Configurations/>
- <Files/>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="test_all"
+ ProjectGUID="{CB292CD9-903E-464C-AAFE-E7A49003565C}"
+ VCNestedProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
+ VCNestedProjectFileName="test_all.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/graph/logic_sim/msvs/test_all.vcproj b/examples/graph/logic_sim/msvs/test_all.vcproj
index 2a258a8..9c6565b 100644
--- a/examples/graph/logic_sim/msvs/test_all.vcproj
+++ b/examples/graph/logic_sim/msvs/test_all.vcproj
@@ -1,356 +1,356 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="test_all"
- ProjectGUID="{6E9B1702-78E0-4D64-B771-8B274D963B58}"
- RootNamespace="test_all"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\test_all.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="test_all"
+ ProjectGUID="{6E9B1702-78E0-4D64-B771-8B274D963B58}"
+ RootNamespace="test_all"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\test_all.cpp"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/graph/logic_sim/one_bit_adder.h b/examples/graph/logic_sim/one_bit_adder.h
index 1f3ea08..f0abd80 100644
--- a/examples/graph/logic_sim/one_bit_adder.h
+++ b/examples/graph/logic_sim/one_bit_adder.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/graph/logic_sim/test_all.cpp b/examples/graph/logic_sim/test_all.cpp
index 719d950..276dde9 100644
--- a/examples/graph/logic_sim/test_all.cpp
+++ b/examples/graph/logic_sim/test_all.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -52,11 +52,8 @@ int main(int argc, char *argv[]) {
utility::thread_number_range threads(get_default_num_threads);
utility::parse_cli_arguments(argc, argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"#threads"," number of threads to use; a range of the "
- "form low[:high]\n where low and optional high are "
- "non-negative integers,\n or 'auto' for the TBB "
- "default")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"#threads",utility::thread_number_range_desc)
.arg(verbose,"verbose"," print diagnostic output to screen")
.arg(silent,"silent"," limits output to timing info; overrides verbose")
);
@@ -64,7 +61,7 @@ int main(int argc, char *argv[]) {
if (silent) verbose = false; // make silent override verbose
tick_count start = tick_count::now();
- for(int p = threads.first; p <= threads.last; ++p ) {
+ for(int p = threads.first; p <= threads.last; p = threads.step(p)) {
task_scheduler_init init(p);
if (!silent) cout << "graph test running on " << p << " threads.\n";
diff --git a/examples/index.html b/examples/index.html
index 67279c8..ae7cc0c 100644
--- a/examples/index.html
+++ b/examples/index.html
@@ -10,7 +10,7 @@ This directory has example usages of Intel® Threading Building Blocks (Intel
<DD>Examples from the Getting Started Guide.
<DT><A HREF="concurrent_hash_map/index.html">concurrent_hash_map</A>
<DD>Examples using <CODE>concurrent_hash_map</CODE>.
-<DT><A HREF="concurrent_priority_queue/index.html">concurrent_priority_queue</A>
+<DT><A HREF="concurrent_priority_queue/shortpath/index.html">concurrent_priority_queue</A>
<DD>Examples using <CODE>concurrent_priority_queue</CODE>.
<DT><A HREF="graph/index.html">graph</A>
<DD>Examples using <CODE>tbb::flow graph</CODE>.
@@ -94,7 +94,7 @@ Perform the following steps:
Perform the following steps:
<OL>
<LI>Open a shell window. For Windows* systems, make sure this shell window has the proper environment
- defined for use with Microsoft* Visual Studio* (.NET 2003 or 2005); such a shell can be invoked
+ defined for use with Microsoft* Visual Studio* (2005, 2008, 2010 or 2012); such a shell can be invoked
from the Start menu, under Visual Studio, Visual Studio Tools, Visual Studio Command Prompt.
<LI>Set up the environment in this shell window for use with Intel TBB.
<BR>See below for how to set up the environment for <A href="#env_1">Windows*</A>, <A href="#env_23">Linux*</A> or <A href="#env_23">Mac OS* X</A> systems.
@@ -140,6 +140,7 @@ it may be set up, for a given type of shell window, by using one of the followin
vs2005 : Set to use with Microsoft Visual Studio 2005 runtime DLLs
vs2008 : Set to use with Microsoft Visual Studio 2008 runtime DLLs
vs2010 : Set to use with Microsoft Visual Studio 2010 runtime DLLs
+ vs2012 : Set to use with Microsoft Visual Studio 2012 runtime DLLs
all : Set to use TBB statically linked with Microsoft Visual C++ runtime
if (vs) is not set TBB statically linked with Microsoft Visual C++ runtime will be used.
</pre>
@@ -151,18 +152,10 @@ The environment may be set up, for a given type of shell window, by using one of
<DT>For sh, bash, ksh (or compatibles):
<DD>. <<I>installdir</I>>/bin/tbbvars.sh (arch)
<DT>For csh (or compatibles):
-<DD>source <<I>installdir</I>>/bin/tbbvars.csh
- (arch)<DT>For sh, bash, ksh (or compatibles), when using an alternate architecture or platform:
-<DD>. <<I>installdir</I>>/{ia32,intel64}/cc<<I>gccversion</I>>_libc<<I>libcversion</I>>_kernel<<I>kernelversion</I>>/bin/tbbvars.sh
-<DT>For csh (or compatibles), when using an alternate architecture or platform:
-<DD>source <<I>installdir</I>>/{ia32,intel64}/cc<<I>gccversion</I>>_libc<<I>libcversion</I>>_kernel<<I>kernelversion</I>>/bin/tbbvars.csh
+<DD>source <<I>installdir</I>>/bin/tbbvars.csh (arch)
<DT><I>Notes:</I>
<DD><I><SL>
<LI>Choose one of {ia32,intel64} depending on the architecture to be used.
- <LI>Choose a cc<<I>gccversion</I>>_libc<<I>libcversion</I>>_kernel<<I>kernelversion</I>>
- value, from among the available platforms installed with Intel TBB
- (for <A HREF=../ia32>ia32</A> or <A HREF=../intel64>intel64</A>),
- depending on the platform to be used.
<LI>Environment setup need only be performed once per shell window to be used.
<LI>Always source tbbvars.sh or tbbvars.csh rather than executing them directly.
</SL></I>
@@ -171,7 +164,7 @@ The environment may be set up, for a given type of shell window, by using one of
<HR>
<A href="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_do/index.html b/examples/parallel_do/index.html
index a72e1e6..9700a1c 100644
--- a/examples/parallel_do/index.html
+++ b/examples/parallel_do/index.html
@@ -13,7 +13,7 @@ This directory has examples of the template <code>parallel_do</code>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_do/parallel_preorder/Graph.cpp b/examples/parallel_do/parallel_preorder/Graph.cpp
index 6d9655f..e34120f 100644
--- a/examples/parallel_do/parallel_preorder/Graph.cpp
+++ b/examples/parallel_do/parallel_preorder/Graph.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_do/parallel_preorder/Graph.h b/examples/parallel_do/parallel_preorder/Graph.h
index 0b6d5ea..eb13011 100644
--- a/examples/parallel_do/parallel_preorder/Graph.h
+++ b/examples/parallel_do/parallel_preorder/Graph.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_do/parallel_preorder/Makefile b/examples/parallel_do/parallel_preorder/Makefile
index 84c110f..003be66 100644
--- a/examples/parallel_do/parallel_preorder/Makefile
+++ b/examples/parallel_do/parallel_preorder/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=parallel_preorder
ARGS=
PERF_RUN_ARGS=auto silent 500000 100
@@ -35,8 +36,13 @@ CXX=icc
endif # icc
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -50,8 +56,8 @@ clean:
$(RM) $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
-
+ $(run_cmd) ./$(PROG) $(ARGS)
+
perf_build: release
perf_run:
diff --git a/examples/parallel_do/parallel_preorder/Makefile.windows b/examples/parallel_do/parallel_preorder/Makefile.windows
index 37b92a6..7fd390a 100644
--- a/examples/parallel_do/parallel_preorder/Makefile.windows
+++ b/examples/parallel_do/parallel_preorder/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/parallel_do/parallel_preorder/Matrix.h b/examples/parallel_do/parallel_preorder/Matrix.h
index 9b0a2f3..fdf26b8 100644
--- a/examples/parallel_do/parallel_preorder/Matrix.h
+++ b/examples/parallel_do/parallel_preorder/Matrix.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_do/parallel_preorder/index.html b/examples/parallel_do/parallel_preorder/index.html
index 860ad6f..b9a9e04 100644
--- a/examples/parallel_do/parallel_preorder/index.html
+++ b/examples/parallel_do/parallel_preorder/index.html
@@ -27,7 +27,12 @@ The algorithm works as follows.
</P><P>
The times printed are for the traversal and update,
and do not include time for computing the root_set.
+</P><P>
+The example is using custom synchronization via <TT>ref_count</TT> atomic variable.
+Correctness checking tools might not take this into account, and report data races
+between different tasks that are actually synchronized.
</P>
+
<B>NOTE: </B>It is important to understand that this example is unlikely to show speedup
if the cell values are changed to type "float". The reason is twofold.
<UL>
@@ -83,7 +88,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_do/parallel_preorder/main.cpp b/examples/parallel_do/parallel_preorder/main.cpp
index a437172..bab2bd2 100644
--- a/examples/parallel_do/parallel_preorder/main.cpp
+++ b/examples/parallel_do/parallel_preorder/main.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -54,8 +54,8 @@ static void ParseCommandLine( int argc, const char* argv[] ) {
utility::parse_cli_arguments(
argc,argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc)
.positional_arg(nodes,"n-of-nodes","number of nodes in the graph.")
.positional_arg(traversals,"n-of-traversals","number of times to evaluate the graph. Reduce it (e.g. to 100) to shorten example run time\n")
.arg(SilentFlag,"silent","no output except elapsed time ")
@@ -68,7 +68,7 @@ int main( int argc, const char* argv[] ) {
ParseCommandLine(argc,argv);
// Start scheduler with given number of threads.
- for( int p=threads.first; p<=threads.last; ++p ) {
+ for( int p=threads.first; p<=threads.last; p = threads.step(p) ) {
tbb::tick_count t0 = tbb::tick_count::now();
tbb::task_scheduler_init init(p);
srand(2);
diff --git a/examples/parallel_do/parallel_preorder/parallel_preorder.cpp b/examples/parallel_do/parallel_preorder/parallel_preorder.cpp
index 0e0ca3a..c3fdab0 100644
--- a/examples/parallel_do/parallel_preorder/parallel_preorder.cpp
+++ b/examples/parallel_do/parallel_preorder/parallel_preorder.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -47,12 +47,15 @@ public:
c->ref_count = ArityOfOp[c->op];
for( size_t k=0; k<c->successor.size(); ++k ) {
Cell* successor = c->successor[k];
+ // ref_count is used for inter-task synchronization.
+ // Correctness checking tools might not take this into account, and report
+ // data races between different tasks, that are actually synchronized.
if( 0 == --(successor->ref_count) ) {
feeder.add( successor );
}
}
}
-};
+};
void ParallelPreorderTraversal( const std::vector<Cell*>& root_set ) {
tbb::parallel_do(root_set.begin(), root_set.end(),Body());
diff --git a/examples/parallel_for/game_of_life/Makefile b/examples/parallel_for/game_of_life/Makefile
index 3d4b182..38c7293 100644
--- a/examples/parallel_for/game_of_life/Makefile
+++ b/examples/parallel_for/game_of_life/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=game_of_life
ARGS=2:4 -t 5
LIGHT_ARGS=1:2 -t 5
@@ -33,7 +34,12 @@ CXX=icc
endif # icc
ifeq ($(shell uname), Linux)
-LIBS+= -lrt
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
+LIBS+= -lrt
+endif
endif
all: release test
@@ -48,6 +54,6 @@ clean:
rm -f $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
light_test:
./$(PROG) $(LIGHT_ARGS)
diff --git a/examples/parallel_for/game_of_life/Makefile.windows b/examples/parallel_for/game_of_life/Makefile.windows
index adbadc6..26215a3 100644
--- a/examples/parallel_for/game_of_life/Makefile.windows
+++ b/examples/parallel_for/game_of_life/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/parallel_for/game_of_life/index.html b/examples/parallel_for/game_of_life/index.html
index 67f096d..9ca1db9 100644
--- a/examples/parallel_for/game_of_life/index.html
+++ b/examples/parallel_for/game_of_life/index.html
@@ -43,7 +43,7 @@ For Windows* systems, Microsoft* Visual Studio* projects are provided for each o
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_for/game_of_life/src/AssemblyInfo.cpp b/examples/parallel_for/game_of_life/src/AssemblyInfo.cpp
index 2f33826..b245bb8 100644
--- a/examples/parallel_for/game_of_life/src/AssemblyInfo.cpp
+++ b/examples/parallel_for/game_of_life/src/AssemblyInfo.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/game_of_life/src/Board.h b/examples/parallel_for/game_of_life/src/Board.h
index 54fcac2..6ced568 100644
--- a/examples/parallel_for/game_of_life/src/Board.h
+++ b/examples/parallel_for/game_of_life/src/Board.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/game_of_life/src/Evolution.cpp b/examples/parallel_for/game_of_life/src/Evolution.cpp
index 5b7cabc..b57f331 100644
--- a/examples/parallel_for/game_of_life/src/Evolution.cpp
+++ b/examples/parallel_for/game_of_life/src/Evolution.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/game_of_life/src/Evolution.h b/examples/parallel_for/game_of_life/src/Evolution.h
index e9fe10f..1720018 100644
--- a/examples/parallel_for/game_of_life/src/Evolution.h
+++ b/examples/parallel_for/game_of_life/src/Evolution.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -161,7 +161,7 @@ public:
/**
class ParallelEvolution - derived from Evolution - calculate life generations
- in parallel using Intel's TBB package
+ in parallel using Intel(R) TBB
**/
#ifndef _CONSOLE
public ref class ParallelEvolution: public Evolution
diff --git a/examples/parallel_for/game_of_life/src/Form1.h b/examples/parallel_for/game_of_life/src/Form1.h
index 531c4c2..b31e0e1 100644
--- a/examples/parallel_for/game_of_life/src/Form1.h
+++ b/examples/parallel_for/game_of_life/src/Form1.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/game_of_life/src/Game_of_life.cpp b/examples/parallel_for/game_of_life/src/Game_of_life.cpp
index bfb6402..46bb31f 100644
--- a/examples/parallel_for/game_of_life/src/Game_of_life.cpp
+++ b/examples/parallel_for/game_of_life/src/Game_of_life.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/game_of_life/src/Update_state.cpp b/examples/parallel_for/game_of_life/src/Update_state.cpp
index 594391a..4f3104f 100644
--- a/examples/parallel_for/game_of_life/src/Update_state.cpp
+++ b/examples/parallel_for/game_of_life/src/Update_state.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/index.html b/examples/parallel_for/index.html
index 64078eb..2dc784c 100644
--- a/examples/parallel_for/index.html
+++ b/examples/parallel_for/index.html
@@ -19,7 +19,7 @@ This directory has examples of the template <code>parallel_for</code>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_for/polygon_overlay/Makefile b/examples/parallel_for/polygon_overlay/Makefile
index e73f0d8..3fb1db2 100644
--- a/examples/parallel_for/polygon_overlay/Makefile
+++ b/examples/parallel_for/polygon_overlay/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/parallel_for/polygon_overlay/Makefile.windows b/examples/parallel_for/polygon_overlay/Makefile.windows
index 3f344fe..c80c45b 100644
--- a/examples/parallel_for/polygon_overlay/Makefile.windows
+++ b/examples/parallel_for/polygon_overlay/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/parallel_for/polygon_overlay/index.html b/examples/parallel_for/polygon_overlay/index.html
index 2dd18c9..e26fa93 100644
--- a/examples/parallel_for/polygon_overlay/index.html
+++ b/examples/parallel_for/polygon_overlay/index.html
@@ -111,7 +111,7 @@ named pover.exe. To run these executables directly, use one or more of the foll
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_for/polygon_overlay/polymain.cpp b/examples/parallel_for/polygon_overlay/polymain.cpp
index 6cb1257..4ca700c 100644
--- a/examples/parallel_for/polygon_overlay/polymain.cpp
+++ b/examples/parallel_for/polygon_overlay/polymain.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/polygon_overlay/polymain.h b/examples/parallel_for/polygon_overlay/polymain.h
index 97f0545..ca5938d 100644
--- a/examples/parallel_for/polygon_overlay/polymain.h
+++ b/examples/parallel_for/polygon_overlay/polymain.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/polygon_overlay/polyover.cpp b/examples/parallel_for/polygon_overlay/polyover.cpp
index d249446..c9d74fe 100644
--- a/examples/parallel_for/polygon_overlay/polyover.cpp
+++ b/examples/parallel_for/polygon_overlay/polyover.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/polygon_overlay/polyover.h b/examples/parallel_for/polygon_overlay/polyover.h
index a7a0c3d..889301f 100644
--- a/examples/parallel_for/polygon_overlay/polyover.h
+++ b/examples/parallel_for/polygon_overlay/polyover.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/polygon_overlay/pover_global.h b/examples/parallel_for/polygon_overlay/pover_global.h
index 8024d30..a2762e1 100644
--- a/examples/parallel_for/polygon_overlay/pover_global.h
+++ b/examples/parallel_for/polygon_overlay/pover_global.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/polygon_overlay/pover_video.cpp b/examples/parallel_for/polygon_overlay/pover_video.cpp
index b75aa03..87479d2 100644
--- a/examples/parallel_for/polygon_overlay/pover_video.cpp
+++ b/examples/parallel_for/polygon_overlay/pover_video.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -175,4 +175,9 @@ void pover_video::on_process() {
if(gIsGraphicalVersion) rt_sleep(2000);
}
if(gIsGraphicalVersion) rt_sleep(8000);
+ delete gPolymap1;
+ delete gPolymap2;
+#if _DEBUG
+ delete gResultMap;
+#endif
}
diff --git a/examples/parallel_for/polygon_overlay/pover_video.h b/examples/parallel_for/polygon_overlay/pover_video.h
index 5a543e5..141d286 100644
--- a/examples/parallel_for/polygon_overlay/pover_video.h
+++ b/examples/parallel_for/polygon_overlay/pover_video.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/polygon_overlay/rpolygon.h b/examples/parallel_for/polygon_overlay/rpolygon.h
index daba51c..d0da0e9 100644
--- a/examples/parallel_for/polygon_overlay/rpolygon.h
+++ b/examples/parallel_for/polygon_overlay/rpolygon.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/seismic/Makefile b/examples/parallel_for/seismic/Makefile
index 414b570..1b3ca10 100644
--- a/examples/parallel_for/seismic/Makefile
+++ b/examples/parallel_for/seismic/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -36,7 +36,7 @@ CXX=icc
endif # icc
ifeq ($(offload), mic)
-override CXXFLAGS += -D__TBB_MIC=1
+override CXXFLAGS += -D__TBB_MIC_OFFLOAD=1
# Currently only console mode is supported in offload version
override UI=con
SOURCES = $(UI)video.o universe.cpp seismic_video.cpp main.cpp
@@ -46,12 +46,15 @@ SOURCES = ../../common/gui/$(UI)video.cpp universe.cpp seismic_video.cpp main.cp
PERFFLAGS=-msse2
endif
-ifeq ($(CXX), icc)
-TBBLIB = -tbb
-TBBLIB_DEBUG = -tbb
-else
+ifeq (,$(filter icc icpc,$(CXX)))
TBBLIB = -ltbb
TBBLIB_DEBUG = -ltbb_debug
+else
+TBBLIB = -tbb
+TBBLIB_DEBUG = -ltbb_debug
+ifeq ($(offload), mic)
+TBBLIB_DEBUG += -offload-option,mic,ld,"-ltbb_debug -L${TBBROOT}/lib/mic/"
+endif
endif
include ../../common/gui/Makefile.gmake
@@ -71,7 +74,7 @@ ifeq ($(UI),mac)
cp ../../common/gui/xcode/tbbExample/en.lproj/* $(APPRES)/en.lproj
endif # Mac
-release: $(SOURCES) resources
+release: resources
ifeq ($(offload), mic)
$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -c -offload-attribute-target=mic $(OFFLOAD_SOURCES)
endif
diff --git a/examples/parallel_for/seismic/Makefile.windows b/examples/parallel_for/seismic/Makefile.windows
index f973982..d5b3e36 100644
--- a/examples/parallel_for/seismic/Makefile.windows
+++ b/examples/parallel_for/seismic/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/parallel_for/seismic/index.html b/examples/parallel_for/seismic/index.html
index 49d11be..cd6cbff 100644
--- a/examples/parallel_for/seismic/index.html
+++ b/examples/parallel_for/seismic/index.html
@@ -103,7 +103,7 @@ user interface:
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_for/seismic/main.cpp b/examples/parallel_for/seismic/main.cpp
index 8f33720..0f2bbfd 100644
--- a/examples/parallel_for/seismic/main.cpp
+++ b/examples/parallel_for/seismic/main.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -32,17 +32,17 @@
#include "tbb/tick_count.h"
#include "../../common/utility/utility.h"
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (push,target(mic))
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
#include "seismic_video.h"
#include "universe.h"
#include "tbb/task_scheduler_init.h"
Universe u;
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (pop)
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
struct RunOptions {
//! It is used for console mode for test with different number of threads and also has
@@ -60,9 +60,9 @@ struct RunOptions {
int do_get_default_num_threads() {
int threads;
- #if __TBB_MIC
+ #if __TBB_MIC_OFFLOAD
#pragma offload target(mic) out(threads)
- #endif // __TBB_MIC
+ #endif // __TBB_MIC_OFFLOAD
threads = tbb::task_scheduler_init::default_num_threads();
return threads;
}
@@ -82,8 +82,8 @@ RunOptions ParseCommandLine(int argc, char *argv[]){
utility::parse_cli_arguments(argc,argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc)
.positional_arg(numberOfFrames,"n-of-frames","number of frames the example processes internally")
.arg(silent,"silent","no output except elapsed time")
.arg(serial,"serial","in GUI mode start with serial version of algorithm")
@@ -109,11 +109,11 @@ int main(int argc, char *argv[])
}
else if(video.init_console()) {
// do console mode
- for(int p = options.threads.first; p <= options.threads.last; ++p ) {
+ for(int p = options.threads.first; p <= options.threads.last; p = options.threads.step(p)) {
tbb::tick_count xwayParallelismStartTime = tbb::tick_count::now();
u.InitializeUniverse(video);
int numberOfFrames = options.numberOfFrames;
- #if __TBB_MIC
+ #if __TBB_MIC_OFFLOAD
drawing_memory dmem = video.get_drawing_memory();
char *pMem = dmem.get_address();
size_t memSize = dmem.get_size();
@@ -124,7 +124,7 @@ int main(int argc, char *argv[])
// since the address spaces on host and on target are different
dmem.set_address(pMem);
u.SetDrawingMemory(dmem);
- #endif // __TBB_MIC
+ #endif // __TBB_MIC_OFFLOAD
if (p==0){
//run a serial version
for( int i=0; i<numberOfFrames; ++i ){
@@ -136,9 +136,9 @@ int main(int argc, char *argv[])
u.ParallelUpdateUniverse();
}
}
- #if __TBB_MIC
+ #if __TBB_MIC_OFFLOAD
}
- #endif // __TBB_MIC
+ #endif // __TBB_MIC_OFFLOAD
if (!options.silent){
double fps = options.numberOfFrames/((tbb::tick_count::now()-xwayParallelismStartTime).seconds());
diff --git a/examples/parallel_for/seismic/seismic_video.cpp b/examples/parallel_for/seismic/seismic_video.cpp
index e3072a8..df946f1 100644
--- a/examples/parallel_for/seismic/seismic_video.cpp
+++ b/examples/parallel_for/seismic/seismic_video.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/seismic/seismic_video.h b/examples/parallel_for/seismic/seismic_video.h
index 3e5ba1d..5c3b79f 100644
--- a/examples/parallel_for/seismic/seismic_video.h
+++ b/examples/parallel_for/seismic/seismic_video.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/seismic/universe.cpp b/examples/parallel_for/seismic/universe.cpp
index 78557d4..8665269 100644
--- a/examples/parallel_for/seismic/universe.cpp
+++ b/examples/parallel_for/seismic/universe.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,9 +26,9 @@
the GNU General Public License.
*/
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (target(mic))
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
#include "../../common/gui/video.h"
#include <cmath>
diff --git a/examples/parallel_for/seismic/universe.h b/examples/parallel_for/seismic/universe.h
index 54cadfd..e388fd1 100644
--- a/examples/parallel_for/seismic/universe.h
+++ b/examples/parallel_for/seismic/universe.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -46,7 +46,7 @@ private:
//as the compiler is forced to place class members of the same clause in order of the
//declaration this seems to be the right way of padding.
- //magic constants what are being added bellow are chosen experimentally.
+ //magic constants added below are chosen experimentally.
enum {
MaxWidth = UniverseWidth+1,
MaxHeight = UniverseHeight+3
diff --git a/examples/parallel_for/tachyon/Makefile b/examples/parallel_for/tachyon/Makefile
index 88d7458..4d972bf 100644
--- a/examples/parallel_for/tachyon/Makefile
+++ b/examples/parallel_for/tachyon/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/parallel_for/tachyon/Makefile.windows b/examples/parallel_for/tachyon/Makefile.windows
index 4449216..99158ef 100644
--- a/examples/parallel_for/tachyon/Makefile.windows
+++ b/examples/parallel_for/tachyon/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/parallel_for/tachyon/android/.classpath b/examples/parallel_for/tachyon/android/.classpath
new file mode 100644
index 0000000..3f9691c
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="gen"/>
+ <classpathentry kind="output" path="bin/classes"/>
+</classpath>
diff --git a/examples/parallel_for/tachyon/android/.cproject b/examples/parallel_for/tachyon/android/.cproject
new file mode 100644
index 0000000..e2df34a
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/.cproject
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="com.android.toolchain.gcc.1728144771">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.android.toolchain.gcc.1728144771" moduleId="org.eclipse.cdt.core.settings" name="Default">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactName="${ProjName}" buildProperties="" description="" id="com.android.toolchain.gcc.1728144771" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
+ <folderInfo id="com.android.toolchain.gcc.1728144771.1005286742" name="/" resourcePath="">
+ <toolChain id="com.android.toolchain.gcc.1253182491" name="com.android.toolchain.gcc" superClass="com.android.toolchain.gcc">
+ <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="com.android.targetPlatform.1765338753" isAbstract="false" superClass="com.android.targetPlatform"/>
+ <builder id="com.android.builder.971200553" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Android Builder" superClass="com.android.builder">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="obj"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="libs"/>
+ </outputEntries>
+ </builder>
+ <tool id="com.android.gcc.compiler.969646961" name="Android GCC Compiler" superClass="com.android.gcc.compiler">
+ <inputType id="com.android.gcc.inputType.1420734641" superClass="com.android.gcc.inputType"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="jni"/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="com.android.AndroidPerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="false" filePath=""/>
+ <parser enabled="false"/>
+ </buildOutputProvider>
+ </profile>
+ <scannerConfigBuildInfo instanceId="com.android.toolchain.gcc.1728144771;com.android.toolchain.gcc.1728144771.1005286742;com.android.gcc.compiler.969646961;com.android.gcc.inputType.1420734641">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.android.AndroidPerProjectProfile"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="com.android.AndroidPerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="false" filePath=""/>
+ <parser enabled="false"/>
+ </buildOutputProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="tbbTachyon.null.1278275383" name="tbbTachyon"/>
+ </storageModule>
+</cproject>
diff --git a/examples/parallel_for/tachyon/android/.project b/examples/parallel_for/tachyon/android/.project
new file mode 100644
index 0000000..fc089ae
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/.project
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>Tachyon</name>
+ <comment>
+ </comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ <dictionary>
+ <key>?children?</key>
+ <value>?name?=outputEntries\|?children?=?name?=entry\\\\\\\|\\\|?name?=entry\\\\\\\|\\\|\||</value>
+ </dictionary>
+ <dictionary>
+ <key>?name?</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildArguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>ndk-build</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.contents</key>
+ <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/parallel_for/tachyon/android/AndroidManifest.xml b/examples/parallel_for/tachyon/android/AndroidManifest.xml
new file mode 100644
index 0000000..c3e1887
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.intel.tbb.example.tachyon"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <application
+ android:debuggable="true"
+ android:label="@string/app_name"
+ >
+ <activity
+ android:name=".tachyon"
+ android:screenOrientation="landscape"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+ <uses-sdk android:minSdkVersion="15" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+
+</manifest>
\ No newline at end of file
diff --git a/examples/parallel_for/tachyon/android/assets/data.dat b/examples/parallel_for/tachyon/android/assets/data.dat
new file mode 100644
index 0000000..0d4bbb1
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/assets/data.dat
@@ -0,0 +1,14804 @@
+BEGIN_SCENE
+ OUTFILE /dev/null
+ RESOLUTION 512 512
+ VERBOSE 0
+
+CAMERA
+ ZOOM 1.20711
+ASPECTRATIO 1.0
+ ANTIALIASING 0
+ RAYDEPTH 5
+ CENTER 2.1 1.3 1.7
+ VIEWDIR -0.700389 -0.433574 -0.566982
+ UPDIR -0.482085 -0.298433 0.82373
+
+END_CAMERA
+
+BACKGROUND 0.078 0.361 0.753
+
+LIGHT CENTER 4 3 2 RAD 0.002 COLOR 0.5 0.5 0.5
+
+LIGHT CENTER 1 -4 4 RAD 0.002 COLOR 0.5 0.5 0.5
+
+LIGHT CENTER -3 1 5 RAD 0.002 COLOR 0.5 0.5 0.5
+
+TEXDEF txt001 AMBIENT 0.2 DIFFUSE 0.8 SPECULAR 0 OPACITY 1
+PHONG PLASTIC 0 PHONG_SIZE 100000
+ COLOR 1 0.75 0.33
+ TEXFUNC 0
+
+TRI
+ V0 12 12 -0.5 V1 -12 -12 -0.5 V2 12 -12 -0.5
+ txt001
+TRI
+ V0 12 12 -0.5 V1 -12 12 -0.5 V2 -12 -12 -0.5
+ txt001
+TEXDEF txt002 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1
+PHONG PLASTIC 0.5 PHONG_SIZE 45.2776
+ COLOR 1 0.9 0.7
+ TEXFUNC 0
+
+ SPHERE CENTER 0 0 0 RAD 0.5
+ txt002
+ SPHERE CENTER 0.272166 0.272166 0.544331 RAD 0.166667
+ txt002
+ SPHERE CENTER 0.420314 0.420314 0.618405 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.470715 0.470715 0.598245 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.481689 0.481689 0.57904 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.475329 0.45787 0.577669 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.45787 0.475329 0.577669 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.477074 0.494534 0.599616 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.453255 0.488174 0.598245 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4661 0.48356 0.618821 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.494534 0.477074 0.599616 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.48356 0.4661 0.618821 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.488174 0.453255 0.598245 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.461623 0.409245 0.557924 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.47044 0.419664 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.447954 0.425689 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.468014 0.433095 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.484109 0.40322 0.549693 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.481683 0.416651 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.475292 0.392801 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.464049 0.395814 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.455233 0.385395 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.441563 0.401839 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.409245 0.461623 0.557924 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.419664 0.47044 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.433095 0.468014 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.425689 0.447954 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.395814 0.464049 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.401839 0.441563 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.385395 0.455233 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.40322 0.484109 0.549693 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.392801 0.475292 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.416651 0.481683 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.429405 0.481784 0.658726 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.441197 0.503434 0.660098 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.452601 0.483752 0.650495 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.434161 0.494577 0.63815 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.418001 0.501466 0.668328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.410965 0.492609 0.64638 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.406209 0.479816 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436441 0.490641 0.680674 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.42465 0.46899 0.679302 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.447846 0.470958 0.671072 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367935 0.472692 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.36376 0.497028 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.383056 0.487812 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.383056 0.487812 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.34864 0.481907 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367935 0.472692 0.593714 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.352815 0.457572 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.34864 0.481907 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.352815 0.457572 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367935 0.472692 0.643096 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.379004 0.431383 0.678886 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.376578 0.444814 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399064 0.438789 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.385395 0.455233 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356518 0.437408 0.687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.365335 0.447826 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.358944 0.423976 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.370187 0.420964 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.372614 0.407532 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.392673 0.414939 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.481784 0.429405 0.658726 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.503434 0.441197 0.660098 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.494577 0.434161 0.63815 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.483752 0.452601 0.650495 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.490641 0.436441 0.680674 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.470958 0.447846 0.671072 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.46899 0.42465 0.679302 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.501466 0.418001 0.668328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.479816 0.406209 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.492609 0.410965 0.64638 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.431383 0.379004 0.678886 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.444814 0.376578 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.455233 0.385395 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.438789 0.399064 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.420964 0.370187 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.414939 0.392673 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.407532 0.372614 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.437408 0.356518 0.687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.423976 0.358944 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.447826 0.365335 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472692 0.367935 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.497028 0.36376 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.487812 0.383056 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.487812 0.383056 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.481907 0.34864 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472692 0.367935 0.643096 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.457572 0.352815 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.481907 0.34864 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.457572 0.352815 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472692 0.367935 0.593714 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.461844 0.304709 0.43322 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.492085 0.33495 0.372739 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.492085 0.33495 0.348047 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.488469 0.313874 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.471009 0.331334 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.495701 0.356025 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.474625 0.352409 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.495701 0.356025 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.51316 0.338566 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.51316 0.338566 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.509544 0.31749 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.424345 0.305171 0.369341 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.40568 0.315605 0.356995 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.403931 0.312107 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.419383 0.329161 0.372427 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.426095 0.30867 0.344961 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.439797 0.322225 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.444759 0.298235 0.357307 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.410643 0.291616 0.353908 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.429307 0.281181 0.366254 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.408893 0.288117 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.435193 0.368397 0.406378 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.440864 0.389015 0.394032 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.457301 0.37895 0.409464 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.451857 0.367697 0.388171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.418755 0.378463 0.390945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.429748 0.357145 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.413085 0.357845 0.403291 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4242 0.389715 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.418529 0.369098 0.424584 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.440637 0.37965 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.529584 0.334488 0.436618 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.546497 0.347572 0.424272 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.532117 0.331508 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.522481 0.352406 0.421186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.543964 0.350552 0.448652 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.519948 0.355387 0.445566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.52705 0.337468 0.460998 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.5536 0.329654 0.439705 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.536686 0.31657 0.45205 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.53922 0.313589 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472692 0.367935 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.48474 0.389488 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.495668 0.369235 0.46131 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.477004 0.379669 0.448964 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.461764 0.388188 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.454027 0.37837 0.457911 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.449715 0.366636 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.480429 0.377754 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.46838 0.356202 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.491357 0.357501 0.482603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.499343 0.304247 0.497099 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.518259 0.314219 0.509445 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.519922 0.310678 0.485065 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.504895 0.328108 0.494013 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.49768 0.307788 0.521479 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.484316 0.321677 0.506047 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.478764 0.297816 0.509133 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.512708 0.290358 0.512531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.493791 0.280387 0.500186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.51437 0.286818 0.488152 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.518736 0.271262 0.399581 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.539811 0.274878 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.520873 0.290418 0.384149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.533373 0.290264 0.405442 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.537674 0.255722 0.402668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.531235 0.271108 0.420874 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.516598 0.252106 0.415013 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.525174 0.255876 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.504099 0.25226 0.39372 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.506236 0.271416 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.488495 0.241021 0.460062 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.50716 0.230587 0.472408 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.51153 0.24936 0.456976 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.499694 0.253381 0.478269 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.484125 0.222248 0.475494 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.476659 0.245042 0.481355 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.46546 0.232683 0.463149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.495961 0.218227 0.454201 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.477296 0.228661 0.441856 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.500331 0.237 0.438769 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.450996 0.241483 0.396183 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.455172 0.217147 0.396183 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472226 0.232599 0.40513 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.45115 0.228983 0.417476 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.433942 0.226031 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.429921 0.237867 0.408529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.429767 0.250367 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.455018 0.229647 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.450842 0.253983 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472072 0.245099 0.383837 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.304709 0.461844 0.43322 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.33495 0.492085 0.372739 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.33495 0.492085 0.348047 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.331334 0.471009 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.313874 0.488469 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.338566 0.51316 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31749 0.509544 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.338566 0.51316 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356025 0.495701 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356025 0.495701 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.352409 0.474625 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.368397 0.435193 0.406378 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.389015 0.440864 0.394032 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367697 0.451857 0.388171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37895 0.457301 0.409464 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.389715 0.4242 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37965 0.440637 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.369098 0.418529 0.424584 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.378463 0.418755 0.390945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.357845 0.413085 0.403291 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.357145 0.429748 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.305171 0.424345 0.369341 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.315605 0.40568 0.356995 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.329161 0.419383 0.372427 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.312107 0.403931 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.291616 0.410643 0.353908 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.288117 0.408893 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.281181 0.429307 0.366254 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.30867 0.426095 0.344961 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.298235 0.444759 0.357307 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.322225 0.439797 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271262 0.518736 0.399581 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.274878 0.539811 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.290264 0.533373 0.405442 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.290418 0.520873 0.384149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.255876 0.525174 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271416 0.506236 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.25226 0.504099 0.39372 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.255722 0.537674 0.402668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.252106 0.516598 0.415013 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271108 0.531235 0.420874 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.241483 0.450996 0.396183 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.217147 0.455172 0.396183 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.228983 0.45115 0.417476 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.232599 0.472226 0.40513 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.229647 0.455018 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.245099 0.472072 0.383837 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.253983 0.450842 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.226031 0.433942 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.250367 0.429767 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.237867 0.429921 0.408529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.241021 0.488495 0.460062 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.230587 0.50716 0.472408 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.253381 0.499694 0.478269 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.24936 0.51153 0.456976 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.218227 0.495961 0.454201 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.237 0.500331 0.438769 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.228661 0.477296 0.441856 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.222248 0.484125 0.475494 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.232683 0.46546 0.463149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.245042 0.476659 0.481355 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.334488 0.529584 0.436618 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.347572 0.546497 0.424272 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.352406 0.522481 0.421186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.331508 0.532117 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.329654 0.5536 0.439705 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.313589 0.53922 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31657 0.536686 0.45205 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.350552 0.543964 0.448652 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337468 0.52705 0.460998 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.355387 0.519948 0.445566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.304247 0.499343 0.497099 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.314219 0.518259 0.509445 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.328108 0.504895 0.494013 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.310678 0.519922 0.485065 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.290358 0.512708 0.512531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.286818 0.51437 0.488152 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.280387 0.493791 0.500186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.307788 0.49768 0.521479 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.297816 0.478764 0.509133 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.321677 0.484316 0.506047 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367935 0.472692 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.389488 0.48474 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.379669 0.477004 0.448964 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.369235 0.495668 0.46131 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.377754 0.480429 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.357501 0.491357 0.482603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356202 0.46838 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.388188 0.461764 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.366636 0.449715 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37837 0.454027 0.457911 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.230635 0.38777 0.729516 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.2506 0.446614 0.769837 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.264242 0.467193 0.770086 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.272442 0.447086 0.758332 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.253384 0.459832 0.749168 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.2424 0.46672 0.781591 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.231541 0.459359 0.760673 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.228758 0.446141 0.781342 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.261459 0.453974 0.790755 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.247817 0.433396 0.790506 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.269659 0.433868 0.779001 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.301839 0.407906 0.732914 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.319874 0.420236 0.72141 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.303021 0.407886 0.708251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.296625 0.428474 0.720288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.318692 0.420256 0.746073 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.295442 0.428494 0.744951 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.300656 0.407926 0.757577 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.325088 0.399668 0.734036 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.307053 0.387338 0.745541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.308235 0.387318 0.720878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.253236 0.449775 0.695877 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.263032 0.459076 0.675209 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.270029 0.436804 0.683251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.247378 0.440021 0.673964 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.246239 0.472047 0.687835 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.230585 0.452992 0.68659 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.236443 0.462746 0.708504 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.26889 0.468829 0.697123 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.259094 0.459528 0.717791 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.275887 0.446557 0.705165 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.179397 0.426478 0.766439 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.174744 0.447688 0.778193 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.197172 0.437457 0.779597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.1895 0.447523 0.758396 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.156968 0.436708 0.765035 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.171724 0.436544 0.745238 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.161621 0.415499 0.753281 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.164641 0.426642 0.786236 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.169293 0.405432 0.774481 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.187069 0.416412 0.787639 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.182032 0.429639 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.177682 0.45215 0.683315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.190087 0.449636 0.704516 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.200611 0.44299 0.683192 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.169628 0.432153 0.671279 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.192556 0.422992 0.671155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.173978 0.409641 0.680442 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.159104 0.438799 0.692603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.163454 0.416288 0.701767 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.171508 0.436286 0.713804 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.159431 0.367634 0.726118 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.13761 0.368692 0.737623 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.158434 0.366998 0.750781 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.153102 0.387887 0.738744 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.138607 0.369329 0.71296 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.154099 0.388523 0.714081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.160429 0.36827 0.701455 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.14394 0.34844 0.724997 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.165761 0.347381 0.713492 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.164764 0.346745 0.738155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.227999 0.384609 0.803476 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.237348 0.393812 0.824394 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.251829 0.390976 0.804597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.234368 0.408432 0.804721 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.213518 0.387445 0.823273 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.210538 0.402066 0.8036 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.204169 0.378242 0.802355 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.23098 0.369989 0.823149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.221631 0.360786 0.802231 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.245461 0.367152 0.803352 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.208034 0.325765 0.763155 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.209548 0.312342 0.783824 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.229235 0.324887 0.775781 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.209827 0.337 0.785069 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.188347 0.31322 0.771198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.188626 0.337878 0.772443 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.186834 0.326643 0.750529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.207755 0.301107 0.76191 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.206242 0.31453 0.741241 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.227442 0.313652 0.753867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.279238 0.345901 0.766553 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.302145 0.344931 0.775717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.297823 0.356827 0.754517 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.289691 0.366251 0.775841 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.28356 0.334005 0.787754 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271106 0.355325 0.787878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.260653 0.334975 0.77859 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.291692 0.324581 0.766429 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.268785 0.325551 0.757266 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.28737 0.336477 0.745229 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.115031 0.4293 0.544331 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.102505 0.502308 0.544331 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.110567 0.524146 0.536101 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.126738 0.506465 0.542066 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.112687 0.504055 0.521905 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0863343 0.519988 0.538366 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0884544 0.499897 0.524171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0782715 0.49815 0.546597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.100385 0.522399 0.558526 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0923218 0.500561 0.566757 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.116555 0.504718 0.564491 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.160392 0.474661 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.177777 0.492047 0.579103 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.176681 0.473492 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.159222 0.490951 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.161488 0.493217 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.142932 0.492121 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.144102 0.475831 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.178947 0.475757 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.161561 0.458371 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.177851 0.457202 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.160392 0.474661 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.167697 0.481967 0.484868 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.161561 0.458371 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.144102 0.475831 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.166528 0.498257 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.142932 0.492121 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.159222 0.490951 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.183987 0.480797 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.176681 0.473492 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.177851 0.457202 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0571437 0.456947 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0450372 0.477623 0.501329 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.055591 0.475469 0.523547 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0696413 0.47788 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0465898 0.4591 0.485076 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.071194 0.459357 0.487134 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0586963 0.438424 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0325396 0.45669 0.505236 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0446461 0.436013 0.511201 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0430934 0.454536 0.527454 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.115031 0.4293 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.10495 0.439381 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0911807 0.435691 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.10864 0.45315 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.128801 0.43299 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.13249 0.44676 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.138881 0.42291 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.111341 0.415531 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.121421 0.40545 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0975713 0.411841 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0696698 0.383939 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.052284 0.366554 0.509559 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0708393 0.36765 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0533799 0.385109 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0511144 0.382844 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0522103 0.401399 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0685002 0.400229 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0685739 0.365384 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0859596 0.38277 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0871292 0.36648 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0571437 0.456947 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0493251 0.475575 0.595564 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0725262 0.467381 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.06557 0.479825 0.577461 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0339426 0.465141 0.57931 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0501875 0.46939 0.561208 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0417612 0.446512 0.565115 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0408988 0.452697 0.599471 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0487174 0.434069 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0640999 0.444504 0.601529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0696698 0.383939 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0623642 0.376634 0.603794 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0859596 0.38277 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0685002 0.400229 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0460743 0.377803 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0522103 0.401399 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0533799 0.385109 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0635337 0.360344 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0708393 0.36765 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0871292 0.36648 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.115031 0.4293 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.125111 0.439381 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.138881 0.435691 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.121421 0.45315 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.101261 0.43299 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0975713 0.44676 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0911807 0.42291 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.11872 0.415531 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.10864 0.40545 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.13249 0.411841 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.082487 0.239622 0.655442 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.0438957 0.258053 0.715923 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0426858 0.273525 0.735128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.064638 0.265928 0.726759 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0510334 0.281546 0.713318 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0219434 0.26565 0.724292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.030291 0.273671 0.702483 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0231533 0.250178 0.705088 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0355481 0.250032 0.737733 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.036758 0.23456 0.718528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0575003 0.242434 0.729364 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.117687 0.252557 0.719322 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.135677 0.265544 0.730157 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.138361 0.25778 0.706872 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.12224 0.275732 0.71212 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.115003 0.26032 0.742607 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.101567 0.270508 0.72457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.097014 0.247334 0.731771 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.131123 0.242369 0.737359 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.113134 0.229382 0.726523 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.133808 0.234605 0.714074 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0863845 0.308551 0.682285 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0971427 0.330622 0.67968 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.109956 0.310023 0.675083 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.091905 0.317013 0.659755 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0735708 0.329151 0.686881 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0683331 0.315541 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0628126 0.30708 0.689486 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0916222 0.322161 0.702209 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.080864 0.30009 0.704814 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.104436 0.301561 0.697613 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00869528 0.245118 0.652044 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0110117 0.257416 0.660413 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00823377 0.253319 0.675329 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0102865 0.269325 0.656641 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0105502 0.249215 0.637128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.010748 0.261124 0.633356 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00915679 0.236916 0.628759 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0126029 0.233209 0.655816 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00710408 0.22091 0.647447 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00664257 0.229111 0.670732 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0511841 0.295616 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0555846 0.315856 0.604965 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0705987 0.309941 0.623653 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0705297 0.296292 0.603077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.03617 0.301531 0.599717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0511152 0.281968 0.597829 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0317696 0.281291 0.613157 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.036239 0.31518 0.620293 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0318385 0.29494 0.633733 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.051253 0.309265 0.638981 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0472866 0.226687 0.591563 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.025169 0.224935 0.580727 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0281502 0.217281 0.604012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0288111 0.241399 0.598764 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0443054 0.234341 0.568278 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0479475 0.250805 0.586315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.066423 0.236092 0.579113 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0436445 0.210223 0.573526 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0657621 0.211974 0.584361 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0466257 0.202569 0.596811 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0399982 0.189123 0.689081 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0335228 0.179527 0.71089 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0567332 0.187058 0.707118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0385291 0.203632 0.709006 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0167878 0.181593 0.692853 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.021794 0.205698 0.690969 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0232631 0.191189 0.671044 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0349919 0.165018 0.690965 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0414672 0.174615 0.669156 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0582023 0.172549 0.687193 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0785895 0.170692 0.6286 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0867911 0.147549 0.631205 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.101845 0.166573 0.635801 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.083121 0.161663 0.65113 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0635354 0.151669 0.624003 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0598652 0.165782 0.643928 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0553337 0.174812 0.621398 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0822597 0.156579 0.608675 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.074058 0.179722 0.60607 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0973138 0.175603 0.613272 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.11379 0.183628 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.133336 0.176775 0.705919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.136161 0.192663 0.687231 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.124499 0.199753 0.707807 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.110965 0.167739 0.711167 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.102127 0.190718 0.713055 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0914184 0.174592 0.697727 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.122627 0.160649 0.690591 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.103081 0.167502 0.677151 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.125452 0.176537 0.671903 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.38777 0.230635 0.729516 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.446614 0.2506 0.769837 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.467193 0.264242 0.770086 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.459832 0.253384 0.749168 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.447086 0.272442 0.758332 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.453974 0.261459 0.790755 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.433868 0.269659 0.779001 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.433396 0.247817 0.790506 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.46672 0.2424 0.781591 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.446141 0.228758 0.781342 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.459359 0.231541 0.760673 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.449775 0.253236 0.695877 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.459076 0.263032 0.675209 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.440021 0.247378 0.673964 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436804 0.270029 0.683251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.468829 0.26889 0.697123 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.446557 0.275887 0.705165 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.459528 0.259094 0.717791 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472047 0.246239 0.687835 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.462746 0.236443 0.708504 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.452992 0.230585 0.68659 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.407906 0.301839 0.732914 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.420236 0.319874 0.72141 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.428474 0.296625 0.720288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.407886 0.303021 0.708251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399668 0.325088 0.734036 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.387318 0.308235 0.720878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.387338 0.307053 0.745541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.420256 0.318692 0.746073 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.407926 0.300656 0.757577 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.428494 0.295442 0.744951 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.384609 0.227999 0.803476 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.393812 0.237348 0.824394 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.408432 0.234368 0.804721 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.390976 0.251829 0.804597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.369989 0.23098 0.823149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367152 0.245461 0.803352 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.360786 0.221631 0.802231 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.387445 0.213518 0.823273 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.378242 0.204169 0.802355 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.402066 0.210538 0.8036 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.345901 0.279238 0.766553 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.344931 0.302145 0.775717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.366251 0.289691 0.775841 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356827 0.297823 0.754517 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.324581 0.291692 0.766429 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.336477 0.28737 0.745229 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.325551 0.268785 0.757266 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.334005 0.28356 0.787754 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.334975 0.260653 0.77859 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.355325 0.271106 0.787878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.325765 0.208034 0.763155 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.312342 0.209548 0.783824 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337 0.209827 0.785069 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.324887 0.229235 0.775781 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.301107 0.207755 0.76191 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.313652 0.227442 0.753867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31453 0.206242 0.741241 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31322 0.188347 0.771198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.326643 0.186834 0.750529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337878 0.188626 0.772443 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.426478 0.179397 0.766439 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.447688 0.174744 0.778193 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.447523 0.1895 0.758396 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.437457 0.197172 0.779597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.426642 0.164641 0.786236 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.416412 0.187069 0.787639 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.405432 0.169293 0.774481 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436708 0.156968 0.765035 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.415499 0.161621 0.753281 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436544 0.171724 0.745238 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367634 0.159431 0.726118 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.368692 0.13761 0.737623 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.387887 0.153102 0.738744 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.366998 0.158434 0.750781 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.34844 0.14394 0.724997 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.346745 0.164764 0.738155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.347381 0.165761 0.713492 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.369329 0.138607 0.71296 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.36827 0.160429 0.701455 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.388523 0.154099 0.714081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.429639 0.182032 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.45215 0.177682 0.683315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.44299 0.200611 0.683192 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.449636 0.190087 0.704516 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.438799 0.159104 0.692603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436286 0.171508 0.713804 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.416288 0.163454 0.701767 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.432153 0.169628 0.671279 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.409641 0.173978 0.680442 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.422992 0.192556 0.671155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.239622 0.082487 0.655442 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.258053 0.0438957 0.715923 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.273525 0.0426858 0.735128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.281546 0.0510334 0.713318 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.265928 0.064638 0.726759 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.250032 0.0355481 0.737733 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.242434 0.0575003 0.729364 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.23456 0.036758 0.718528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.26565 0.0219434 0.724292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.250178 0.0231533 0.705088 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.273671 0.030291 0.702483 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.308551 0.0863845 0.682285 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.330622 0.0971427 0.67968 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.317013 0.091905 0.659755 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.310023 0.109956 0.675083 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.322161 0.0916222 0.702209 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.301561 0.104436 0.697613 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.30009 0.080864 0.704814 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.329151 0.0735708 0.686881 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.30708 0.0628126 0.689486 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.315541 0.0683331 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.252557 0.117687 0.719322 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.265544 0.135677 0.730157 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.275732 0.12224 0.71212 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.25778 0.138361 0.706872 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.242369 0.131123 0.737359 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.234605 0.133808 0.714074 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.229382 0.113134 0.726523 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.26032 0.115003 0.742607 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.247334 0.097014 0.731771 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.270508 0.101567 0.72457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.189123 0.0399982 0.689081 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.179527 0.0335228 0.71089 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.203632 0.0385291 0.709006 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.187058 0.0567332 0.707118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.165018 0.0349919 0.690965 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.172549 0.0582023 0.687193 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.174615 0.0414672 0.669156 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.181593 0.0167878 0.692853 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.191189 0.0232631 0.671044 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.205698 0.021794 0.690969 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.183628 0.11379 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.176775 0.133336 0.705919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.199753 0.124499 0.707807 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.192663 0.136161 0.687231 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.160649 0.122627 0.690591 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.176537 0.125452 0.671903 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.167502 0.103081 0.677151 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.167739 0.110965 0.711167 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.174592 0.0914184 0.697727 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.190718 0.102127 0.713055 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.170692 0.0785895 0.6286 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.147549 0.0867911 0.631205 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.161663 0.083121 0.65113 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.166573 0.101845 0.635801 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.156579 0.0822597 0.608675 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.175603 0.0973138 0.613272 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.179722 0.074058 0.60607 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.151669 0.0635354 0.624003 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.174812 0.0553337 0.621398 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.165782 0.0598652 0.643928 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.245118 0.00869528 0.652044 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.257416 -0.0110117 0.660413 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.269325 0.0102865 0.656641 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.253319 0.00823377 0.675329 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.233209 -0.0126029 0.655816 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.229111 0.00664257 0.670732 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.22091 0.00710408 0.647447 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.249215 -0.0105502 0.637128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.236916 0.00915679 0.628759 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.261124 0.010748 0.633356 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.226687 0.0472866 0.591563 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.224935 0.025169 0.580727 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.241399 0.0288111 0.598764 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.217281 0.0281502 0.604012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.210223 0.0436445 0.573526 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.202569 0.0466257 0.596811 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.211974 0.0657621 0.584361 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.234341 0.0443054 0.568278 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.236092 0.066423 0.579113 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.250805 0.0479475 0.586315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.295616 0.0511841 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.315856 0.0555846 0.604965 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.296292 0.0705297 0.603077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.309941 0.0705987 0.623653 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31518 0.036239 0.620293 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.309265 0.051253 0.638981 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29494 0.0318385 0.633733 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.301531 0.03617 0.599717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.281291 0.0317696 0.613157 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.281968 0.0511152 0.597829 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4293 0.115031 0.544331 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.502308 0.102505 0.544331 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.524146 0.110567 0.536101 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.504055 0.112687 0.521905 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.506465 0.126738 0.542066 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.522399 0.100385 0.558526 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.504718 0.116555 0.564491 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.500561 0.0923218 0.566757 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.519988 0.0863343 0.538366 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.49815 0.0782715 0.546597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.499897 0.0884544 0.524171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.474661 0.160392 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.481967 0.167697 0.484868 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.475831 0.144102 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.458371 0.161561 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.480797 0.183987 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.457202 0.177851 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.473492 0.176681 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.498257 0.166528 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.490951 0.159222 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.492121 0.142932 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.474661 0.160392 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.492047 0.177777 0.579103 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.490951 0.159222 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.473492 0.176681 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.475757 0.178947 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.457202 0.177851 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.458371 0.161561 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.493217 0.161488 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.475831 0.144102 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.492121 0.142932 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.456947 0.0571437 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.475575 0.0493251 0.595564 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.479825 0.06557 0.577461 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.467381 0.0725262 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.452697 0.0408988 0.599471 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.444504 0.0640999 0.601529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.434069 0.0487174 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.465141 0.0339426 0.57931 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.446512 0.0417612 0.565115 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.46939 0.0501875 0.561208 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4293 0.115031 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.439381 0.125111 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.45315 0.121421 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.435691 0.138881 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.415531 0.11872 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.411841 0.13249 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.40545 0.10864 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.43299 0.101261 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.42291 0.0911807 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.44676 0.0975713 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.383939 0.0696698 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.376634 0.0623642 0.603794 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.400229 0.0685002 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.38277 0.0859596 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.360344 0.0635337 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.36648 0.0871292 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.36765 0.0708393 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.377803 0.0460743 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.385109 0.0533799 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.401399 0.0522103 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.456947 0.0571437 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.477623 0.0450372 0.501329 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.47788 0.0696413 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.475469 0.055591 0.523547 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.45669 0.0325396 0.505236 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.454536 0.0430934 0.527454 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436013 0.0446461 0.511201 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4591 0.0465898 0.485076 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.438424 0.0586963 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.459357 0.071194 0.487134 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.383939 0.0696698 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.366554 0.052284 0.509559 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.385109 0.0533799 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.36765 0.0708393 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.365384 0.0685739 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.36648 0.0871292 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.38277 0.0859596 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.382844 0.0511144 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.400229 0.0685002 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.401399 0.0522103 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4293 0.115031 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.41922 0.125111 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.40545 0.121421 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.42291 0.138881 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.44307 0.11872 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.44676 0.13249 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.45315 0.10864 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.425611 0.101261 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.435691 0.0911807 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.411841 0.0975713 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.643951 0.172546 1.11022e-16 RAD 0.166667
+ txt002
+ SPHERE CENTER 0.802608 0.281471 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.824035 0.30566 -0.177765 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.822021 0.302088 -0.202114 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.821938 0.282758 -0.186751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.802598 0.298094 -0.187402 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.824119 0.32499 -0.193128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.804695 0.320997 -0.178416 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.826132 0.328563 -0.16878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.843459 0.309654 -0.192477 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.845472 0.313227 -0.168128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.843375 0.290324 -0.177114 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.787796 0.241352 -0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.785699 0.218449 -0.180578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.802677 0.22345 -0.163362 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.778718 0.223304 -0.157397 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.770818 0.236351 -0.188808 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.763837 0.241205 -0.165627 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.772915 0.259253 -0.179823 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.794777 0.236497 -0.194773 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.796874 0.2594 -0.185788 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.811756 0.241498 -0.177557 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.752156 0.305221 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.741263 0.325175 -0.169507 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.747715 0.32493 -0.145675 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.765112 0.325981 -0.163165 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.745704 0.305466 -0.183703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.769553 0.306272 -0.17736 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.756597 0.285513 -0.174066 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.728307 0.304415 -0.166213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.7392 0.284462 -0.156576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.734759 0.304171 -0.142381 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.838847 0.34578 -0.117284 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.851488 0.360404 -0.132647 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.853509 0.335865 -0.1345 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.832518 0.347059 -0.141116 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.836826 0.370319 -0.115431 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.817857 0.356973 -0.1239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.824185 0.355695 -0.100068 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.857816 0.359125 -0.108814 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.845176 0.344501 -0.0934517 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.859838 0.334587 -0.110668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.766968 0.345341 -0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.768944 0.369945 -0.10004 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.788341 0.356172 -0.093424 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.780624 0.356171 -0.116879 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.747572 0.359113 -0.106005 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.759252 0.34534 -0.122844 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.745596 0.33451 -0.105354 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.755289 0.359115 -0.0825505 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.753313 0.334511 -0.0818993 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.774685 0.345342 -0.0759343 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.817421 0.321591 -0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.83071 0.340361 -0.0416443 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.840365 0.325527 -0.0588603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.822249 0.341208 -0.0648253 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.807766 0.336425 -0.0334138 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.799305 0.337272 -0.0565949 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.794477 0.317654 -0.0423994 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.825882 0.320744 -0.0274488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.812593 0.301973 -0.0364345 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.835537 0.30591 -0.0446649 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.874487 0.28191 -0.129006 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.891539 0.292033 -0.143718 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.868678 0.28812 -0.152187 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.872763 0.305711 -0.135349 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.897348 0.285824 -0.120537 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.878572 0.299501 -0.112168 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.880296 0.275701 -0.105825 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.893263 0.268233 -0.137375 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.876212 0.25811 -0.122663 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.870402 0.264319 -0.145845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.853061 0.257721 -0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.87538 0.26204 -0.0527151 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.87108 0.266856 -0.0765474 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.860805 0.280934 -0.0590577 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.857361 0.252905 -0.0385197 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.842785 0.271799 -0.0448623 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.835041 0.248586 -0.0481565 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.867636 0.238827 -0.0560094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.845317 0.234508 -0.0656463 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.863337 0.243643 -0.0798417 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.838248 0.217602 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.860225 0.206363 -0.122182 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.858689 0.230102 -0.128798 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.854636 0.223536 -0.105343 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.839784 0.193863 -0.116217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.834196 0.211035 -0.0993785 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.817808 0.205101 -0.116868 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.843837 0.200429 -0.139672 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.821861 0.211667 -0.140323 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.842301 0.224168 -0.146288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.643951 0.172546 -0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.61371 0.202787 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.61556 0.221097 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.621702 0.225035 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.635958 0.210779 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.607567 0.198849 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627965 0.188531 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.605717 0.180539 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.593312 0.213105 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.591462 0.194794 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.599454 0.217042 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.5724 0.191718 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.556122 0.208861 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.575596 0.203643 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.578791 0.215568 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.552927 0.196936 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.575596 0.203643 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.569205 0.179793 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.549732 0.185011 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.56601 0.167868 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.569205 0.179793 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.624779 0.244096 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.631486 0.266765 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.648629 0.250487 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.636704 0.247291 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.607636 0.260374 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.612854 0.240901 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.600929 0.237705 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.619561 0.26357 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.612854 0.240901 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.636704 0.247291 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.68526 0.183615 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.684921 0.190903 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.665787 0.178397 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669989 0.201661 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.704395 0.196121 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.689462 0.206879 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.704733 0.188833 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.700193 0.172858 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.700531 0.165569 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.681058 0.160351 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.696329 0.224924 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.710584 0.23918 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.705059 0.216195 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.687599 0.233654 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.701855 0.24791 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.678869 0.242384 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.687599 0.233654 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.719314 0.23045 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.705059 0.216195 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.713788 0.207465 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.715501 0.153374 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.738169 0.160081 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.718696 0.165299 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.721891 0.177224 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.734974 0.148156 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.718696 0.165299 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.712305 0.141449 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.731779 0.136231 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.70911 0.129524 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.712305 0.141449 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.632882 0.131237 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.634145 0.108412 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.650927 0.115965 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627664 0.111763 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.616099 0.123683 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.609618 0.127034 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.614836 0.146508 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.639363 0.127886 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.6381 0.15071 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.656145 0.135439 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.663122 0.100996 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.680265 0.0847178 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.686972 0.107387 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.675047 0.104191 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.656415 0.0783272 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.651197 0.0978007 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.639272 0.0946054 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.66834 0.0815225 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.651197 0.0978007 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.675047 0.104191 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.591572 0.120168 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.577317 0.105912 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.600302 0.111438 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.582843 0.128897 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.568587 0.114642 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.574113 0.137627 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.582843 0.128897 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.586046 0.0971825 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.600302 0.111438 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.609032 0.102708 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.594141 0.358439 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.619127 0.408291 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.625955 0.411883 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.630791 0.390369 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.607547 0.396287 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.61429 0.429805 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.595882 0.414208 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.607462 0.426212 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.637535 0.423887 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.630706 0.420295 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.642371 0.402373 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.665691 0.37761 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.68332 0.389713 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.665691 0.37761 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.660156 0.398265 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.68332 0.389713 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.660156 0.398265 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.665691 0.37761 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.688854 0.369058 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671225 0.356956 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671225 0.356956 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.638217 0.337042 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.652948 0.344865 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.632683 0.357697 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.651954 0.357326 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.658482 0.324211 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.657489 0.336672 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.643752 0.316388 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.639211 0.324581 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.624481 0.316758 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.618946 0.337413 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.547576 0.389119 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.541008 0.410169 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.548718 0.410472 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.564748 0.405866 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539866 0.388816 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.563607 0.384513 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.546435 0.367766 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.523836 0.393422 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.530405 0.372372 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.531546 0.393725 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.566667 0.317871 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.555534 0.296626 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.572202 0.297216 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.550163 0.307914 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.549999 0.31728 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.544629 0.328569 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.561133 0.338525 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.572037 0.306582 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.583171 0.327827 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.588706 0.307172 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.522591 0.339267 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.501272 0.340934 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.522591 0.339267 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.517056 0.359921 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.501272 0.340934 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.517056 0.359921 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.522591 0.339267 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.506807 0.320279 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.528125 0.318612 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.528125 0.318612 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.57505 0.429687 -0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.58161 0.452905 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.5989 0.436077 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.586467 0.434777 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.55776 0.446515 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.562617 0.428387 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.5512 0.423296 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.570193 0.447815 -0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.563633 0.424596 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.587483 0.430987 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.550064 0.379835 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.547099 0.396248 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.569716 0.388263 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.557504 0.403175 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.527447 0.387819 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.537852 0.394747 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.530412 0.371406 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539659 0.372907 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.542624 0.356494 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.562276 0.364922 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.621614 0.399007 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.637209 0.41723 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.642848 0.401533 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.624734 0.418027 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.615976 0.414703 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.603501 0.4155 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.600381 0.39648 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.634089 0.39821 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.618494 0.379986 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.639728 0.382513 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.802608 0.281471 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.858698 0.329459 0.104938 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.872345 0.34259 0.0890951 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.86421 0.32016 0.0827387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.848329 0.338969 0.0846485 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.866833 0.351888 0.111295 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.842817 0.348268 0.106848 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.853186 0.338757 0.127138 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.882715 0.333079 0.109385 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.869068 0.319948 0.125228 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.87458 0.310649 0.103028 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.845371 0.280879 0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.849036 0.291048 0.0284303 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.826067 0.287867 0.0369125 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.840755 0.304882 0.0471312 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.868341 0.28406 0.0421477 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.86006 0.297894 0.0608487 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.864676 0.273891 0.0643473 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.853652 0.267046 0.0319289 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.849987 0.256877 0.0541285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.830683 0.263865 0.0404111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.798572 0.337088 0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.808673 0.346884 0.0420622 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.82298 0.335792 0.0588533 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.807762 0.322361 0.044793 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.784265 0.34818 0.0455609 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.783355 0.323657 0.0482916 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.774164 0.338384 0.0658506 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.799483 0.361611 0.0596212 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.789382 0.351815 0.079911 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.81379 0.350519 0.0764123 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.815936 0.330051 0.165419 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.828769 0.350165 0.171776 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.838905 0.333232 0.156937 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.820583 0.347547 0.148628 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.805799 0.346984 0.180258 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.797614 0.344366 0.157111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.792966 0.32687 0.173902 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.824121 0.332668 0.188567 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.811288 0.312554 0.182211 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.834258 0.315735 0.173728 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.75581 0.33768 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.753851 0.362219 0.124743 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.774086 0.350765 0.133052 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.76987 0.352319 0.108773 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.735575 0.349134 0.114524 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.751594 0.339233 0.0985541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.737534 0.324595 0.112614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.739791 0.347581 0.138803 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.74175 0.323042 0.136894 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.760026 0.336127 0.147112 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.759846 0.282063 0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.756464 0.29233 0.193792 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.779336 0.288514 0.18531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.765125 0.305929 0.175091 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.736973 0.285879 0.180075 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.745634 0.299478 0.161374 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.740355 0.275612 0.157875 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.751185 0.268464 0.190293 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.754567 0.258198 0.168094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.774058 0.264649 0.181811 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.862735 0.273842 0.153697 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.885497 0.282313 0.158144 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.876946 0.281455 0.134996 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.867718 0.29787 0.150967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.871286 0.274699 0.176845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.853506 0.290257 0.169668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.848523 0.266228 0.172398 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.880514 0.258284 0.160875 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.857752 0.249813 0.156428 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.871963 0.257427 0.137727 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.806645 0.225855 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.818054 0.21762 0.18016 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.83061 0.230661 0.163369 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.813612 0.241754 0.177429 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.794089 0.212813 0.176661 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.789647 0.236948 0.173931 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.78268 0.221048 0.156372 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.811087 0.20172 0.162601 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.799677 0.209955 0.142311 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.823642 0.214761 0.14581 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.849407 0.225263 0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.873186 0.21889 0.0974792 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.865588 0.240865 0.0891702 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.866351 0.236437 0.113449 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.857005 0.203288 0.107698 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.850171 0.220835 0.123668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.833227 0.20966 0.109608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.856242 0.207715 0.0834188 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.832464 0.214088 0.0853287 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.848644 0.22969 0.0751099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.594141 0.358439 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.613592 0.428945 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.626191 0.448155 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.634643 0.42519 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.614455 0.43276 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.60514 0.45191 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.593404 0.436515 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.592541 0.4327 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.625328 0.44434 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.612729 0.42513 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.63378 0.421375 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.665691 0.37761 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.68332 0.389713 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.665691 0.37761 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.660156 0.398265 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.68332 0.389713 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.660156 0.398265 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.665691 0.37761 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.688854 0.369058 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671225 0.356956 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671225 0.356956 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.621614 0.399007 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.625435 0.399844 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627149 0.378352 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.60511 0.38905 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.619901 0.420499 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.599576 0.409705 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.61608 0.419661 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.641939 0.409801 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.638118 0.408963 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.643653 0.388308 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.542042 0.409774 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.53788 0.433888 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.558395 0.423551 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.55574 0.426423 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.521526 0.42011 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539387 0.412646 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.525689 0.395996 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.524182 0.417238 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.528344 0.393124 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.544697 0.406901 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.550064 0.379835 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.540802 0.399304 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.54453 0.400489 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.563801 0.400119 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.546337 0.37865 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.569335 0.379464 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.555599 0.35918 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.527065 0.37902 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.536327 0.359551 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.530793 0.380205 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.522591 0.339267 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.501272 0.340934 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.522591 0.339267 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.517056 0.359921 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.501272 0.340934 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.517056 0.359921 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.522591 0.339267 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.506807 0.320279 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.528125 0.318612 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.528125 0.318612 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.586119 0.388377 0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.594185 0.405974 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.609969 0.394768 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.593017 0.410332 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.570335 0.399584 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.569167 0.403942 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.562269 0.381987 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.587286 0.384019 0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.57922 0.366422 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.60307 0.372813 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.566667 0.317871 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.567308 0.314012 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.587901 0.320398 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.569787 0.336891 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.546074 0.311485 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.548554 0.334364 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.545434 0.315344 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.564188 0.294991 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.563547 0.29885 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.584781 0.301377 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.638217 0.337042 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.659244 0.341809 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.65787 0.345471 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.645657 0.360383 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.639592 0.33338 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.626005 0.351955 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.618565 0.328614 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.651804 0.318468 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.630777 0.313702 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.65043 0.32213 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.643951 0.172546 0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.674191 0.202787 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.690652 0.219248 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.695267 0.206403 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.677807 0.223862 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669577 0.215632 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.656732 0.220246 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.653116 0.199171 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.687036 0.198172 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.670575 0.181711 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.691651 0.185327 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.715501 0.191718 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.733129 0.203821 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.715501 0.191718 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.709966 0.212373 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.733129 0.203821 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.709966 0.212373 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.715501 0.191718 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.738664 0.183166 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.721035 0.171063 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.721035 0.171063 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.663122 0.244096 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.675225 0.261725 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.683777 0.238562 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.663122 0.244096 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.65457 0.267259 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.642468 0.249631 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.642468 0.249631 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.675225 0.261725 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.663122 0.244096 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.683777 0.238562 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.602641 0.183615 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.600215 0.197046 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.622701 0.191021 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.609032 0.207465 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.580155 0.18964 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.588972 0.200059 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.582581 0.176209 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.593824 0.173196 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.596251 0.159765 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.61631 0.167171 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.591572 0.224924 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.587397 0.24926 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.606693 0.240045 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.606693 0.240045 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.572277 0.23414 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.591572 0.224924 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.576452 0.209804 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.572277 0.23414 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.576452 0.209804 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.591572 0.224924 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.5724 0.153374 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.551082 0.155041 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.5724 0.153374 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.566866 0.174029 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.551082 0.155041 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.566866 0.174029 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.5724 0.153374 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.556617 0.134387 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.577935 0.13272 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.577935 0.13272 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.655019 0.131237 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.668451 0.12881 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.678869 0.137627 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.662426 0.151296 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.644601 0.12242 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.638576 0.144906 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.631169 0.124846 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.661044 0.108751 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.647613 0.111177 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671463 0.117567 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.624779 0.100996 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.626446 0.0796777 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.645433 0.0954616 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.624779 0.100996 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.605791 0.0852121 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.604124 0.10653 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.604124 0.10653 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.626446 0.0796777 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.624779 0.100996 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.645433 0.0954616 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.696329 0.120168 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.720665 0.115992 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.711449 0.135288 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.711449 0.135288 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.705544 0.100872 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.696329 0.120168 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.681209 0.105047 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.705544 0.100872 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.681209 0.105047 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.696329 0.120168 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.852418 0.0955788 1.89979e-16 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.922609 0.11107 -0.0178949 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.937225 0.122151 -0.0344251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.916553 0.11086 -0.0418311 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.915202 0.131874 -0.0289382 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.943281 0.12236 -0.0104889 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.921258 0.132084 -0.00500196 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.928665 0.111279 0.00604126 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.944632 0.101346 -0.0233819 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.930016 0.0902645 -0.00685171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.92396 0.090055 -0.0307879 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.867231 0.135698 -0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.873196 0.134634 -0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.882112 0.117797 -0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.858152 0.11765 -0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.858315 0.152536 -0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.843271 0.135552 -0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.852349 0.1536 -0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.882275 0.152682 -0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.876309 0.153747 -0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.89119 0.135845 -0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.877966 0.164775 0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.890926 0.182656 -0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.897331 0.159019 -0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.876622 0.167676 -0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.871561 0.188412 0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.857256 0.173431 -0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.8586 0.17053 0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.89227 0.179755 0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.87931 0.161874 0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.898675 0.156118 0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.907797 0.0709499 0.0425863 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.930963 0.0752104 0.0499923 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.924191 0.0806562 0.0268805 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.915684 0.0941344 0.0457385 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.914568 0.0655041 0.065698 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.899289 0.0844281 0.0614442 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.891402 0.0612436 0.058292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.923076 0.0520258 0.0468401 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.89991 0.0477654 0.0394341 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.916304 0.0574717 0.0237283 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.863153 0.124655 0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.875744 0.141535 0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.88655 0.129819 0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.868763 0.146389 0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.852347 0.136371 0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.845366 0.141225 0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.839756 0.119492 0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.870135 0.119801 0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.857544 0.102922 0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.880941 0.108085 0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.837606 0.0554592 0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.842832 0.0523913 0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.86055 0.0593957 0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.842434 0.0750766 0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.819888 0.0484547 0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.81949 0.07114 0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.814662 0.0515226 0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.838004 0.0327739 0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.832778 0.0358417 0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.855722 0.0397783 0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.897062 0.0418734 -0.0246914 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.920407 0.0359958 -0.0301783 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.912106 0.0588574 -0.0344321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.915603 0.0511067 -0.0112511 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.905363 0.0190117 -0.0204376 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.900559 0.0341227 -0.00151032 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.882018 0.0248894 -0.0149506 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.901866 0.0267625 -0.0436186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.878521 0.0326401 -0.0381316 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.893565 0.0496241 -0.0478724 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.826871 0.0263827 -0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.825102 0.00436945 0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.84533 0.018173 0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.823964 0.025051 0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.806642 0.0125791 -0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.805505 0.0332607 0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.808411 0.0345923 -0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.828008 0.00570109 -0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.829777 0.0277143 -0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.848237 0.0195047 -0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.841683 0.0665023 -0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.840284 0.0454909 -0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.856111 0.0473735 -0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.831823 0.0463379 -0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.825856 0.0646197 -0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.817395 0.0654667 -0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.827255 0.0856311 -0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.850144 0.0656554 -0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.851543 0.0866667 -0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.865971 0.0675379 -0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.69376 -0.0133465 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.740325 -0.0440268 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.762259 -0.0417568 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.759495 -0.0345526 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.748937 -0.0216407 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.743089 -0.051231 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.729767 -0.0311149 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.721155 -0.053501 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.753646 -0.0641429 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.731712 -0.0664129 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.750882 -0.0569387 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.76531 0.0058253 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.782939 0.0179281 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.76531 0.0058253 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.759776 0.02648 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.782939 0.0179281 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.759776 0.02648 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.76531 0.0058253 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.788473 -0.00272662 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.770845 -0.0148294 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.770845 -0.0148294 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.721234 0.0272215 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.736829 0.0454452 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.742467 0.0297485 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.724354 0.046242 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.715595 0.0429182 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.70312 0.043715 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.7 0.0246945 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.733709 0.0264247 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.718114 0.00820099 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.739347 0.010728 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.668775 -0.0631985 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.669983 -0.0708196 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.690113 -0.0618185 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671462 -0.0467378 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.648644 -0.0721997 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.650123 -0.0481178 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.647436 -0.0645786 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.667296 -0.0872804 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.666087 -0.0796593 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.687426 -0.0782793 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.649684 0.00804971 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.646718 0.0244627 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669336 0.016478 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.657124 0.0313903 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627066 0.0160343 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.637471 0.022962 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.630031 -0.000378614 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.639278 0.00112207 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.642244 -0.0152909 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.661896 -0.00686255 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.62221 -0.0325183 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.600892 -0.0308513 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.62221 -0.0325183 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.616676 -0.0118635 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.600892 -0.0308513 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.616676 -0.0118635 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.62221 -0.0325183 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.606426 -0.051506 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627745 -0.053173 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627745 -0.053173 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.712851 -0.0845947 0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.730141 -0.101422 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.736701 -0.0782041 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.725284 -0.0832945 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.706291 -0.107813 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.701434 -0.0896851 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.689001 -0.0909853 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.717709 -0.102723 0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.700418 -0.0858949 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.724268 -0.0795043 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.666287 -0.0539145 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.655153 -0.0751594 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671821 -0.0745692 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.649783 -0.0638711 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.649619 -0.0545047 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.644249 -0.0432164 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.660752 -0.0332597 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671657 -0.0652028 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.682791 -0.0439578 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.688325 -0.0646126 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.737837 -0.0347427 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.752567 -0.0269197 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.732303 -0.014088 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.751574 -0.0144587 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.758102 -0.0475745 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.757108 -0.0351134 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.743371 -0.0553974 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.73883 -0.0472037 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.7241 -0.0550267 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.718566 -0.0343719 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.69376 -0.0133465 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.745859 -0.0646815 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.770032 -0.0684873 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.759394 -0.0481266 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.762305 -0.0507391 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.756497 -0.0850422 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.74877 -0.067294 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.732325 -0.0812364 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.753586 -0.0824297 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.729413 -0.0786239 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.742948 -0.062069 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.76531 0.0058253 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.782939 0.0179281 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.76531 0.0058253 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.759776 0.02648 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.782939 0.0179281 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.759776 0.02648 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.76531 0.0058253 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.788473 -0.00272662 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.770845 -0.0148294 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.770845 -0.0148294 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.737837 -0.0347427 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.758864 -0.0299763 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.757489 -0.0263144 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.745277 -0.0114021 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.739212 -0.0384047 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.725625 -0.0198304 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.718185 -0.043171 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.751424 -0.0533169 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.730397 -0.0580833 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.750049 -0.0496549 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.674309 -0.0838533 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.675276 -0.106805 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.694308 -0.091423 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.673094 -0.0875713 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.655278 -0.0992356 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.653095 -0.0800016 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.65431 -0.0762835 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.676491 -0.103087 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.675524 -0.0801352 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.695522 -0.0877049 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.666287 -0.0539145 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.666927 -0.0577732 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.68752 -0.0513875 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669407 -0.034894 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.645694 -0.0603001 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.648173 -0.0374209 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.645053 -0.0564414 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.663807 -0.0767937 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.663167 -0.072935 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.6844 -0.070408 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.62221 -0.0325183 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.600892 -0.0308513 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.62221 -0.0325183 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.616676 -0.0118635 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.600892 -0.0308513 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.616676 -0.0118635 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.62221 -0.0325183 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.606426 -0.051506 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627745 -0.053173 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627745 -0.053173 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.701782 -0.0432853 -0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.717566 -0.0544915 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.725632 -0.0368947 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.718734 -0.0588496 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.693716 -0.0608821 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.694884 -0.0652402 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.677932 -0.0496759 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.700615 -0.0389272 -0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.684831 -0.027721 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.708681 -0.0213304 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.649684 0.00804971 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.640422 0.0275193 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.644149 0.0287044 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.66342 0.0283337 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.645956 0.00686453 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.668955 0.00767898 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.655218 -0.012605 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.626685 0.00723527 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.635947 -0.0122343 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.630413 0.00842045 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.721234 0.0272215 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.725055 0.0280589 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.726768 0.00656677 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.70473 0.0172649 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.71952 0.0487136 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.699195 0.0379196 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.715699 0.0478762 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.741558 0.0380155 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.737738 0.0371781 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.743272 0.0165234 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.172546 0.643951 1.11022e-16 RAD 0.166667
+ txt002
+ SPHERE CENTER 0.281471 0.802608 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.30566 0.824035 -0.177765 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.302088 0.822021 -0.202114 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.298094 0.802598 -0.187402 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282758 0.821938 -0.186751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.309654 0.843459 -0.192477 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.290324 0.843375 -0.177114 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.313227 0.845472 -0.168128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.32499 0.824119 -0.193128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.328563 0.826132 -0.16878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.320997 0.804695 -0.178416 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.305221 0.752156 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.325175 0.741263 -0.169507 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.325981 0.765112 -0.163165 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.32493 0.747715 -0.145675 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.304415 0.728307 -0.166213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.304171 0.734759 -0.142381 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.284462 0.7392 -0.156576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.305466 0.745704 -0.183703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.285513 0.756597 -0.174066 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.306272 0.769553 -0.17736 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.241352 0.787796 -0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.218449 0.785699 -0.180578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.223304 0.778718 -0.157397 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.22345 0.802677 -0.163362 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.236497 0.794777 -0.194773 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.241498 0.811756 -0.177557 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.2594 0.796874 -0.185788 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.236351 0.770818 -0.188808 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.259253 0.772915 -0.179823 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.241205 0.763837 -0.165627 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.28191 0.874487 -0.129006 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.292033 0.891539 -0.143718 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.305711 0.872763 -0.135349 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.28812 0.868678 -0.152187 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.268233 0.893263 -0.137375 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.264319 0.870402 -0.145845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.25811 0.876212 -0.122663 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.285824 0.897348 -0.120537 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.275701 0.880296 -0.105825 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.299501 0.878572 -0.112168 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.217602 0.838248 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.206363 0.860225 -0.122182 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.223536 0.854636 -0.105343 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.230102 0.858689 -0.128798 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.200429 0.843837 -0.139672 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.224168 0.842301 -0.146288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.211667 0.821861 -0.140323 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.193863 0.839784 -0.116217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.205101 0.817808 -0.116868 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.211035 0.834196 -0.0993785 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.257721 0.853061 -0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.26204 0.87538 -0.0527151 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.280934 0.860805 -0.0590577 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.266856 0.87108 -0.0765474 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.238827 0.867636 -0.0560094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.243643 0.863337 -0.0798417 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.234508 0.845317 -0.0656463 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.252905 0.857361 -0.0385197 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.248586 0.835041 -0.0481565 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271799 0.842785 -0.0448623 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.34578 0.838847 -0.117284 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.360404 0.851488 -0.132647 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.347059 0.832518 -0.141116 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.335865 0.853509 -0.1345 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.359125 0.857816 -0.108814 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.334587 0.859838 -0.110668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.344501 0.845176 -0.0934517 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.370319 0.836826 -0.115431 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.355695 0.824185 -0.100068 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356973 0.817857 -0.1239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.321591 0.817421 -0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.340361 0.83071 -0.0416443 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.341208 0.822249 -0.0648253 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.325527 0.840365 -0.0588603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.320744 0.825882 -0.0274488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.30591 0.835537 -0.0446649 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.301973 0.812593 -0.0364345 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.336425 0.807766 -0.0334138 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.317654 0.794477 -0.0423994 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337272 0.799305 -0.0565949 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.345341 0.766968 -0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.369945 0.768944 -0.10004 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356171 0.780624 -0.116879 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356172 0.788341 -0.093424 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.359115 0.755289 -0.0825505 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.345342 0.774685 -0.0759343 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.334511 0.753313 -0.0818993 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.359113 0.747572 -0.106005 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.33451 0.745596 -0.105354 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.34534 0.759252 -0.122844 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.358439 0.594141 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.408291 0.619127 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.411883 0.625955 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.396287 0.607547 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.390369 0.630791 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.423887 0.637535 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.402373 0.642371 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.420295 0.630706 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.429805 0.61429 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.426212 0.607462 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.414208 0.595882 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337042 0.638217 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.344865 0.652948 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.357326 0.651954 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.357697 0.632683 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.324581 0.639211 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337413 0.618946 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.316758 0.624481 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.324211 0.658482 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.316388 0.643752 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.336672 0.657489 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37761 0.665691 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.389713 0.68332 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.398265 0.660156 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37761 0.665691 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.369058 0.688854 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356956 0.671225 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356956 0.671225 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.389713 0.68332 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37761 0.665691 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.398265 0.660156 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.429687 0.57505 -0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.452905 0.58161 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.434777 0.586467 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436077 0.5989 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.447815 0.570193 -0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.430987 0.587483 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.424596 0.563633 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.446515 0.55776 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.423296 0.5512 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.428387 0.562617 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399007 0.621614 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.41723 0.637209 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.418027 0.624734 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.401533 0.642848 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.39821 0.634089 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.382513 0.639728 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.379986 0.618494 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.414703 0.615976 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.39648 0.600381 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4155 0.603501 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.379835 0.550064 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.396248 0.547099 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.403175 0.557504 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.388263 0.569716 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.372907 0.539659 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.364922 0.562276 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356494 0.542624 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.387819 0.527447 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.371406 0.530412 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.394747 0.537852 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.389119 0.547576 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.410169 0.541008 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.405866 0.564748 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.410472 0.548718 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.393422 0.523836 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.393725 0.531546 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.372372 0.530405 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.388816 0.539866 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367766 0.546435 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.384513 0.563607 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.339267 0.522591 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.340934 0.501272 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.359921 0.517056 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.339267 0.522591 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.320279 0.506807 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.318612 0.528125 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.318612 0.528125 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.340934 0.501272 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.339267 0.522591 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.359921 0.517056 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.317871 0.566667 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.296626 0.555534 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.307914 0.550163 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.297216 0.572202 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.306582 0.572037 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.307172 0.588706 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.327827 0.583171 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31728 0.549999 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.338525 0.561133 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.328569 0.544629 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.172546 0.643951 -0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.142305 0.674191 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.144155 0.692502 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.150298 0.696439 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.164554 0.682184 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.136163 0.670254 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.156561 0.659936 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.134313 0.651943 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.121907 0.684509 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.120057 0.666199 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.12805 0.688447 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.100996 0.663122 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0847178 0.680265 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.104191 0.675047 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.107387 0.686972 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0815225 0.66834 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.104191 0.675047 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0978007 0.651197 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0783272 0.656415 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0946054 0.639272 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0978007 0.651197 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.153374 0.715501 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.160081 0.738169 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.177224 0.721891 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.165299 0.718696 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.136231 0.731779 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.141449 0.712305 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.129524 0.70911 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.148156 0.734974 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.141449 0.712305 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.165299 0.718696 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.213855 0.655019 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.213517 0.662308 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.194382 0.649801 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.198584 0.673065 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.23299 0.667526 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.218058 0.678283 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.233329 0.660237 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.228788 0.644262 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.229127 0.636974 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.209653 0.631756 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.224924 0.696329 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.23918 0.710584 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.233654 0.687599 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.216195 0.705059 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.23045 0.719314 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.207465 0.713788 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.216195 0.705059 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.24791 0.701855 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.233654 0.687599 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.242384 0.678869 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.244096 0.624779 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.266765 0.631486 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.247291 0.636704 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.250487 0.648629 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.26357 0.619561 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.247291 0.636704 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.240901 0.612854 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.260374 0.607636 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.237705 0.600929 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.240901 0.612854 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.161477 0.602641 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.162741 0.579817 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.179523 0.58737 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.156259 0.583168 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.144695 0.595088 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.138214 0.598439 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.143431 0.617912 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.167958 0.59929 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.166695 0.622115 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.184741 0.606843 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.191718 0.5724 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.208861 0.556122 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.215568 0.578791 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.203643 0.575596 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.185011 0.549732 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.179793 0.569205 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.167868 0.56601 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.196936 0.552927 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.179793 0.569205 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.203643 0.575596 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.120168 0.591572 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.105912 0.577317 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.128897 0.582843 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.111438 0.600302 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0971825 0.586046 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.102708 0.609032 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.111438 0.600302 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.114642 0.568587 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.128897 0.582843 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.137627 0.574113 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0955788 0.852418 9.1293e-17 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.11107 0.922609 -0.0178949 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.122151 0.937225 -0.0344251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.131874 0.915202 -0.0289382 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.11086 0.916553 -0.0418311 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.101346 0.944632 -0.0233819 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.090055 0.92396 -0.0307879 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0902645 0.930016 -0.00685171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.12236 0.943281 -0.0104889 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.111279 0.928665 0.00604126 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.132084 0.921258 -0.00500196 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.164775 0.877966 0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.182656 0.890926 -0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.167676 0.876622 -0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.159019 0.897331 -0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.179755 0.89227 0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.156118 0.898675 0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.161874 0.87931 0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.188412 0.871561 0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.17053 0.8586 0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.173431 0.857256 -0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.135698 0.867231 -0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.134634 0.873196 -0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.11765 0.858152 -0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.117797 0.882112 -0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.152682 0.882275 -0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.135845 0.89119 -0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.153747 0.876309 -0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.152536 0.858315 -0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.1536 0.852349 -0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.135552 0.843271 -0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0418734 0.897062 -0.0246914 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0359958 0.920407 -0.0301783 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0511067 0.915603 -0.0112511 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0588574 0.912106 -0.0344321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0267625 0.901866 -0.0436186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0496241 0.893565 -0.0478724 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0326401 0.878521 -0.0381316 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0190117 0.905363 -0.0204376 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0248894 0.882018 -0.0149506 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0341227 0.900559 -0.00151032 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0665023 0.841683 -0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0454909 0.840284 -0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0463379 0.831823 -0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0473735 0.856111 -0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0656554 0.850144 -0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0675379 0.865971 -0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0866667 0.851543 -0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0646197 0.825856 -0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0856311 0.827255 -0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0654667 0.817395 -0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0263827 0.826871 -0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.00436945 0.825102 0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.025051 0.823964 0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.018173 0.84533 0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00570109 0.828008 -0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0195047 0.848237 -0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0277143 0.829777 -0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0125791 0.806642 -0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0345923 0.808411 -0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0332607 0.805505 0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0709499 0.907797 0.0425863 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0752104 0.930963 0.0499923 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0941344 0.915684 0.0457385 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0806562 0.924191 0.0268805 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0520258 0.923076 0.0468401 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0574717 0.916304 0.0237283 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0477654 0.89991 0.0394341 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0655041 0.914568 0.065698 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0612436 0.891402 0.058292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0844281 0.899289 0.0614442 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0554592 0.837606 0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0523913 0.842832 0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0750766 0.842434 0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0593957 0.86055 0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0327739 0.838004 0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0397783 0.855722 0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0358417 0.832778 0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0484547 0.819888 0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0515226 0.814662 0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.07114 0.81949 0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.124655 0.863153 0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.141535 0.875744 0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.146389 0.868763 0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.129819 0.88655 0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.119801 0.870135 0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.108085 0.880941 0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.102922 0.857544 0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.136371 0.852347 0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.119492 0.839756 0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.141225 0.845366 0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0133465 0.69376 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.0646815 0.745859 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0684873 0.770032 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0507391 0.762305 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0481266 0.759394 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0824297 0.753586 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.062069 0.742948 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0786239 0.729413 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0850422 0.756497 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0812364 0.732325 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.067294 0.74877 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0347427 0.737837 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0299763 0.758864 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0114021 0.745277 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0263144 0.757489 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0533169 0.751424 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0496549 0.750049 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0580833 0.730397 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0384047 0.739212 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.043171 0.718185 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0198304 0.725625 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0058253 0.76531 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0179281 0.782939 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.02648 0.759776 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0058253 0.76531 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00272662 0.788473 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0148294 0.770845 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0148294 0.770845 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0179281 0.782939 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0058253 0.76531 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.02648 0.759776 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0432853 0.701782 -0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0544915 0.717566 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0588496 0.718734 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0368947 0.725632 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0389272 0.700615 -0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0213304 0.708681 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.027721 0.684831 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0608821 0.693716 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0496759 0.677932 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0652402 0.694884 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0272215 0.721234 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0280589 0.725055 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0172649 0.70473 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00656677 0.726768 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0380155 0.741558 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0165234 0.743272 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0371781 0.737738 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0487136 0.71952 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0478762 0.715699 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0379196 0.699195 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00804971 0.649684 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0275193 0.640422 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0283337 0.66342 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0287044 0.644149 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00723527 0.626685 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00842045 0.630413 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0122343 0.635947 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00686453 0.645956 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.012605 0.655218 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00767898 0.668955 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0838533 0.674309 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.106805 0.675276 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0875713 0.673094 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.091423 0.694308 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.103087 0.676491 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0877049 0.695522 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0801352 0.675524 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0992356 0.655278 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0762835 0.65431 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0800016 0.653095 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0325183 0.62221 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0308513 0.600892 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0118635 0.616676 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0325183 0.62221 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.051506 0.606426 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.053173 0.627745 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.053173 0.627745 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0308513 0.600892 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0325183 0.62221 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0118635 0.616676 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0539145 0.666287 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0577732 0.666927 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.034894 0.669407 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0513875 0.68752 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0767937 0.663807 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.070408 0.6844 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.072935 0.663167 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0603001 0.645694 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0564414 0.645053 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0374209 0.648173 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0133465 0.69376 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.0440268 0.740325 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0417568 0.762259 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0216407 0.748937 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0345526 0.759495 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0641429 0.753646 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0569387 0.750882 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0664129 0.731712 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.051231 0.743089 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.053501 0.721155 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0311149 0.729767 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0272215 0.721234 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0454452 0.736829 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.046242 0.724354 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0297485 0.742467 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0264247 0.733709 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.010728 0.739347 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00820099 0.718114 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0429182 0.715595 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0246945 0.7 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.043715 0.70312 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0058253 0.76531 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0179281 0.782939 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.02648 0.759776 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0058253 0.76531 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00272662 0.788473 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0148294 0.770845 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0148294 0.770845 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0179281 0.782939 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0058253 0.76531 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.02648 0.759776 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0845947 0.712851 0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.101422 0.730141 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0832945 0.725284 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0782041 0.736701 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.102723 0.717709 0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0795043 0.724268 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0858949 0.700418 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.107813 0.706291 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0909853 0.689001 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0896851 0.701434 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0347427 0.737837 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0269197 0.752567 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0144587 0.751574 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.014088 0.732303 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0472037 0.73883 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0343719 0.718566 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0550267 0.7241 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0475745 0.758102 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0553974 0.743371 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0351134 0.757108 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0539145 0.666287 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0751594 0.655153 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0638711 0.649783 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0745692 0.671821 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0652028 0.671657 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0646126 0.688325 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0439578 0.682791 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0545047 0.649619 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0332597 0.660752 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0432164 0.644249 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0631985 0.668775 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0708196 0.669983 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0467378 0.671462 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0618185 0.690113 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0872804 0.667296 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0782793 0.687426 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0796593 0.666087 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0721997 0.648644 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0645786 0.647436 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0481178 0.650123 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0325183 0.62221 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0308513 0.600892 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0118635 0.616676 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0325183 0.62221 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.051506 0.606426 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.053173 0.627745 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.053173 0.627745 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0308513 0.600892 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0325183 0.62221 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0118635 0.616676 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00804971 0.649684 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0244627 0.646718 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0313903 0.657124 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.016478 0.669336 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00112207 0.639278 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00686255 0.661896 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0152909 0.642244 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0160343 0.627066 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.000378614 0.630031 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.022962 0.637471 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.281471 0.802608 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.329459 0.858698 0.104938 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.34259 0.872345 0.0890951 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.338969 0.848329 0.0846485 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.32016 0.86421 0.0827387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.333079 0.882715 0.109385 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.310649 0.87458 0.103028 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.319948 0.869068 0.125228 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.351888 0.866833 0.111295 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.338757 0.853186 0.127138 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.348268 0.842817 0.106848 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337088 0.798572 0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.346884 0.808673 0.0420622 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.322361 0.807762 0.044793 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.335792 0.82298 0.0588533 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.361611 0.799483 0.0596212 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.350519 0.81379 0.0764123 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.351815 0.789382 0.079911 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.34818 0.784265 0.0455609 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.338384 0.774164 0.0658506 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.323657 0.783355 0.0482916 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.280879 0.845371 0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.291048 0.849036 0.0284303 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.304882 0.840755 0.0471312 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.287867 0.826067 0.0369125 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.267046 0.853652 0.0319289 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.263865 0.830683 0.0404111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.256877 0.849987 0.0541285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.28406 0.868341 0.0421477 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.273891 0.864676 0.0643473 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.297894 0.86006 0.0608487 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.273842 0.862735 0.153697 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.282313 0.885497 0.158144 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29787 0.867718 0.150967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.281455 0.876946 0.134996 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.258284 0.880514 0.160875 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.257427 0.871963 0.137727 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.249813 0.857752 0.156428 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.274699 0.871286 0.176845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.266228 0.848523 0.172398 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.290257 0.853506 0.169668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.225263 0.849407 0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.21889 0.873186 0.0974792 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.236437 0.866351 0.113449 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.240865 0.865588 0.0891702 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.207715 0.856242 0.0834188 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.22969 0.848644 0.0751099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.214088 0.832464 0.0853287 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.203288 0.857005 0.107698 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.20966 0.833227 0.109608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.220835 0.850171 0.123668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.225855 0.806645 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.21762 0.818054 0.18016 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.241754 0.813612 0.177429 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.230661 0.83061 0.163369 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.20172 0.811087 0.162601 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.214761 0.823642 0.14581 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.209955 0.799677 0.142311 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.212813 0.794089 0.176661 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.221048 0.78268 0.156372 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.236948 0.789647 0.173931 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.330051 0.815936 0.165419 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.350165 0.828769 0.171776 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.347547 0.820583 0.148628 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.333232 0.838905 0.156937 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.332668 0.824121 0.188567 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.315735 0.834258 0.173728 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.312554 0.811288 0.182211 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.346984 0.805799 0.180258 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.32687 0.792966 0.173902 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.344366 0.797614 0.157111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282063 0.759846 0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.29233 0.756464 0.193792 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.305929 0.765125 0.175091 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.288514 0.779336 0.18531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.268464 0.751185 0.190293 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.264649 0.774058 0.181811 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.258198 0.754567 0.168094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.285879 0.736973 0.180075 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.275612 0.740355 0.157875 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.299478 0.745634 0.161374 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.33768 0.75581 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.362219 0.753851 0.124743 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.352319 0.76987 0.108773 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.350765 0.774086 0.133052 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.347581 0.739791 0.138803 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.336127 0.760026 0.147112 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.323042 0.74175 0.136894 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.349134 0.735575 0.114524 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.324595 0.737534 0.112614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.339233 0.751594 0.0985541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.172546 0.643951 0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.202787 0.674191 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.219248 0.690652 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.223862 0.677807 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.206403 0.695267 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.198172 0.687036 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.185327 0.691651 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.181711 0.670575 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.215632 0.669577 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.199171 0.653116 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.220246 0.656732 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.244096 0.663122 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.261725 0.675225 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.244096 0.663122 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.238562 0.683777 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.261725 0.675225 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.238562 0.683777 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.244096 0.663122 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.267259 0.65457 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.249631 0.642468 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.249631 0.642468 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.191718 0.715501 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.203821 0.733129 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.212373 0.709966 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.191718 0.715501 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.183166 0.738664 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.171063 0.721035 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.171063 0.721035 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.203821 0.733129 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.191718 0.715501 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.212373 0.709966 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.131237 0.655019 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.12881 0.668451 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.151296 0.662426 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.137627 0.678869 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.108751 0.661044 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.117567 0.671463 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.111177 0.647613 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.12242 0.644601 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.124846 0.631169 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.144906 0.638576 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.120168 0.696329 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.115992 0.720665 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.135288 0.711449 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.135288 0.711449 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.100872 0.705544 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.120168 0.696329 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.105047 0.681209 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.100872 0.705544 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.105047 0.681209 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.120168 0.696329 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.100996 0.624779 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0796777 0.626446 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.100996 0.624779 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0954616 0.645433 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0796777 0.626446 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0954616 0.645433 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.100996 0.624779 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0852121 0.605791 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.10653 0.604124 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.10653 0.604124 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.183615 0.602641 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.197046 0.600215 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.207465 0.609032 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.191021 0.622701 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.173196 0.593824 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.167171 0.61631 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.159765 0.596251 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.18964 0.580155 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.176209 0.582581 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.200059 0.588972 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.153374 0.5724 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.155041 0.551082 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.174029 0.566866 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.153374 0.5724 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.134387 0.556617 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.13272 0.577935 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.13272 0.577935 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.155041 0.551082 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.153374 0.5724 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.174029 0.566866 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.224924 0.591572 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.24926 0.587397 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.240045 0.606693 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.240045 0.606693 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.23414 0.572277 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.224924 0.591572 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.209804 0.576452 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.23414 0.572277 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.209804 0.576452 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.224924 0.591572 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.358439 0.594141 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.428945 0.613592 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.448155 0.626191 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.43276 0.614455 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.42519 0.634643 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.44434 0.625328 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.421375 0.63378 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.42513 0.612729 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.45191 0.60514 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4327 0.592541 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436515 0.593404 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399007 0.621614 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.399844 0.625435 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.38905 0.60511 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.378352 0.627149 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.409801 0.641939 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.388308 0.643653 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.408963 0.638118 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.420499 0.619901 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.419661 0.61608 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.409705 0.599576 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37761 0.665691 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.389713 0.68332 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.398265 0.660156 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37761 0.665691 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.369058 0.688854 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356956 0.671225 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356956 0.671225 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.389713 0.68332 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37761 0.665691 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.398265 0.660156 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.388377 0.586119 0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.405974 0.594185 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.410332 0.593017 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.394768 0.609969 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.384019 0.587286 0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.372813 0.60307 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.366422 0.57922 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399584 0.570335 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.381987 0.562269 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.403942 0.569167 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337042 0.638217 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.341809 0.659244 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.360383 0.645657 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.345471 0.65787 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.318468 0.651804 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.32213 0.65043 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.313702 0.630777 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.33338 0.639592 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.328614 0.618565 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.351955 0.626005 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.317871 0.566667 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.314012 0.567308 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.336891 0.569787 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.320398 0.587901 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.294991 0.564188 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.301377 0.584781 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29885 0.563547 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.311485 0.546074 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.315344 0.545434 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.334364 0.548554 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.409774 0.542042 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.433888 0.53788 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.426423 0.55574 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.423551 0.558395 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.417238 0.524182 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.406901 0.544697 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.393124 0.528344 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.42011 0.521526 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.395996 0.525689 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.412646 0.539387 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.339267 0.522591 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.340934 0.501272 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.359921 0.517056 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.339267 0.522591 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.320279 0.506807 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.318612 0.528125 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.318612 0.528125 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.340934 0.501272 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.339267 0.522591 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.359921 0.517056 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.379835 0.550064 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.399304 0.540802 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.400119 0.563801 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.400489 0.54453 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37902 0.527065 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.380205 0.530793 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.359551 0.536327 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37865 0.546337 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.35918 0.555599 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.379464 0.569335 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.371785 0.0996195 0.544331 RAD 0.166667
+ txt002
+ SPHERE CENTER -0.393621 0.220501 0.729516 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.368601 0.279642 0.766439 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.354293 0.299716 0.765035 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.347717 0.279022 0.753281 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.366989 0.292196 0.745238 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.375177 0.300337 0.778193 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.387873 0.292817 0.758396 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.389485 0.280263 0.779597 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.355904 0.287162 0.786236 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.370213 0.267088 0.787639 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.349329 0.266468 0.774481 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.321889 0.238665 0.726118 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.304702 0.250544 0.71296 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.32307 0.238717 0.701455 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.327715 0.259421 0.714081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.30352 0.250492 0.737623 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.326533 0.259369 0.738744 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.320707 0.238612 0.750781 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.298875 0.229788 0.724997 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.316063 0.217908 0.738155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.317244 0.21796 0.713492 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.372464 0.281062 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.362978 0.289441 0.671279 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.35549 0.267771 0.680442 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.378255 0.270044 0.671155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.379952 0.302733 0.683315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.395229 0.283335 0.683192 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.389438 0.294353 0.704516 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.357187 0.30046 0.692603 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.366673 0.29208 0.713804 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.349699 0.278789 0.701767 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.440333 0.261479 0.769837 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.443285 0.282991 0.781591 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.421181 0.271991 0.781342 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.4302 0.282046 0.760673 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.462437 0.27248 0.770086 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.449353 0.271534 0.749168 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.459485 0.250967 0.758332 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.453417 0.262424 0.790755 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.450466 0.240911 0.779001 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.431313 0.251423 0.790506 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.444196 0.262898 0.695877 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.449273 0.285685 0.687835 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436139 0.282528 0.708504 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.426189 0.27701 0.68659 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.45733 0.266055 0.675209 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434246 0.257381 0.673964 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.452254 0.243269 0.683251 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.46728 0.271573 0.697123 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.462204 0.248787 0.705165 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.454146 0.268416 0.717791 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.465353 0.202338 0.732914 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.486123 0.204606 0.746073 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.464339 0.202946 0.757577 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.470107 0.223366 0.744951 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.487137 0.203998 0.72141 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.471122 0.222757 0.720288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.466367 0.201729 0.708251 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.481368 0.183578 0.734036 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.460599 0.18131 0.720878 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.459584 0.181918 0.745541 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.389758 0.219082 0.803476 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.378635 0.228779 0.823273 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.365937 0.225483 0.802355 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.383364 0.24293 0.8036 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.402455 0.222377 0.824394 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.407185 0.236529 0.804721 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.413578 0.21268 0.804597 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.385029 0.20493 0.823149 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.396152 0.195233 0.803352 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.372331 0.201634 0.802231 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.414778 0.15994 0.766553 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.412573 0.147477 0.787754 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.39322 0.15977 0.77859 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.412448 0.172167 0.787878 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434131 0.147647 0.775717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434006 0.172338 0.775841 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436336 0.16011 0.754517 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.414903 0.13525 0.766429 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.417108 0.147713 0.745229 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.39555 0.147543 0.757266 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.343046 0.178104 0.763155 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.319723 0.177083 0.771198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.325124 0.189464 0.750529 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.332294 0.198298 0.772443 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.337645 0.165722 0.783824 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.350216 0.186938 0.785069 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.360967 0.166743 0.775781 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.330475 0.156889 0.76191 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.353797 0.157909 0.753867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.335876 0.16927 0.741241 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.191247 0.166275 0.655442 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.130089 0.20793 0.652044 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.115471 0.221102 0.637128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.126388 0.200597 0.628759 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.13987 0.220766 0.633356 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.119172 0.228435 0.660413 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.143571 0.228099 0.656641 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.13379 0.215264 0.675329 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.10569 0.208266 0.655816 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.120308 0.195095 0.670732 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.116607 0.187762 0.647447 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.154295 0.172673 0.591563 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.15554 0.180792 0.568278 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.17557 0.171251 0.579113 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.166926 0.19323 0.586315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.134265 0.182215 0.580727 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.145651 0.194652 0.598764 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.133019 0.174096 0.604012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.142909 0.160236 0.573526 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.141663 0.152117 0.596811 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.162939 0.150694 0.584361 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.192135 0.230419 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.18209 0.243049 0.599717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.168159 0.227721 0.613157 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.185251 0.218634 0.597829 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.206066 0.245747 0.604965 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.209227 0.221332 0.603077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.216111 0.233117 0.623653 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.188974 0.254834 0.620293 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.199019 0.242204 0.638981 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.175043 0.239506 0.633733 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.167041 0.201532 0.715923 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.151829 0.219088 0.724292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.14514 0.205084 0.705088 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.163068 0.221861 0.702483 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.173729 0.215537 0.735128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.184969 0.218309 0.713318 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.188942 0.197981 0.726759 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.155801 0.19876 0.737733 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.171014 0.181204 0.729364 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.149113 0.184756 0.718528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.229087 0.224021 0.682285 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.22829 0.248268 0.686881 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.207937 0.234532 0.689486 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.216949 0.2391 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.249439 0.237756 0.67968 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.238098 0.228589 0.659755 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.250236 0.213509 0.675083 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.240428 0.233189 0.702209 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.241225 0.208942 0.697613 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.220075 0.219453 0.704814 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.228199 0.159877 0.719322 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.229756 0.167942 0.742607 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.207683 0.16569 0.731771 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.223214 0.183484 0.72457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.250271 0.162129 0.730157 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.243729 0.177671 0.71212 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.248714 0.154064 0.706872 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.234741 0.144336 0.737359 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.233184 0.13627 0.714074 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.212668 0.142084 0.726523 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.129201 0.143787 0.689081 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.105335 0.14887 0.692853 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.115741 0.153943 0.671044 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.121723 0.167242 0.690969 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.118795 0.138714 0.71089 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.135183 0.157086 0.709006 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.142661 0.13363 0.707118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.112813 0.125414 0.690965 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.136679 0.120331 0.687193 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.123219 0.130487 0.669156 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.190359 0.102131 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.179968 0.0897843 0.711167 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.166467 0.105492 0.697727 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.183804 0.114103 0.713055 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.20386 0.0864233 0.705919 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.207696 0.110742 0.707807 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.214251 0.0987702 0.687231 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.186523 0.0778128 0.690591 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.196914 0.0901597 0.671903 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.173022 0.0935207 0.677151 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.153407 0.108529 0.6286 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.130858 0.0995811 0.624003 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.135326 0.123725 0.621398 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.134736 0.113639 0.643928 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.148938 0.0843858 0.631205 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.152816 0.0984435 0.65113 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.171487 0.0933338 0.635801 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.149528 0.0944715 0.608675 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.172078 0.10342 0.613272 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.153997 0.118615 0.60607 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.31427 0.31427 0.544331 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.277961 0.367156 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.269898 0.374298 0.485076 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.270045 0.350338 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.291334 0.362218 0.487134 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.277815 0.391115 0.501329 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.299251 0.379036 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.285878 0.383973 0.523547 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.256525 0.379235 0.505236 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.264588 0.372093 0.527454 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.256671 0.355276 0.511201 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.252306 0.297666 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.235688 0.305995 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.259438 0.312359 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.245915 0.321516 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.228556 0.291303 0.509559 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.238783 0.306824 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.245173 0.282974 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.242079 0.282145 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.258696 0.273816 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.265828 0.288509 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.31427 0.31427 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.32435 0.32435 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.33812 0.32066 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.32066 0.33812 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.3005 0.317959 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.29681 0.331729 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.29042 0.307879 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.317959 0.3005 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.307879 0.29042 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.331729 0.29681 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339925 0.383759 0.544331 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.334762 0.407156 0.538366 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.31686 0.392275 0.546597 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.326552 0.388696 0.524171 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.357827 0.39864 0.536101 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.349618 0.380181 0.521905 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.362991 0.375243 0.542066 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.348135 0.402218 0.558526 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.353299 0.378821 0.564491 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.330233 0.387337 0.566757 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.376234 0.330873 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.393346 0.348239 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.383366 0.345565 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.369843 0.354723 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.386213 0.333547 0.484868 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.362711 0.340031 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.369102 0.316181 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399736 0.324389 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.382624 0.307023 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.389757 0.321715 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.376234 0.330873 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.386461 0.346394 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.362711 0.340031 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.369843 0.354723 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399983 0.337237 0.579103 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.383366 0.345565 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.389757 0.321715 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.392851 0.322544 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.382624 0.307023 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.369102 0.316181 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.277961 0.367156 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.261966 0.385852 0.57931 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.259422 0.36581 0.565115 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.278159 0.38141 0.561208 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.280504 0.387198 0.595564 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.296698 0.382755 0.577461 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.2965 0.368501 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.261768 0.371598 0.599471 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.277764 0.352901 0.601529 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.259225 0.351556 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.31427 0.31427 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.304189 0.32435 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.29042 0.32066 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.307879 0.33812 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.328039 0.317959 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.331729 0.331729 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.33812 0.307879 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.31058 0.3005 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.32066 0.29042 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.29681 0.29681 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.252306 0.297666 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.228803 0.30415 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.238783 0.306824 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.245915 0.321516 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.242326 0.294992 0.603794 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.259438 0.312359 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.265828 0.288509 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.235194 0.2803 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.258696 0.273816 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.245173 0.282974 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.574159 0.153845 0.618405 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.612768 0.202534 0.658726 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.612732 0.225282 0.668328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.591695 0.212428 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.60221 0.22113 0.64638 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.633805 0.215388 0.660098 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.623283 0.211236 0.63815 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.63384 0.192641 0.650495 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62329 0.206686 0.680674 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.623325 0.183939 0.671072 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.602253 0.193832 0.679302 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.543919 0.184086 0.678886 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.527458 0.200547 0.687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522843 0.187702 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.540303 0.205161 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.548533 0.196931 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.561378 0.201546 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.564994 0.18047 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.531074 0.179472 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.547535 0.163011 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.526459 0.166627 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554987 0.225396 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.542885 0.243024 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.534333 0.219861 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554987 0.225396 0.593714 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.563539 0.248559 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.575642 0.23093 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.575642 0.23093 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542885 0.243024 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554987 0.225396 0.643096 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.534333 0.219861 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.643008 0.172294 0.598245 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.660425 0.189742 0.599616 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645434 0.185725 0.618821 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.636618 0.196144 0.598245 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.657999 0.17631 0.57904 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.634191 0.182712 0.577669 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.640582 0.158862 0.577669 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.666816 0.165892 0.599616 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.649399 0.148444 0.598245 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.651825 0.161875 0.618821 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.585228 0.195155 0.557924 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.574809 0.203972 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.561378 0.201546 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.568784 0.181486 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.598659 0.197581 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.592634 0.175095 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.609078 0.188764 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.591253 0.217641 0.549693 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.601672 0.208824 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.577822 0.215215 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.6044 0.123605 0.557924 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.620861 0.107144 0.549693 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.608016 0.102529 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.625475 0.119989 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.617245 0.128219 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.621859 0.141064 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.600784 0.14468 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.599785 0.11076 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.583324 0.127221 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.58694 0.106145 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.631939 0.130984 0.658726 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.643128 0.132649 0.680674 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.618482 0.133263 0.679302 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.631785 0.152367 0.671072 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.656585 0.130371 0.660098 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645242 0.150088 0.650495 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645397 0.128706 0.63815 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.643283 0.111266 0.668328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.632094 0.109601 0.64638 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.618637 0.11188 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.593331 0.0822954 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.591664 0.0609772 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.572676 0.076761 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.593331 0.0822954 0.643096 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.612319 0.0665116 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.613986 0.0878298 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.613986 0.0878298 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.591664 0.0609772 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.593331 0.0822954 0.593714 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.572676 0.076761 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.56309 0.112536 0.678886 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.549659 0.11011 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.53924 0.118927 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555684 0.132596 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.573509 0.103719 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.579534 0.126205 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.58694 0.106145 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.557065 0.09005 0.687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.570497 0.0924762 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.546646 0.0988668 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.494808 0.247614 0.43322 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.494287 0.313607 0.399581 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.484182 0.326876 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.470513 0.310432 0.39372 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.488171 0.302705 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.507957 0.330051 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.511946 0.305881 0.384149 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.518062 0.316783 0.405442 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.490299 0.337778 0.402668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.500404 0.324509 0.420874 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.476629 0.321334 0.415013 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.452978 0.302539 0.460062 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.436971 0.320401 0.454201 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436675 0.29902 0.441856 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.455413 0.3148 0.438769 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.453274 0.32392 0.472408 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.471717 0.318318 0.456976 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.469281 0.306057 0.478269 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434535 0.30814 0.475494 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.450543 0.290278 0.481355 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434239 0.286759 0.463149 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434629 0.269833 0.396183 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.426389 0.279233 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.445377 0.263449 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.448298 0.286276 0.383837 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.415641 0.285616 0.396183 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.43755 0.29266 0.40513 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.42388 0.276216 0.417476 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.41272 0.262789 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.420959 0.253389 0.408529 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.431707 0.247006 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.536117 0.258683 0.372739 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.549787 0.275127 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.549787 0.275127 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.529727 0.282533 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.536117 0.258683 0.348047 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.516058 0.266089 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522448 0.242239 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.556177 0.251277 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542508 0.234833 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.556177 0.251277 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.476459 0.214908 0.369341 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.457868 0.209819 0.353908 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.458164 0.2312 0.366254 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.453963 0.210053 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.476163 0.193527 0.356995 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.472258 0.193761 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.494753 0.198616 0.372427 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.480363 0.214674 0.344961 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.498954 0.219763 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.480659 0.236055 0.357307 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.536638 0.19269 0.406378 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.549603 0.17251 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.528912 0.177908 0.424584 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.549105 0.191778 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.557329 0.187292 0.394032 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.556831 0.20656 0.409464 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.544363 0.207471 0.388171 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.537136 0.173421 0.390945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.524171 0.193601 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.516445 0.178819 0.403291 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554467 0.291389 0.436618 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.562288 0.314604 0.439705 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542501 0.306499 0.45205 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.541186 0.310183 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.574255 0.299494 0.424272 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.553152 0.295073 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.566433 0.276279 0.421186 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.575569 0.29581 0.448652 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.567748 0.272595 0.445566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555781 0.287705 0.460998 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554987 0.225396 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.567359 0.227186 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.54267 0.227528 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555283 0.246777 0.482603 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.579676 0.225054 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.567601 0.244644 0.46131 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.567305 0.223263 0.448964 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.567063 0.205805 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554691 0.204014 0.457911 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542374 0.206147 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.513157 0.28032 0.497099 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.507811 0.298839 0.512531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.489718 0.287442 0.500186 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.505577 0.302049 0.488152 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.531251 0.291716 0.509445 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.529016 0.294927 0.485065 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.536597 0.273198 0.494013 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.515392 0.27711 0.521479 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.520738 0.258591 0.506047 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.497299 0.265714 0.509133 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.552323 0.0329639 0.43322 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.625877 0.0248832 0.436618 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.646362 0.0316054 0.448652 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.625173 0.0287309 0.460998 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.627981 0.0478 0.445566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.647066 0.0277577 0.424272 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.628685 0.0439523 0.421186 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62658 0.0210355 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.644258 0.00868865 0.439705 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.623773 0.00196644 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.623069 0.00581415 0.45205 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.584567 0.0138144 0.497099 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.584898 0.0177119 0.521479 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.56353 0.0185345 0.509133 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.580268 0.0364224 0.506047 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.605935 0.0129918 0.509445 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.601305 0.0317022 0.494013 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.605605 0.00909422 0.485065 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.589197 -0.00489609 0.512531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.588867 -0.00879364 0.488152 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.567829 -0.00407348 0.500186 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.593331 0.0822954 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.593994 0.105299 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.572783 0.0926585 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.582384 0.100664 0.457911 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.614541 0.0949359 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.602932 0.090301 0.448964 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.613879 0.0719323 0.46131 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604941 0.0869303 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604278 0.0639267 0.482603 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.58373 0.0742898 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.593633 0.0440327 0.372739 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.607302 0.0604766 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.607302 0.0604766 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.587242 0.0678827 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.593633 0.0440327 0.348047 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.573573 0.0514389 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.579964 0.0275889 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.613693 0.0366265 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.600023 0.0201827 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.613693 0.0366265 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.561087 0.101445 0.406378 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.551884 0.118381 0.390945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.536664 0.103361 0.403291 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.550745 0.0944221 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.576307 0.116465 0.394032 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.575168 0.0925065 0.388171 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.58551 0.0995293 0.409464 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.562225 0.125404 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.571428 0.108468 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.547006 0.110383 0.424584 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.520079 0.0521134 0.369341 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.523344 0.0542684 0.344961 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.534291 0.0358996 0.357307 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.541988 0.0591566 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.509132 0.0704822 0.356995 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.527777 0.0753703 0.372427 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.505868 0.0683272 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.501435 0.0472252 0.353908 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.49817 0.0450702 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.512382 0.0288565 0.366254 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.584869 -0.0244483 0.399581 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.5935 -0.0473753 0.402668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.57344 -0.0399691 0.415013 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.595617 -0.0308315 0.420874 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604929 -0.0318545 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.607046 -0.0153107 0.405442 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.596298 -0.00892756 0.384149 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.582752 -0.0409921 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.574121 -0.0180651 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.562692 -0.0335859 0.39372 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.511316 -0.0163676 0.396183 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.48882 -0.0212225 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.497372 0.00194055 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.491256 -0.00896145 0.408529 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.502764 -0.0395307 0.396183 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.505199 -0.0272696 0.417476 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.525259 -0.0346758 0.40513 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.50888 -0.0286287 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.531375 -0.0237738 0.383837 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.517432 -0.00546563 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.54356 -0.0355172 0.460062 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.530389 -0.0495897 0.475494 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.519442 -0.031221 0.463149 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.53532 -0.0261165 0.481355 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554507 -0.0538859 0.472408 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.559438 -0.0304127 0.478269 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.567678 -0.0398133 0.456976 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.538628 -0.0589904 0.454201 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.551799 -0.0449178 0.438769 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.527681 -0.0406217 0.441856 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.451136 0.0058509 0.729516 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.447081 0.0051487 0.803476 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.435909 0.01504 0.823149 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.423265 0.0115452 0.802231 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.440694 0.0289993 0.803352 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.459725 0.00864346 0.824394 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.46451 0.0226028 0.804597 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.470897 -0.0012478 0.804721 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.442297 -0.00881065 0.823273 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.453468 -0.0187019 0.8036 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.429652 -0.0123054 0.802355 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.386138 0.0172804 0.763155 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.364644 0.0293677 0.76191 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.375512 0.0213457 0.741241 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.385352 0.0401449 0.753867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37527 0.0253024 0.783824 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.395978 0.0360796 0.775781 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.396764 0.0132151 0.785069 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.36543 0.0065032 0.771198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.386924 -0.00558411 0.772443 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.376298 -0.00151881 0.750529 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.439178 0.0688765 0.766553 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.426942 0.0903221 0.766429 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.416328 0.0699989 0.757266 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.435083 0.0806307 0.745229 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.449792 0.0891998 0.775717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.457933 0.0795084 0.754517 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.462029 0.0677542 0.775841 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.431037 0.078568 0.787754 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.443274 0.0571224 0.787878 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.420423 0.0582447 0.77859 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.512079 -0.00628079 0.769837 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.523883 -0.000557006 0.790755 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.49924 -0.00208214 0.790506 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.51057 0.0165974 0.779001 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.536722 -0.00475566 0.770086 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.523409 0.0123987 0.758332 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.524918 -0.0104794 0.749168 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.525392 -0.0234352 0.781591 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.513588 -0.029159 0.760673 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.500749 -0.0249603 0.781342 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.504176 0.0574471 0.732914 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.508666 0.0817008 0.734036 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.488971 0.0722467 0.745541 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.489545 0.0732807 0.720878 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.523872 0.0669012 0.72141 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.504751 0.058481 0.708251 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.519382 0.0426474 0.720288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.523298 0.0658672 0.746073 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.518808 0.0416134 0.744951 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.503602 0.0564131 0.757577 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.516134 -0.00557859 0.695877 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.540463 -0.00154892 0.697123 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.52751 -0.00538221 0.717791 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.524673 0.0156462 0.705165 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.529087 -0.00174531 0.675209 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.513298 0.0154498 0.683251 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.504759 -0.00577498 0.673964 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.531924 -0.0227737 0.687835 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.507596 -0.0268034 0.68659 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.518971 -0.026607 0.708504 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.459039 -0.0578769 0.766439 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.451803 -0.0707378 0.786236 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.435761 -0.0561039 0.774481 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.454158 -0.0461991 0.787639 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.475081 -0.0725109 0.778193 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.477435 -0.0479721 0.779597 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.482316 -0.05965 0.758396 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.456685 -0.0824157 0.765035 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.46392 -0.0695548 0.745238 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.440643 -0.0677817 0.753281 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.463094 -0.0571747 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.459563 -0.081612 0.692603 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.442243 -0.0665888 0.701767 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.463589 -0.0696122 0.713804 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.480415 -0.0721979 0.683315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.48444 -0.0601982 0.704516 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.483946 -0.0477607 0.683192 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.459069 -0.0691745 0.671279 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.4626 -0.0447373 0.671155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.441749 -0.0541513 0.680442 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.398096 -0.0457452 0.726118 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.373728 -0.0495643 0.724997 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.383722 -0.030137 0.713492 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.382672 -0.0306825 0.738155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.388102 -0.0651725 0.737623 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.397047 -0.0462908 0.750781 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.41247 -0.0613535 0.738744 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.389151 -0.064627 0.71296 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.41352 -0.060808 0.714081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399146 -0.0451997 0.701455 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.4293 -0.115031 0.544331 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.424299 -0.178985 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.412497 -0.190929 0.599471 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.400273 -0.174844 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.417001 -0.16674 0.601529 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436523 -0.195071 0.595564 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.441027 -0.170881 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.448325 -0.183127 0.577461 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.419795 -0.203175 0.57931 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.431597 -0.191231 0.561208 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.407571 -0.18709 0.565115 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.367336 -0.131634 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.343834 -0.12515 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.353814 -0.122476 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.360946 -0.107784 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.357357 -0.134308 0.603794 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.374468 -0.116942 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.380859 -0.140792 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.350225 -0.149 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.373727 -0.155484 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.360204 -0.146326 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.4293 -0.115031 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.41922 -0.10495 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.40545 -0.10864 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.42291 -0.0911807 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.44307 -0.111341 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.44676 -0.0975713 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.45315 -0.121421 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.425611 -0.128801 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.435691 -0.138881 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.411841 -0.13249 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.486264 -0.162382 0.544331 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.502603 -0.174264 0.558526 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.479659 -0.170327 0.566757 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.495376 -0.15142 0.564491 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.509207 -0.166319 0.536101 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.501981 -0.143475 0.542066 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.492868 -0.154437 0.521905 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.49349 -0.185226 0.538366 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.477151 -0.173345 0.524171 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.470546 -0.18129 0.546597 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.491265 -0.0984274 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.501491 -0.082906 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.477742 -0.0892696 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.484874 -0.0745774 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.515014 -0.0920638 0.579103 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.498397 -0.0837352 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.504787 -0.107585 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.507882 -0.106756 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.497655 -0.122277 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.484132 -0.11312 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.491265 -0.0984274 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.508376 -0.0810612 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.498397 -0.0837352 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.484874 -0.0745774 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.501244 -0.0957534 0.484868 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.477742 -0.0892696 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.484132 -0.11312 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.514767 -0.104911 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.497655 -0.122277 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.504787 -0.107585 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.424299 -0.178985 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.411775 -0.200165 0.505236 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399922 -0.179342 0.511201 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.415187 -0.189948 0.527454 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436152 -0.199808 0.501329 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.439564 -0.189591 0.523547 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.448677 -0.178629 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.420888 -0.189202 0.485076 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.433412 -0.168023 0.487134 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.409035 -0.168379 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.4293 -0.115031 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.439381 -0.10495 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.45315 -0.10864 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.435691 -0.0911807 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.415531 -0.111341 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.411841 -0.0975713 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.40545 -0.121421 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.43299 -0.128801 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.42291 -0.138881 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.44676 -0.13249 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.367336 -0.131634 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.350719 -0.123305 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.374468 -0.116942 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.360946 -0.107784 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.343587 -0.137998 0.509559 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.353814 -0.122476 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.360204 -0.146326 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.357109 -0.147155 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.373727 -0.155484 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.380859 -0.140792 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.248762 -0.0483751 0.655442 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.183785 -0.0599222 0.689081 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.160406 -0.0522053 0.690965 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.171954 -0.0513956 0.669156 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.178533 -0.0358698 0.687193 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.172236 -0.0607319 0.71089 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.190363 -0.0443964 0.707118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.195615 -0.0684488 0.709006 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.165658 -0.0762577 0.692853 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.189036 -0.0839747 0.690969 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.177206 -0.075448 0.671044 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.187119 -0.0172857 0.6286 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.176731 -0.00705049 0.608675 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.192673 -0.025725 0.60607 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.200733 -0.00352517 0.613272 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.171177 0.00138875 0.631205 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.195179 0.00491406 0.635801 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.181564 -0.00884647 0.65113 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.163117 -0.020811 0.624003 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.173504 -0.0310463 0.643928 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.179058 -0.0394855 0.621398 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.215921 0.00673113 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.20044 0.0258737 0.690591 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.196602 0.00551963 0.677151 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.215612 0.0203763 0.671903 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.21976 0.0270852 0.705919 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.234932 0.0215878 0.687231 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.235241 0.00794264 0.707807 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.200749 0.0122285 0.711167 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.21623 -0.00691403 0.713055 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.196911 -0.00812553 0.697727 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.245428 -0.0910116 0.715923 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.234308 -0.0942304 0.737733 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.221514 -0.0854464 0.718528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.238704 -0.0714204 0.729364 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.258223 -0.0997955 0.735128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.262619 -0.0769856 0.726759 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.269343 -0.0965768 0.713318 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.241032 -0.113822 0.724292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.252152 -0.110603 0.702483 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.228237 -0.105038 0.705088 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.277564 -0.0243582 0.719322 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.275459 -0.0076281 0.737359 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.255218 -0.0167139 0.726523 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.270078 -0.00142185 0.714074 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.297806 -0.0152725 0.730157 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.292425 -0.00906621 0.706872 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.299911 -0.0320026 0.71212 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.282946 -0.0305645 0.742607 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.285051 -0.0472946 0.72457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.262704 -0.0396503 0.731771 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.310405 -0.0794645 0.682285 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.324811 -0.0817333 0.702209 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.300317 -0.0800146 0.704814 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.313378 -0.0603366 0.697613 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.334899 -0.0811832 0.67968 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.323466 -0.0597864 0.675083 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.320493 -0.0789143 0.659755 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.321838 -0.100861 0.686881 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.307433 -0.0985923 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.297345 -0.0991425 0.689486 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.216626 -0.115028 0.652044 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.195663 -0.127519 0.655816 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.194866 -0.104303 0.647447 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.201738 -0.108803 0.670732 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.217423 -0.138245 0.660413 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.223497 -0.119529 0.675329 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.238386 -0.125754 0.656641 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.210551 -0.133744 0.637128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.231514 -0.121254 0.633356 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.209754 -0.110528 0.628759 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.281603 -0.103481 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.291073 -0.126206 0.620293 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.271345 -0.119897 0.633733 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.293457 -0.110246 0.638981 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.301332 -0.10979 0.604965 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.303716 -0.0938302 0.623653 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.291862 -0.0870656 0.603077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.279219 -0.119442 0.599717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.269749 -0.0967168 0.597829 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.25949 -0.113132 0.613157 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.21996 -0.0723919 0.591563 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.20388 -0.0673141 0.573526 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.216456 -0.0490355 0.584361 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.198742 -0.0609052 0.596811 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.207384 -0.0906706 0.580727 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.202246 -0.0842617 0.604012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.223463 -0.0957484 0.598764 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.225098 -0.0788008 0.568278 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.241177 -0.0838786 0.586315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.237674 -0.0605222 0.579113 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.471405 0.471405 1.11022e-16 RAD 0.166667
+ txt002
+ SPHERE CENTER -0.508983 0.690426 8.51251e-17 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.484794 0.755941 -0.0246914 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.47411 0.767658 -0.0436186 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.467528 0.744501 -0.0381316 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.489758 0.749038 -0.0478724 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.491377 0.779098 -0.0301783 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.507025 0.760478 -0.0344321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.502061 0.767382 -0.0112511 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.469146 0.774562 -0.0204376 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.47983 0.762845 -0.00151032 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.462564 0.751405 -0.0149506 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436283 0.7029 -0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.418941 0.714226 -0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.43889 0.704751 -0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.44101 0.724842 -0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.416335 0.712374 0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.438403 0.722991 0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.433677 0.701048 0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.414215 0.692283 -0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.431557 0.680957 0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434163 0.682808 -0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.478434 0.695668 -0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.481931 0.703418 -0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.500827 0.694124 -0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.491475 0.716184 -0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.459538 0.704962 -0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.469082 0.717727 -0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.456041 0.697211 -0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.46889 0.682902 -0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.465393 0.675152 -0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.487786 0.673608 -0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.557494 0.743468 -0.0178949 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.560084 0.767402 -0.0233819 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.543179 0.760285 -0.00685171 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.53997 0.755145 -0.0307879 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.574398 0.750585 -0.0344251 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554284 0.738328 -0.0418311 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.571808 0.726651 -0.0289382 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.577608 0.755725 -0.0104889 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.575017 0.731791 -0.00500196 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.560703 0.748608 0.00604126 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.551134 0.683194 -0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.573364 0.687731 -0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.571303 0.682033 -0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.56324 0.703871 -0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.553195 0.688893 -0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.543071 0.705033 -0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.530964 0.684356 -0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.561258 0.667055 -0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539027 0.662518 -0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.559196 0.661356 -0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.581682 0.677953 0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.601808 0.682851 0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.579842 0.680568 0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.58454 0.700216 0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.603648 0.680237 -0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.58638 0.697602 -0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.583522 0.675339 -0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.59895 0.660588 0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.578824 0.65569 -0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.576984 0.658304 0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.515343 0.7507 0.0425863 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.506594 0.773394 0.0468401 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.491321 0.755462 0.0394341 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.507924 0.764807 0.0237283 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.530616 0.768632 0.0499923 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.531946 0.760045 0.0268805 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539365 0.745938 0.0457385 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.514012 0.759287 0.065698 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522762 0.736593 0.0614442 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.49874 0.741355 0.058292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539531 0.685185 0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.538818 0.693658 0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.517905 0.691194 0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.534075 0.708875 0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.560445 0.687649 0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555702 0.702866 0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.561158 0.679176 0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.544274 0.669969 0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.544988 0.661495 0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.523361 0.667505 0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.466832 0.697658 0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.447385 0.709346 0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.447429 0.703286 0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.46231 0.721188 0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.466788 0.703718 0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.481713 0.71556 0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.486235 0.692031 0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.451907 0.685816 0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.471354 0.674129 0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.451951 0.679757 0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.335322 0.607487 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.283164 0.659645 0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.269894 0.672915 0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.275822 0.649528 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.293281 0.666987 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.277236 0.683032 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.300624 0.677104 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.290507 0.669762 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.259777 0.665573 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.273047 0.652302 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.265705 0.642185 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.286452 0.603979 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.279361 0.614273 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.303327 0.613293 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.288206 0.628413 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.262487 0.604959 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.271332 0.619099 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.269578 0.594664 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.277607 0.589839 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.284698 0.579544 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.301572 0.588858 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.33883 0.656357 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.328536 0.663448 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.314396 0.654603 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.329516 0.639482 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.35297 0.665202 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.353951 0.641237 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.363265 0.658111 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.33785 0.680322 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.348145 0.673232 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.32371 0.671477 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.332034 0.663153 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.321274 0.684748 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.308341 0.666888 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.326131 0.678752 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.344967 0.681014 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.349824 0.675018 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.355727 0.659419 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.327177 0.669149 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.337937 0.647554 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.314244 0.651289 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.3877 0.659866 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.391875 0.684201 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37258 0.674986 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37258 0.674986 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.406996 0.669081 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.3877 0.659866 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.40282 0.644745 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.406996 0.669081 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.40282 0.644745 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.3877 0.659866 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.384191 0.610996 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.389739 0.622198 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.366159 0.617804 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.378964 0.63493 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.407771 0.61539 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.396997 0.628121 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.402224 0.604188 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.394966 0.598265 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.389418 0.587062 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.371386 0.593871 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.279656 0.610775 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.258061 0.621535 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.264057 0.616678 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.275921 0.634468 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.27366 0.615632 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.29152 0.628565 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.295255 0.604872 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.261795 0.597842 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.28339 0.587082 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.267791 0.592985 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.331813 0.558618 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.320611 0.55307 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.30788 0.563845 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.325005 0.57665 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.344544 0.547843 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.348938 0.571423 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.355747 0.553391 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.327419 0.535038 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.338621 0.540585 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.314688 0.545813 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.282943 0.555109 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.258608 0.550934 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.267823 0.570229 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.267823 0.570229 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.273728 0.535813 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.282943 0.555109 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.298064 0.539989 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.273728 0.535813 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.298064 0.539989 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.282943 0.555109 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.335322 0.607487 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.313405 0.629404 -0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.316595 0.626214 -0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.318408 0.606941 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.335868 0.624401 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.311592 0.648676 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.330864 0.646863 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.308402 0.651867 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.294133 0.631217 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.290942 0.634407 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.295946 0.611945 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.331813 0.558618 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.319608 0.539107 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.307378 0.556863 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.322499 0.541743 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.344043 0.540862 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.346933 0.543497 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.356248 0.560372 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.328923 0.555982 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.341128 0.575492 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.316693 0.573738 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.384191 0.610996 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.403702 0.623201 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.401066 0.62031 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.385946 0.635431 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.386827 0.613886 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.369071 0.626116 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.367317 0.601681 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.401947 0.598766 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.382437 0.586561 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399312 0.595876 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.316914 0.678274 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.305407 0.69384 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.296616 0.671002 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.317721 0.674446 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.325704 0.701111 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.338018 0.681717 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.337211 0.685545 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.3046 0.697667 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.316107 0.682101 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.295809 0.67483 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.3877 0.659866 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.391875 0.684201 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37258 0.674986 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37258 0.674986 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.406996 0.669081 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.3877 0.659866 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.40282 0.644745 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.406996 0.669081 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.40282 0.644745 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.3877 0.659866 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.33883 0.656357 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.329538 0.677411 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.314897 0.661584 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.332022 0.674389 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.353472 0.672184 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.355956 0.669162 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.362764 0.65113 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.336346 0.659378 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.345639 0.638325 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.321705 0.643552 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.264535 0.625895 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.248969 0.637402 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.268363 0.625088 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.271807 0.646193 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.245142 0.638209 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.267979 0.647 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.260708 0.626702 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.241698 0.617105 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.257264 0.605598 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.261092 0.604791 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.286452 0.603979 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.265398 0.613271 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.26842 0.610787 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.281225 0.627912 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.283431 0.606463 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.299257 0.621104 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.304484 0.59717 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.270625 0.589337 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.291679 0.580045 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.273647 0.586853 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.282943 0.555109 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.258608 0.550934 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.267823 0.570229 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.267823 0.570229 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.273728 0.535813 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.282943 0.555109 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.298064 0.539989 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.273728 0.535813 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.298064 0.539989 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.282943 0.555109 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645066 0.554344 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.681385 0.616373 -0.129006 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.678928 0.639472 -0.137375 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.661636 0.629767 -0.122663 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.664108 0.621631 -0.145845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.698678 0.626079 -0.143718 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.683858 0.608237 -0.152187 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.701135 0.602979 -0.135349 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.696205 0.634214 -0.120537 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.698662 0.611115 -0.112168 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.678912 0.624508 -0.105825 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.649723 0.609912 -0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.640648 0.631982 -0.0560094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.625749 0.614812 -0.0656463 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.64267 0.62585 -0.0798417 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.664623 0.627081 -0.0527151 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.666645 0.620949 -0.0765474 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.673698 0.605012 -0.0590577 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.647702 0.616044 -0.0385197 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.656777 0.593974 -0.0448623 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.632802 0.598874 -0.0481565 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.607573 0.617144 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.595495 0.63057 -0.139672 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.594239 0.605919 -0.140323 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.615286 0.617371 -0.146288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.608828 0.641795 -0.122182 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.628619 0.628595 -0.128798 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.620906 0.628369 -0.105343 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.587782 0.630343 -0.116217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.59986 0.616917 -0.0993785 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.586526 0.605692 -0.116868 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.676727 0.560805 -0.177765 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.689897 0.57563 -0.192477 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.693998 0.575587 -0.168128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.673115 0.585222 -0.177114 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.672626 0.560848 -0.202114 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.655844 0.57044 -0.186751 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.659456 0.546023 -0.187402 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.693509 0.551213 -0.193128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.680339 0.536388 -0.178416 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.69761 0.55117 -0.16878 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.602915 0.561576 -0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.602201 0.570049 -0.194773 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.623084 0.560414 -0.185788 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.615021 0.582252 -0.177557 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.582032 0.571211 -0.180578 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.594852 0.583414 -0.163362 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.582745 0.562738 -0.157397 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.590095 0.549372 -0.188808 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.590808 0.540899 -0.165627 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.610978 0.539737 -0.179823 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.640408 0.498776 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.627785 0.478525 -0.166213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.615951 0.497935 -0.156576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.630799 0.484234 -0.142381 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.652241 0.479365 -0.169507 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.655255 0.485075 -0.145675 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.664864 0.499616 -0.163165 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.637394 0.493066 -0.183703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.650016 0.513317 -0.17736 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62556 0.512476 -0.174066 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.718878 0.553573 -0.117284 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.73992 0.563328 -0.108814 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.720935 0.559693 -0.0934517 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.719679 0.577348 -0.110668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.737863 0.557208 -0.132647 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.717623 0.571228 -0.1345 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.716821 0.547453 -0.141116 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.739118 0.539553 -0.115431 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.718076 0.529798 -0.1239 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.720133 0.535918 -0.100068 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.682558 0.491544 -0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.688647 0.474542 -0.0825505 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.666351 0.485132 -0.0818993 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.686417 0.498226 -0.0759343 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.704854 0.480953 -0.10004 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.702624 0.504637 -0.093424 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.698765 0.497955 -0.116879 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.684788 0.46786 -0.106005 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.678699 0.484862 -0.122844 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.662492 0.47845 -0.105354 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.687216 0.547112 -0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.690713 0.554862 -0.0274488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.667813 0.552739 -0.0364345 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.682694 0.570641 -0.0446649 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.710116 0.549235 -0.0416443 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.702097 0.565014 -0.0588603 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.706619 0.541484 -0.0648253 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.695235 0.531333 -0.0334138 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.691738 0.523582 -0.0565949 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.672335 0.52921 -0.0423994 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.471405 0.471405 -0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.501645 0.501645 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.499795 0.519956 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.493653 0.523893 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.479397 0.509638 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.507788 0.497708 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.48739 0.48739 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.509638 0.479397 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522043 0.511963 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.523893 0.493653 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.515901 0.515901 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542955 0.490576 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.559233 0.507719 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539759 0.502501 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.536564 0.514426 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.562428 0.495794 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539759 0.502501 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.54615 0.478651 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.565623 0.483869 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.549345 0.466726 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.54615 0.478651 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.490576 0.542955 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.483869 0.565623 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.466726 0.549345 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.478651 0.54615 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.507719 0.559233 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.502501 0.539759 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.514426 0.536564 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.495794 0.562428 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.502501 0.539759 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.478651 0.54615 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.430095 0.482473 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.430434 0.489762 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.449569 0.477255 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.445366 0.500519 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.41096 0.49498 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.425893 0.505737 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.410622 0.487691 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.415162 0.471716 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.414824 0.464428 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434297 0.45921 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.419026 0.523783 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.404771 0.538038 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.410297 0.515053 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.427756 0.532513 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.4135 0.546768 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436486 0.541242 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.427756 0.532513 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.396041 0.529309 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.410297 0.515053 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.401567 0.506323 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399854 0.452233 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.377186 0.45894 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.396659 0.464158 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.393464 0.476083 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.380381 0.447015 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.396659 0.464158 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.40305 0.440308 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.383576 0.43509 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.406245 0.428383 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.40305 0.440308 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.482473 0.430095 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.48121 0.407271 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.464428 0.414824 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.487691 0.410622 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.499256 0.422542 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.505737 0.425893 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.500519 0.445366 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.475992 0.426744 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.477255 0.449569 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.45921 0.434297 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.452233 0.399854 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.43509 0.383576 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.428383 0.406245 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.440308 0.40305 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.45894 0.377186 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.464158 0.396659 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.476083 0.393464 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.447015 0.380381 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.464158 0.396659 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.440308 0.40305 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.523783 0.419026 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.538038 0.404771 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.515053 0.410297 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.532513 0.427756 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.546768 0.4135 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.541242 0.436486 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.532513 0.427756 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.529309 0.396041 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.515053 0.410297 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.506323 0.401567 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.607487 0.335322 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.659645 0.283164 -0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.672915 0.269894 -0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.649528 0.275822 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.666987 0.293281 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.683032 0.277236 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.677104 0.300624 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.669762 0.290507 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.665573 0.259777 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.652302 0.273047 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.642185 0.265705 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.603979 0.286452 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.592776 0.280905 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.580045 0.291679 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.59717 0.304484 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.61671 0.275678 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.621104 0.299257 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.627912 0.281225 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.599585 0.262872 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.610787 0.26842 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.586853 0.273647 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.656357 0.33883 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.661904 0.350033 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.638325 0.345639 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.65113 0.362764 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.679937 0.343224 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.669162 0.355956 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.674389 0.332022 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.667131 0.326099 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.661584 0.314897 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.643552 0.321705 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.663153 0.332034 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.685865 0.340177 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.679339 0.33606 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.669651 0.355123 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.669679 0.336151 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.653465 0.351097 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.646968 0.328008 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.679367 0.317089 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.656656 0.308945 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.672841 0.312971 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.659866 0.3877 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.664041 0.412036 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.644745 0.40282 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.644745 0.40282 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.679161 0.396915 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.659866 0.3877 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.674986 0.37258 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.679161 0.396915 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.674986 0.37258 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.659866 0.3877 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.610996 0.384191 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.600701 0.391282 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.586561 0.382437 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.601681 0.367317 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.625136 0.393037 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.626116 0.369071 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.635431 0.385946 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.610016 0.408157 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62031 0.401066 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.595876 0.399312 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.610775 0.279656 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.602632 0.256944 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.587686 0.273158 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.606749 0.26347 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62572 0.263442 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.629838 0.269968 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.633864 0.286153 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.606658 0.27313 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.614801 0.295841 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.591712 0.289344 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.558618 0.331813 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.551527 0.342108 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.575492 0.341128 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.560372 0.356248 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.534652 0.332793 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.543497 0.346933 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.541743 0.322499 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.549772 0.317673 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.556863 0.307378 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.573738 0.316693 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555109 0.282943 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.530773 0.278768 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539989 0.298064 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539989 0.298064 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.545894 0.263648 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555109 0.282943 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.570229 0.267823 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.545894 0.263648 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.570229 0.267823 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555109 0.282943 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645066 0.554344 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.668521 0.610229 0.153697 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.663938 0.633406 0.160875 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.64522 0.617928 0.156428 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.65892 0.626429 0.137727 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.687239 0.625707 0.158144 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.682221 0.61873 0.134996 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.691822 0.602531 0.150967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.673539 0.617206 0.176845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.678123 0.59403 0.169668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.654822 0.601728 0.172398 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.598918 0.585648 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.580238 0.601562 0.162601 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.581665 0.587563 0.142311 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.59781 0.605914 0.14581 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.597491 0.599646 0.18016 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.615063 0.603999 0.163369 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616171 0.583732 0.177429 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.581346 0.581295 0.176661 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.600026 0.565381 0.173931 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.582773 0.567297 0.156372 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.619787 0.622977 0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.608008 0.63767 0.0834188 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.601637 0.613891 0.0853287 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.623239 0.620102 0.0751099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.626157 0.646756 0.0974792 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.641389 0.629188 0.0891702 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.637936 0.632063 0.113449 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604555 0.640545 0.107698 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616334 0.625852 0.123668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.598184 0.616766 0.109608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.714669 0.578925 0.104938 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.729812 0.597914 0.109385 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.711617 0.592661 0.125228 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.70632 0.602084 0.103028 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.732864 0.584178 0.0890951 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.709372 0.588348 0.0827387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.71772 0.565189 0.0846485 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.738161 0.574755 0.111295 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.723017 0.555767 0.106848 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.719965 0.569503 0.127138 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.665934 0.591673 0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.658095 0.605761 0.0319289 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.647455 0.607672 0.0541285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.643855 0.58746 0.0404111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.676573 0.589763 0.0284303 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.662334 0.571461 0.0369125 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.684413 0.575674 0.0471312 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.680174 0.609975 0.0421477 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.688013 0.595887 0.0608487 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.669535 0.611885 0.0643473 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.691213 0.52304 0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.712906 0.511567 0.0596212 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.699372 0.507717 0.079911 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.710453 0.529503 0.0764123 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.704747 0.526889 0.0420622 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.702295 0.544826 0.0588533 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.683054 0.538362 0.044793 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.693665 0.505104 0.0455609 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671972 0.516576 0.0482916 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.680131 0.501254 0.0658506 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.6938 0.541596 0.165419 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.70016 0.547376 0.188567 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.676324 0.546319 0.182211 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.690564 0.564621 0.173728 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.717636 0.542652 0.171776 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.70804 0.559898 0.156937 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.711276 0.536873 0.148628 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.703396 0.524351 0.180258 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.697037 0.518571 0.157111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.679561 0.523294 0.173902 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.670344 0.48571 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.67091 0.466887 0.138803 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.650637 0.480853 0.136894 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671107 0.490138 0.147112 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.690617 0.471745 0.124743 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.690815 0.494995 0.133052 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.690052 0.490567 0.108773 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.670147 0.46246 0.114524 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.669581 0.481283 0.0985541 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.649874 0.476425 0.112614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624197 0.517014 0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.60809 0.516313 0.190293 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.60089 0.524375 0.168094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616221 0.538029 0.181811 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.631397 0.508952 0.193792 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.639529 0.530668 0.18531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.647504 0.509653 0.175091 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616065 0.495298 0.180075 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.632172 0.495999 0.161374 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.608865 0.50336 0.157875 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.607487 0.335322 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.629404 0.313405 0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.626214 0.316595 0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.606941 0.318408 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624401 0.335868 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.648676 0.311592 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.646863 0.330864 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.651867 0.308402 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.631217 0.294133 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.634407 0.290942 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.611945 0.295946 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.558618 0.331813 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.537564 0.341105 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.540585 0.338621 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.553391 0.355747 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555596 0.334297 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.571423 0.348938 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.57665 0.325005 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542791 0.317172 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.563845 0.30788 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.545813 0.314688 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.610996 0.384191 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.601704 0.405245 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.587062 0.389418 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604188 0.402224 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.625637 0.400018 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.628121 0.396997 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.63493 0.378964 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.608512 0.387213 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.617804 0.366159 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.593871 0.371386 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.678274 0.316914 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.697473 0.31938 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.674538 0.318074 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.681812 0.338182 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.701209 0.31822 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.685547 0.337022 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.682009 0.315754 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.693935 0.298112 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.674736 0.295646 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671 0.296805 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.659866 0.3877 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.664041 0.412036 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.644745 0.40282 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.644745 0.40282 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.679161 0.396915 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.659866 0.3877 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.674986 0.37258 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.679161 0.396915 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.674986 0.37258 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.659866 0.3877 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.656357 0.33883 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.675867 0.351035 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.673232 0.348145 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.658111 0.363265 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.658993 0.341721 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.641237 0.353951 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.639482 0.329516 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.674113 0.3266 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.654603 0.314396 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671477 0.32371 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.625895 0.264535 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.623429 0.245336 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604627 0.260997 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624736 0.268271 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.644697 0.248874 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.646004 0.271809 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.647163 0.268073 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624589 0.2416 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.627055 0.2608 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.605787 0.257262 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.603979 0.286452 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.591774 0.266942 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.579544 0.284698 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.594664 0.269578 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616209 0.268696 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.619099 0.271332 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.628413 0.288206 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.601088 0.283817 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.613293 0.303327 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.588858 0.301572 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555109 0.282943 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.530773 0.278768 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539989 0.298064 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539989 0.298064 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.545894 0.263648 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555109 0.282943 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.570229 0.267823 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.545894 0.263648 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.570229 0.267823 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555109 0.282943 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.471405 0.471405 0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.441164 0.501645 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.424703 0.518106 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.420089 0.505261 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.437548 0.522721 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.445778 0.51449 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.458623 0.519105 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.462239 0.498029 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.428319 0.497031 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.44478 0.48057 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.423704 0.484186 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399854 0.490576 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.382226 0.502679 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399854 0.490576 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.405389 0.511231 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.382226 0.502679 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.405389 0.511231 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399854 0.490576 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.376691 0.482024 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.39432 0.469922 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.39432 0.469922 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.452233 0.542955 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.44013 0.560583 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.431578 0.53742 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.452233 0.542955 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.460785 0.566118 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.472887 0.548489 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.472887 0.548489 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.44013 0.560583 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.452233 0.542955 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.431578 0.53742 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.512714 0.482473 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.51514 0.495905 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.492654 0.48988 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.506323 0.506323 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.5352 0.488498 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.526383 0.498917 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.532774 0.475067 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.521531 0.472055 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.519105 0.458623 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.499045 0.46603 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.523783 0.523783 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.527958 0.548119 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.508662 0.538903 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.508662 0.538903 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.543078 0.532998 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.523783 0.523783 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.538903 0.508662 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.543078 0.532998 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.538903 0.508662 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.523783 0.523783 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542955 0.452233 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.564273 0.4539 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542955 0.452233 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.548489 0.472887 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.564273 0.4539 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.548489 0.472887 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542955 0.452233 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.558738 0.433245 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.53742 0.431578 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.53742 0.431578 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.460336 0.430095 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.446904 0.427669 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436486 0.436486 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.45293 0.450155 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.470754 0.421278 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.47678 0.443764 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.484186 0.423704 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.454311 0.407609 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.467742 0.410035 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.443892 0.416426 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.490576 0.399854 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.488909 0.378536 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.469922 0.39432 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.490576 0.399854 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.509564 0.384071 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.511231 0.405389 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.511231 0.405389 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.488909 0.378536 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.490576 0.399854 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.469922 0.39432 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.419026 0.419026 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.39469 0.414851 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.403906 0.434147 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.403906 0.434147 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.409811 0.399731 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.419026 0.419026 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434147 0.403906 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.409811 0.399731 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434147 0.403906 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.419026 0.419026 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.643951 -0.172546 1.11022e-16 RAD 0.166667
+ txt002
+ SPHERE CENTER -0.835815 -0.157543 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.871646 -0.122136 0.165419 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.871334 -0.102403 0.180258 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.850164 -0.113406 0.173902 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.862937 -0.100577 0.157111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.892817 -0.111133 0.171776 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.884419 -0.109307 0.148628 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.893129 -0.130866 0.156937 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.880044 -0.123961 0.188567 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.880356 -0.143694 0.173728 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.858873 -0.134964 0.182211 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.799077 -0.135649 0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.781177 -0.120908 0.180075 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.778973 -0.13149 0.157875 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.795477 -0.113462 0.161374 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.801282 -0.125067 0.193792 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.815582 -0.11762 0.175091 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.819182 -0.139808 0.18531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.784778 -0.143095 0.190293 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.802678 -0.157836 0.181811 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.782573 -0.153678 0.168094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.82339 -0.0854653 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.811594 -0.0654286 0.114524 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.80102 -0.0876595 0.112614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.820516 -0.0820122 0.0985541 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.833964 -0.0632344 0.124743 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.842886 -0.079818 0.108773 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.845761 -0.083271 0.133052 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.814468 -0.0688817 0.138803 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.826265 -0.0889183 0.147112 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.803895 -0.0911125 0.136894 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.908384 -0.14403 0.104938 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.926643 -0.128672 0.111295 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.90826 -0.133221 0.127138 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.904034 -0.1198 0.106848 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.926768 -0.139481 0.0890951 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.904159 -0.130608 0.0846485 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.908508 -0.154838 0.0827387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.930993 -0.152902 0.109385 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.912733 -0.16826 0.103028 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.912609 -0.157451 0.125228 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.860128 -0.107359 0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.853284 -0.0905999 0.0455609 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.839638 -0.0940331 0.0658506 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.840233 -0.111382 0.0482916 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.873773 -0.103926 0.0420622 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.860723 -0.124708 0.044793 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.880618 -0.120685 0.0588533 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.873178 -0.086577 0.0596212 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.880022 -0.103336 0.0764123 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.859532 -0.0900102 0.079911 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.872552 -0.179437 0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.894035 -0.188167 0.0421477 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.885777 -0.195141 0.0643473 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.89378 -0.172046 0.0608487 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.880811 -0.172463 0.0284303 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.880556 -0.156342 0.0471312 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.859328 -0.163733 0.0369125 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.872807 -0.195558 0.0319289 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.851325 -0.186828 0.0404111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.864549 -0.202532 0.0541285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.884071 -0.194213 0.153697 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.891905 -0.197746 0.176845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.867957 -0.193701 0.172398 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.884286 -0.175383 0.169668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.908019 -0.198259 0.158144 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.900401 -0.175896 0.150967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.900186 -0.194726 0.134996 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.89169 -0.216576 0.160875 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.883856 -0.213043 0.137727 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.867741 -0.212531 0.156428 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.84824 -0.229621 0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.843832 -0.25245 0.107698 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.826426 -0.235043 0.109608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.846687 -0.233837 0.123668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.865646 -0.247028 0.0974792 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.868501 -0.228415 0.113449 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.870053 -0.224198 0.0891702 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.845385 -0.248234 0.0834188 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.849792 -0.225404 0.0751099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.827978 -0.230827 0.0853287 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.811502 -0.207727 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.794108 -0.212743 0.176661 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.788345 -0.199907 0.156372 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.802328 -0.189621 0.173931 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.817265 -0.220563 0.18016 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.825486 -0.197441 0.177429 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.83466 -0.215547 0.163369 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.803282 -0.230849 0.162601 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.820676 -0.225832 0.14581 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.797518 -0.218012 0.142311 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.643951 -0.172546 0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.61371 -0.142305 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.597249 -0.125845 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.592635 -0.138689 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.610094 -0.12123 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.618324 -0.12946 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.631169 -0.124846 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.634785 -0.145921 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.600865 -0.14692 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.617326 -0.163381 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.596251 -0.159765 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.5724 -0.153374 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.554772 -0.141271 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.5724 -0.153374 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.577935 -0.13272 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554772 -0.141271 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.577935 -0.13272 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.5724 -0.153374 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.549237 -0.161926 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.566866 -0.174029 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.566866 -0.174029 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624779 -0.100996 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.612676 -0.0833673 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604124 -0.10653 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624779 -0.100996 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.633331 -0.0778329 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645433 -0.0954616 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645433 -0.0954616 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.612676 -0.0833673 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624779 -0.100996 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604124 -0.10653 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.68526 -0.161477 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.687686 -0.148046 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.6652 -0.154071 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.678869 -0.137627 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.707746 -0.155452 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.698929 -0.145033 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.70532 -0.168883 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.694077 -0.171896 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.691651 -0.185327 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671591 -0.177921 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.696329 -0.120168 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.700504 -0.095832 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.681209 -0.105047 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.681209 -0.105047 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.715624 -0.110952 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.696329 -0.120168 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.711449 -0.135288 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.715624 -0.110952 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.711449 -0.135288 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.696329 -0.120168 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.715501 -0.191718 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.736819 -0.190051 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.715501 -0.191718 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.721035 -0.171063 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.736819 -0.190051 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.721035 -0.171063 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.715501 -0.191718 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.731284 -0.210706 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.709966 -0.212373 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.709966 -0.212373 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.632882 -0.213855 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.61945 -0.216282 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.609032 -0.207465 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.625476 -0.193796 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.6433 -0.222672 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.649326 -0.200186 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.656732 -0.220246 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.626857 -0.236341 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.640288 -0.233915 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616438 -0.227525 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.663122 -0.244096 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.661455 -0.265414 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.642468 -0.249631 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.663122 -0.244096 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.68211 -0.25988 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.683777 -0.238562 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.683777 -0.238562 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.661455 -0.265414 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.663122 -0.244096 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.642468 -0.249631 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.591572 -0.224924 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.567237 -0.2291 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.576452 -0.209804 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.576452 -0.209804 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.582357 -0.24422 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.591572 -0.224924 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.606693 -0.240045 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.582357 -0.24422 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.606693 -0.240045 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.591572 -0.224924 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.69376 0.0133465 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.674309 0.0838533 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.66171 0.103063 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.653258 0.0800983 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.673446 0.0876683 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.682761 0.106818 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.694497 0.0914233 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.69536 0.0876083 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.662574 0.0992478 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.675172 0.0800382 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.654121 0.0762832 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62221 0.0325183 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.604582 0.0446211 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62221 0.0325183 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.627745 0.053173 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604582 0.0446211 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.627745 0.053173 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62221 0.0325183 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.599047 0.0239663 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616676 0.0118635 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616676 0.0118635 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.666287 0.0539145 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.662466 0.0547519 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.660752 0.0332597 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.682791 0.0439578 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.668 0.0754066 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.688325 0.0646126 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671821 0.0745692 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645962 0.0647085 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.649783 0.0638711 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.644249 0.0432164 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.745859 0.0646815 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.750021 0.0887955 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.729506 0.078459 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.732161 0.0813312 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.766375 0.075018 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.748514 0.0675537 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.762212 0.050904 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.763719 0.0721458 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.759557 0.0480318 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.743204 0.0618093 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.737837 0.0347427 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.747099 0.0542122 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.743371 0.0553974 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.7241 0.0550267 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.741565 0.0335575 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.718566 0.0343719 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.732303 0.014088 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.760836 0.0339282 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.751574 0.0144587 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.757108 0.0351134 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.76531 -0.0058253 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.786629 -0.00415829 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.76531 -0.0058253 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.770845 0.0148294 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.786629 -0.00415829 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.770845 0.0148294 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.76531 -0.0058253 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.781094 -0.024813 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.759776 -0.02648 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.759776 -0.02648 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.701782 0.0432853 0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.693716 0.0608821 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.677932 0.0496759 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.694884 0.0652402 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.717566 0.0544915 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.718734 0.0588496 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.725632 0.0368947 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.700615 0.0389272 0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.708681 0.0213304 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.684831 0.027721 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.721234 -0.0272215 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.720593 -0.0310802 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.7 -0.0246945 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.718114 -0.00820099 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.741827 -0.0336072 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.739347 -0.010728 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.742467 -0.0297485 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.723713 -0.0501007 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.724354 -0.046242 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.70312 -0.043715 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.649684 -0.00804971 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.628657 -0.00328338 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.630031 0.000378614 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.642244 0.0152909 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.648309 -0.0117117 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.661896 0.00686255 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.669336 -0.016478 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.636097 -0.026624 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.657124 -0.0313903 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.637471 -0.022962 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.835815 -0.157543 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.899353 -0.119969 -0.117284 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.909872 -0.0977075 -0.115431 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.891613 -0.104052 -0.100068 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.886771 -0.0997803 -0.1239 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.917612 -0.113625 -0.132647 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.894512 -0.115698 -0.141116 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.907093 -0.135886 -0.1345 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.922453 -0.117896 -0.108814 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.911935 -0.140158 -0.110668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.904194 -0.124241 -0.0934517 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.868703 -0.130205 -0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.867758 -0.11253 -0.0334138 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.846864 -0.122142 -0.0423994 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.860854 -0.107566 -0.0565949 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.889596 -0.120593 -0.0416443 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.882692 -0.115629 -0.0648253 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.890541 -0.138267 -0.0588603 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.875606 -0.135168 -0.0274488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.876551 -0.152843 -0.0446649 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.854713 -0.14478 -0.0364345 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.836885 -0.0844101 -0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.826973 -0.0627848 -0.106005 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.81296 -0.083104 -0.105354 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.830202 -0.0805529 -0.122844 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.850898 -0.0640908 -0.10004 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.854126 -0.0818589 -0.116879 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.860809 -0.0857161 -0.093424 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.833656 -0.0666419 -0.0825505 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.843568 -0.0882673 -0.0759343 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.819643 -0.0869612 -0.0818993 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.866465 -0.147308 -0.177765 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.876203 -0.130609 -0.193128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.879733 -0.128522 -0.16878 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.857385 -0.124356 -0.178416 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.862935 -0.149395 -0.202114 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.844117 -0.143141 -0.187402 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.853198 -0.166093 -0.186751 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.885283 -0.153561 -0.192477 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.875546 -0.170259 -0.177114 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.888813 -0.151474 -0.168128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.803997 -0.111748 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.798532 -0.108311 -0.183703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.797989 -0.131037 -0.174066 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.819589 -0.119537 -0.17736 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.80454 -0.0890219 -0.169507 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.825597 -0.100248 -0.163165 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.810005 -0.0924597 -0.145675 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.78294 -0.100522 -0.166213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.788405 -0.10396 -0.142381 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.782397 -0.123249 -0.156576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.802927 -0.184881 -0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.785723 -0.180723 -0.188808 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.798991 -0.161937 -0.179823 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.782104 -0.173028 -0.165627 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.78966 -0.203667 -0.180578 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.786041 -0.195972 -0.157397 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.806864 -0.207825 -0.163362 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.806546 -0.192576 -0.194773 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.82375 -0.196734 -0.177557 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.819813 -0.17379 -0.185788 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.898283 -0.193102 -0.129006 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.920038 -0.201143 -0.120537 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.900209 -0.201384 -0.105825 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.910616 -0.17991 -0.112168 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.918112 -0.192861 -0.143718 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.90869 -0.171628 -0.135349 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.896357 -0.18482 -0.152187 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.907705 -0.214335 -0.137375 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.88595 -0.206294 -0.145845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.887876 -0.214576 -0.122663 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.834745 -0.230676 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.824206 -0.252002 -0.116217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.810793 -0.231282 -0.116868 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.827952 -0.234336 -0.0993785 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.848158 -0.251396 -0.122182 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.851905 -0.23373 -0.105343 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.858698 -0.23007 -0.128798 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.830999 -0.248342 -0.139672 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.841538 -0.227016 -0.146288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.817586 -0.227621 -0.140323 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.867633 -0.203337 -0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.868948 -0.209658 -0.0385197 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.84746 -0.202239 -0.0481565 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.865773 -0.186008 -0.0448623 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.889121 -0.210757 -0.0527151 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.885946 -0.187106 -0.0590577 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.887806 -0.204436 -0.0765474 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.870808 -0.226988 -0.0560094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.869493 -0.220667 -0.0798417 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.84932 -0.219569 -0.0656463 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.69376 0.0133465 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.668775 0.0631985 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.661946 0.0667914 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.65711 0.0452771 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.680354 0.0511945 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.673611 0.0847128 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.692019 0.069116 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.680439 0.08112 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.650366 0.0787954 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.657195 0.0752026 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.64553 0.0572811 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62221 0.0325183 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.604582 0.0446211 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62221 0.0325183 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.627745 0.053173 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.604582 0.0446211 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.627745 0.053173 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.62221 0.0325183 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.599047 0.0239663 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616676 0.0118635 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616676 0.0118635 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.649684 -0.00804971 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.634953 -0.000226782 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.655218 0.012605 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.635947 0.0122343 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.629419 -0.0208815 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.630413 -0.00842045 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.644149 -0.0287044 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.64869 -0.0205108 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.66342 -0.0283337 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.668955 -0.00767898 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.740325 0.0440268 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.746894 0.0650768 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.739183 0.0653796 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.723153 0.0607735 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.748035 0.0437239 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.724295 0.0394207 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.741466 0.0226739 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.764065 0.04833 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.757496 0.02728 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.756355 0.0486329 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.721234 -0.0272215 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.732368 -0.0484665 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.715699 -0.0478762 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.737738 -0.0371781 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.737902 -0.0278118 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.743272 -0.0165234 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.726768 -0.00656677 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.715864 -0.0385099 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.70473 -0.0172649 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.699195 -0.0379196 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.76531 -0.0058253 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.786629 -0.00415829 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.76531 -0.0058253 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.770845 0.0148294 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.786629 -0.00415829 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.770845 0.0148294 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.76531 -0.0058253 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.781094 -0.024813 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.759776 -0.02648 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.759776 -0.02648 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.712851 0.0845947 -0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.706291 0.107813 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.689001 0.0909853 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.701434 0.0896851 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.730141 0.101422 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.725284 0.0832945 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.736701 0.0782041 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.717709 0.102723 -0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.724268 0.0795043 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.700418 0.0858949 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.737837 0.0347427 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.740802 0.0511556 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.718185 0.043171 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.730397 0.0580833 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.760455 0.0427273 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.750049 0.0496549 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.757489 0.0263144 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.748242 0.027815 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.745277 0.0114021 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.725625 0.0198304 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.666287 0.0539145 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.650692 0.0721382 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645053 0.0564414 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.663167 0.072935 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671925 0.0696112 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.6844 0.070408 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.68752 0.0513875 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.653812 0.0531177 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.669407 0.034894 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.648173 0.0374209 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.643951 -0.172546 -0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.674191 -0.142305 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.672341 -0.123995 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.666199 -0.120057 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.651943 -0.134313 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.680334 -0.146243 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.659936 -0.156561 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.682184 -0.164554 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.69459 -0.131987 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.696439 -0.150298 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.688447 -0.12805 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.715501 -0.153374 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.731779 -0.136231 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.712305 -0.141449 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.70911 -0.129524 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.734974 -0.148156 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.712305 -0.141449 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.718696 -0.165299 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.738169 -0.160081 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.721891 -0.177224 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.718696 -0.165299 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.663122 -0.100996 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.656415 -0.0783272 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.639272 -0.0946054 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.651197 -0.0978007 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.680265 -0.0847178 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.675047 -0.104191 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.686972 -0.107387 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.66834 -0.0815225 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.675047 -0.104191 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.651197 -0.0978007 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.602641 -0.161477 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.60298 -0.154189 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.622115 -0.166695 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.617912 -0.143431 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.583506 -0.148971 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.598439 -0.138214 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.583168 -0.156259 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.587708 -0.172234 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.58737 -0.179523 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.606843 -0.184741 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.591572 -0.120168 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.577317 -0.105912 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.582843 -0.128897 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.600302 -0.111438 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.586046 -0.0971825 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.609032 -0.102708 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.600302 -0.111438 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.568587 -0.114642 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.582843 -0.128897 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.574113 -0.137627 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.5724 -0.191718 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.549732 -0.185011 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.569205 -0.179793 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.56601 -0.167868 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.552927 -0.196936 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.569205 -0.179793 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.575596 -0.203643 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.556122 -0.208861 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.578791 -0.215568 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.575596 -0.203643 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.655019 -0.213855 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.653756 -0.23668 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.636974 -0.229127 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.660237 -0.233329 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671802 -0.221409 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.678283 -0.218058 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.673065 -0.198584 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.648538 -0.217207 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.649801 -0.194382 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.631756 -0.209653 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624779 -0.244096 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.607636 -0.260374 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.600929 -0.237705 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.612854 -0.240901 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.631486 -0.266765 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.636704 -0.247291 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.648629 -0.250487 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.619561 -0.26357 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.636704 -0.247291 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.612854 -0.240901 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.696329 -0.224924 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.710584 -0.23918 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.687599 -0.233654 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.705059 -0.216195 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.719314 -0.23045 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.713788 -0.207465 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.705059 -0.216195 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.701855 -0.24791 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.687599 -0.233654 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.678869 -0.242384 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.786005 -0.343435 8.51251e-17 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.82165 -0.392454 0.0425863 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.824791 -0.400556 0.065698 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.802599 -0.392663 0.058292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.821021 -0.376528 0.0614442 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.843843 -0.400347 0.0499923 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.840073 -0.376319 0.0457385 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.840701 -0.392245 0.0268805 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.82542 -0.416482 0.0468401 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.822279 -0.40838 0.0237283 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.803228 -0.408589 0.0394341 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.753118 -0.370774 0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.734271 -0.367981 0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.731279 -0.362711 0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.745269 -0.348136 0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.756109 -0.376044 0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.767107 -0.356199 0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.774956 -0.378837 0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.74212 -0.390619 0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.760966 -0.393412 0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.739128 -0.385349 0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.80984 -0.323622 0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.80634 -0.308073 0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.786996 -0.316395 0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.802721 -0.300378 0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.829184 -0.315299 0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.825565 -0.307605 0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.832685 -0.330849 0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.813459 -0.331317 0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.81696 -0.346866 0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.794116 -0.339639 0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.854538 -0.365116 -0.0178949 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.878086 -0.365674 -0.0104889 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.859887 -0.367962 0.00604126 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.863875 -0.346241 -0.00500196 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.872736 -0.362827 -0.0344251 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.858526 -0.343394 -0.0289382 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.849188 -0.362269 -0.0418311 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.868748 -0.384548 -0.0233819 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.8452 -0.38399 -0.0307879 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.85055 -0.386837 -0.00685171 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.842728 -0.296284 0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.848999 -0.272611 0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.828835 -0.281616 0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.829121 -0.278432 -0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.862893 -0.287278 -0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.843015 -0.293099 -0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.856621 -0.310951 -0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.862606 -0.290462 0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.856335 -0.314135 0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.842441 -0.299468 0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.818893 -0.316097 -0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.819591 -0.297057 -0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.814956 -0.293153 -0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.79807 -0.304244 -0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.823527 -0.320001 -0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.802007 -0.327188 -0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.822829 -0.339041 -0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.840413 -0.30891 -0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.839716 -0.32795 -0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.835779 -0.305006 -0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.797815 -0.412267 -0.0246914 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.793573 -0.436217 -0.0204376 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.776294 -0.419454 -0.0149506 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.796968 -0.420728 -0.00151032 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.815094 -0.42903 -0.0301783 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.818489 -0.413542 -0.0112511 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.819335 -0.405081 -0.0344321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.79442 -0.427756 -0.0436186 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.798662 -0.403807 -0.0478724 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.777141 -0.410993 -0.0381316 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.76217 -0.363249 -0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.747522 -0.356966 -0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.759239 -0.339469 -0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.740618 -0.352002 -0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.750453 -0.380746 -0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.743549 -0.375782 -0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.765101 -0.387029 -0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.769074 -0.368213 -0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.783722 -0.374496 -0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.780791 -0.350716 -0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.729282 -0.390587 -0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.704862 -0.392427 -0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.717401 -0.374248 -0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.714218 -0.373948 0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.716744 -0.408767 0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.726099 -0.390287 0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.741164 -0.406927 0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.719927 -0.409067 -0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.744347 -0.407227 -0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.732465 -0.390887 -0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.594141 -0.358439 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.542042 -0.409774 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.517869 -0.413579 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.528508 -0.393219 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.525596 -0.395831 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.531404 -0.430134 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.539131 -0.412386 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555577 -0.426328 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.534315 -0.427522 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.558488 -0.423716 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.544953 -0.407161 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522591 -0.339267 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.504962 -0.327164 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522591 -0.339267 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.528125 -0.318612 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.504962 -0.327164 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.528125 -0.318612 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522591 -0.339267 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.499428 -0.347819 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.517056 -0.359921 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.517056 -0.359921 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.550064 -0.379835 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.529037 -0.375068 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.530412 -0.371406 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.542624 -0.356494 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.548689 -0.383497 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.562276 -0.364922 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.569716 -0.388263 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.536477 -0.398409 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.557504 -0.403175 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.537852 -0.394747 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.613592 -0.428945 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.612625 -0.451897 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.593593 -0.436515 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.614807 -0.432663 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.632624 -0.444328 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.634806 -0.425094 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.633591 -0.421376 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.61141 -0.448179 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.612377 -0.425227 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.592379 -0.432797 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.621614 -0.399007 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.620974 -0.402865 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.600381 -0.39648 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.618494 -0.379986 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.642207 -0.405392 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.639728 -0.382513 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.642848 -0.401533 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624094 -0.421886 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624734 -0.418027 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.603501 -0.4155 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.665691 -0.37761 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.687009 -0.375943 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.665691 -0.37761 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671225 -0.356956 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.687009 -0.375943 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671225 -0.356956 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.665691 -0.37761 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.681475 -0.396598 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.660156 -0.398265 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.660156 -0.398265 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.586119 -0.388377 -0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.570335 -0.399584 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.562269 -0.381987 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.569167 -0.403942 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.594185 -0.405974 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.593017 -0.410332 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.609969 -0.394768 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.587286 -0.384019 -0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.60307 -0.372813 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.57922 -0.366422 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.638217 -0.337042 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.64748 -0.317573 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.643752 -0.316388 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.624481 -0.316758 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.641945 -0.338228 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.618946 -0.337413 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.632683 -0.357697 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.661216 -0.337857 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.651954 -0.357326 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.657489 -0.336672 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.566667 -0.317871 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.562847 -0.317033 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.561133 -0.338525 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.583171 -0.327827 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.568381 -0.296378 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.588706 -0.307172 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.572202 -0.297216 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.546343 -0.307077 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.550163 -0.307914 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.544629 -0.328569 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.594141 -0.358439 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.547576 -0.389119 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.525642 -0.386849 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.528407 -0.379645 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.538964 -0.366733 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.544812 -0.396323 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.558134 -0.376207 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.566746 -0.398593 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.534255 -0.409235 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.556189 -0.411505 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.537019 -0.402031 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522591 -0.339267 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.504962 -0.327164 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522591 -0.339267 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.528125 -0.318612 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.504962 -0.327164 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.528125 -0.318612 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.522591 -0.339267 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.499428 -0.347819 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.517056 -0.359921 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.517056 -0.359921 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.566667 -0.317871 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.551072 -0.299647 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.545434 -0.315344 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.563547 -0.29885 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.572306 -0.302174 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.584781 -0.301377 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.587901 -0.320398 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.554192 -0.318667 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.569787 -0.336891 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.548554 -0.334364 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.619127 -0.408291 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.617918 -0.415912 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.597788 -0.406911 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616439 -0.39183 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.639257 -0.417292 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.637778 -0.39321 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.640465 -0.409671 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.620605 -0.432372 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.621814 -0.424751 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.600475 -0.423371 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.638217 -0.337042 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.641183 -0.320629 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.618565 -0.328614 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.630777 -0.313702 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.660835 -0.329058 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.65043 -0.32213 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.65787 -0.345471 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.648623 -0.34397 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.645657 -0.360383 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.626005 -0.351955 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.665691 -0.37761 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.687009 -0.375943 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.665691 -0.37761 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671225 -0.356956 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.687009 -0.375943 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.671225 -0.356956 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.665691 -0.37761 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.681475 -0.396598 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.660156 -0.398265 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.660156 -0.398265 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.57505 -0.429687 0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.55776 -0.446515 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.5512 -0.423296 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.562617 -0.428387 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.58161 -0.452905 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.586467 -0.434777 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.5989 -0.436077 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.570193 -0.447815 0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.587483 -0.430987 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.563633 -0.424596 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.621614 -0.399007 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.632748 -0.420252 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.61608 -0.419661 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.638118 -0.408963 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.638282 -0.399597 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.643653 -0.388308 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.627149 -0.378352 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.616244 -0.410295 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.60511 -0.38905 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.599576 -0.409705 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.550064 -0.379835 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.535334 -0.372012 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.555599 -0.35918 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.536327 -0.359551 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.529799 -0.392667 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.530793 -0.380205 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.54453 -0.400489 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.549071 -0.392296 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.563801 -0.400119 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.569335 -0.379464 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0996195 -0.371785 0.544331 RAD 0.166667
+ txt002
+ SPHERE CENTER 0.220501 -0.393621 0.729516 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.279642 -0.368601 0.766439 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.299716 -0.354293 0.765035 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.292196 -0.366989 0.745238 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.279022 -0.347717 0.753281 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.287162 -0.355904 0.786236 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.266468 -0.349329 0.774481 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.267088 -0.370213 0.787639 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.300337 -0.375177 0.778193 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.280263 -0.389485 0.779597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.292817 -0.387873 0.758396 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.281062 -0.372464 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.289441 -0.362978 0.671279 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.270044 -0.378255 0.671155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.267771 -0.35549 0.680442 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.30046 -0.357187 0.692603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.278789 -0.349699 0.701767 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29208 -0.366673 0.713804 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.302733 -0.379952 0.683315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.294353 -0.389438 0.704516 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.283335 -0.395229 0.683192 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.238665 -0.321889 0.726118 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.250544 -0.304702 0.71296 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.259421 -0.327715 0.714081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.238717 -0.32307 0.701455 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.229788 -0.298875 0.724997 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.21796 -0.317244 0.713492 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.217908 -0.316063 0.738155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.250492 -0.30352 0.737623 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.238612 -0.320707 0.750781 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.259369 -0.326533 0.738744 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.219082 -0.389758 0.803476 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.228779 -0.378635 0.823273 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.24293 -0.383364 0.8036 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.225483 -0.365937 0.802355 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.20493 -0.385029 0.823149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.201634 -0.372331 0.802231 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.195233 -0.396152 0.803352 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.222377 -0.402455 0.824394 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.21268 -0.413578 0.804597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.236529 -0.407185 0.804721 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.178104 -0.343046 0.763155 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.177083 -0.319723 0.771198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.198298 -0.332294 0.772443 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.189464 -0.325124 0.750529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.156889 -0.330475 0.76191 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.16927 -0.335876 0.741241 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.157909 -0.353797 0.753867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.165722 -0.337645 0.783824 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.166743 -0.360967 0.775781 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.186938 -0.350216 0.785069 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.15994 -0.414778 0.766553 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.147477 -0.412573 0.787754 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.172167 -0.412448 0.787878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.15977 -0.39322 0.77859 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.13525 -0.414903 0.766429 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.147543 -0.39555 0.757266 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.147713 -0.417108 0.745229 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.147647 -0.434131 0.775717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.16011 -0.436336 0.754517 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.172338 -0.434006 0.775841 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.261479 -0.440333 0.769837 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.282991 -0.443285 0.781591 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282046 -0.4302 0.760673 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271991 -0.421181 0.781342 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.262424 -0.453417 0.790755 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.251423 -0.431313 0.790506 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.240911 -0.450466 0.779001 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.27248 -0.462437 0.770086 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.250967 -0.459485 0.758332 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271534 -0.449353 0.749168 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.202338 -0.465353 0.732914 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.204606 -0.486123 0.746073 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.223366 -0.470107 0.744951 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.202946 -0.464339 0.757577 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.183578 -0.481368 0.734036 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.181918 -0.459584 0.745541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.18131 -0.460599 0.720878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.203998 -0.487137 0.72141 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.201729 -0.466367 0.708251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.222757 -0.471122 0.720288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.262898 -0.444196 0.695877 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.285685 -0.449273 0.687835 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.27701 -0.426189 0.68659 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282528 -0.436139 0.708504 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271573 -0.46728 0.697123 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.268416 -0.454146 0.717791 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.248787 -0.462204 0.705165 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.266055 -0.45733 0.675209 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.243269 -0.452254 0.683251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.257381 -0.434246 0.673964 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31427 -0.31427 0.544331 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.367156 -0.277961 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.374298 -0.269898 0.485076 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.362218 -0.291334 0.487134 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.350338 -0.270045 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.379235 -0.256525 0.505236 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.355276 -0.256671 0.511201 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.372093 -0.264588 0.527454 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.391115 -0.277815 0.501329 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.383973 -0.285878 0.523547 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.379036 -0.299251 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31427 -0.31427 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.304189 -0.304189 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29042 -0.307879 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.307879 -0.29042 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.328039 -0.31058 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.331729 -0.29681 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.33812 -0.32066 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31058 -0.328039 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.32066 -0.33812 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29681 -0.331729 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.297666 -0.252306 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.305995 -0.235688 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.321516 -0.245915 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.312359 -0.259438 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282145 -0.242079 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.288509 -0.265828 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.273816 -0.258696 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.291303 -0.228556 0.509559 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282974 -0.245173 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.306824 -0.238783 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367156 -0.277961 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.385852 -0.261966 0.57931 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.38141 -0.278159 0.561208 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.36581 -0.259422 0.565115 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.371598 -0.261768 0.599471 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.351556 -0.259225 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.352901 -0.277764 0.601529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.387198 -0.280504 0.595564 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.368501 -0.2965 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.382755 -0.296698 0.577461 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.297666 -0.252306 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.30415 -0.228803 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.321516 -0.245915 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.306824 -0.238783 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.2803 -0.235194 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282974 -0.245173 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.273816 -0.258696 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.294992 -0.242326 0.603794 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.288509 -0.265828 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.312359 -0.259438 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31427 -0.31427 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.32435 -0.304189 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.33812 -0.307879 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.32066 -0.29042 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.3005 -0.31058 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29681 -0.29681 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29042 -0.32066 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.317959 -0.328039 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.307879 -0.33812 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.331729 -0.331729 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.383759 -0.339925 0.544331 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.407156 -0.334762 0.538366 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.388696 -0.326552 0.524171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.392275 -0.31686 0.546597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.402218 -0.348135 0.558526 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.387337 -0.330233 0.566757 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.378821 -0.353299 0.564491 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.39864 -0.357827 0.536101 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.375243 -0.362991 0.542066 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.380181 -0.349618 0.521905 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.330873 -0.376234 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.346394 -0.386461 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.354723 -0.369843 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.340031 -0.362711 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.322544 -0.392851 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.316181 -0.369102 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.307023 -0.382624 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337237 -0.399983 0.579103 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.321715 -0.389757 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.345565 -0.383366 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.330873 -0.376234 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.348239 -0.393346 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.354723 -0.369843 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.345565 -0.383366 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.324389 -0.399736 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.321715 -0.389757 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.307023 -0.382624 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.333547 -0.386213 0.484868 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.316181 -0.369102 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.340031 -0.362711 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.166275 -0.191247 0.655442 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.20793 -0.130089 0.652044 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.221102 -0.115471 0.637128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.220766 -0.13987 0.633356 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.200597 -0.126388 0.628759 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.208266 -0.10569 0.655816 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.187762 -0.116607 0.647447 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.195095 -0.120308 0.670732 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.228435 -0.119172 0.660413 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.215264 -0.13379 0.675329 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.228099 -0.143571 0.656641 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.230419 -0.192135 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.243049 -0.18209 0.599717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.218634 -0.185251 0.597829 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.227721 -0.168159 0.613157 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.254834 -0.188974 0.620293 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.239506 -0.175043 0.633733 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.242204 -0.199019 0.638981 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.245747 -0.206066 0.604965 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.233117 -0.216111 0.623653 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.221332 -0.209227 0.603077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.172673 -0.154295 0.591563 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.180792 -0.15554 0.568278 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.19323 -0.166926 0.586315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.171251 -0.17557 0.579113 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.160236 -0.142909 0.573526 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.150694 -0.162939 0.584361 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.152117 -0.141663 0.596811 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.182215 -0.134265 0.580727 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.174096 -0.133019 0.604012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.194652 -0.145651 0.598764 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.143787 -0.129201 0.689081 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.14887 -0.105335 0.692853 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.167242 -0.121723 0.690969 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.153943 -0.115741 0.671044 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.125414 -0.112813 0.690965 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.130487 -0.123219 0.669156 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.120331 -0.136679 0.687193 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.138714 -0.118795 0.71089 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.13363 -0.142661 0.707118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.157086 -0.135183 0.709006 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.108529 -0.153407 0.6286 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0995811 -0.130858 0.624003 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.113639 -0.134736 0.643928 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.123725 -0.135326 0.621398 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0944715 -0.149528 0.608675 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.118615 -0.153997 0.60607 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.10342 -0.172078 0.613272 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0843858 -0.148938 0.631205 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0933338 -0.171487 0.635801 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0984435 -0.152816 0.65113 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.102131 -0.190359 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0897843 -0.179968 0.711167 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.114103 -0.183804 0.713055 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.105492 -0.166467 0.697727 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0778128 -0.186523 0.690591 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0935207 -0.173022 0.677151 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0901597 -0.196914 0.671903 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0864233 -0.20386 0.705919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0987702 -0.214251 0.687231 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.110742 -0.207696 0.707807 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.201532 -0.167041 0.715923 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.219088 -0.151829 0.724292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.221861 -0.163068 0.702483 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.205084 -0.14514 0.705088 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.19876 -0.155801 0.737733 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.184756 -0.149113 0.718528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.181204 -0.171014 0.729364 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.215537 -0.173729 0.735128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.197981 -0.188942 0.726759 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.218309 -0.184969 0.713318 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.159877 -0.228199 0.719322 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.167942 -0.229756 0.742607 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.183484 -0.223214 0.72457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.16569 -0.207683 0.731771 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.144336 -0.234741 0.737359 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.142084 -0.212668 0.726523 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.13627 -0.233184 0.714074 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.162129 -0.250271 0.730157 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.154064 -0.248714 0.706872 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.177671 -0.243729 0.71212 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.224021 -0.229087 0.682285 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.248268 -0.22829 0.686881 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.2391 -0.216949 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.234532 -0.207937 0.689486 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.233189 -0.240428 0.702209 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.219453 -0.220075 0.704814 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.208942 -0.241225 0.697613 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.237756 -0.249439 0.67968 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.213509 -0.250236 0.675083 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.228589 -0.238098 0.659755 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0058509 -0.451136 0.729516 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.0051487 -0.447081 0.803476 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.01504 -0.435909 0.823149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0289993 -0.440694 0.803352 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0115452 -0.423265 0.802231 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00881065 -0.442297 0.823273 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0123054 -0.429652 0.802355 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0187019 -0.453468 0.8036 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00864346 -0.459725 0.824394 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0012478 -0.470897 0.804721 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0226028 -0.46451 0.804597 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0688765 -0.439178 0.766553 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0903221 -0.426942 0.766429 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0806307 -0.435083 0.745229 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0699989 -0.416328 0.757266 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.078568 -0.431037 0.787754 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0582447 -0.420423 0.77859 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0571224 -0.443274 0.787878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0891998 -0.449792 0.775717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0677542 -0.462029 0.775841 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0795084 -0.457933 0.754517 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0172804 -0.386138 0.763155 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0293677 -0.364644 0.76191 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0401449 -0.385352 0.753867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0213457 -0.375512 0.741241 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0065032 -0.36543 0.771198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00151881 -0.376298 0.750529 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00558411 -0.386924 0.772443 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0253024 -0.37527 0.783824 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0132151 -0.396764 0.785069 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0360796 -0.395978 0.775781 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0578769 -0.459039 0.766439 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0707378 -0.451803 0.786236 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0461991 -0.454158 0.787639 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0561039 -0.435761 0.774481 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0824157 -0.456685 0.765035 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0677817 -0.440643 0.753281 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0695548 -0.46392 0.745238 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0725109 -0.475081 0.778193 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.05965 -0.482316 0.758396 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0479721 -0.477435 0.779597 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0457452 -0.398096 0.726118 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0495643 -0.373728 0.724997 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0306825 -0.382672 0.738155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.030137 -0.383722 0.713492 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.064627 -0.389151 0.71296 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0451997 -0.399146 0.701455 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.060808 -0.41352 0.714081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0651725 -0.388102 0.737623 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0613535 -0.41247 0.738744 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0462908 -0.397047 0.750781 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0571747 -0.463094 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.081612 -0.459563 0.692603 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0696122 -0.463589 0.713804 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0665888 -0.442243 0.701767 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0691745 -0.459069 0.671279 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0541513 -0.441749 0.680442 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0447373 -0.4626 0.671155 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0721979 -0.480415 0.683315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0477607 -0.483946 0.683192 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0601982 -0.48444 0.704516 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00628079 -0.512079 0.769837 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.000557006 -0.523883 0.790755 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0165974 -0.51057 0.779001 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00208214 -0.49924 0.790506 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0234352 -0.525392 0.781591 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0249603 -0.500749 0.781342 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.029159 -0.513588 0.760673 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00475566 -0.536722 0.770086 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0104794 -0.524918 0.749168 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0123987 -0.523409 0.758332 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00557859 -0.516134 0.695877 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.00154892 -0.540463 0.697123 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0156462 -0.524673 0.705165 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00538221 -0.52751 0.717791 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0227737 -0.531924 0.687835 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.026607 -0.518971 0.708504 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0268034 -0.507596 0.68659 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00174531 -0.529087 0.675209 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00577498 -0.504759 0.673964 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0154498 -0.513298 0.683251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0574471 -0.504176 0.732914 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0817008 -0.508666 0.734036 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0732807 -0.489545 0.720878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0722467 -0.488971 0.745541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0658672 -0.523298 0.746073 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0564131 -0.503602 0.757577 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0416134 -0.518808 0.744951 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0669012 -0.523872 0.72141 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0426474 -0.519382 0.720288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.058481 -0.504751 0.708251 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0483751 -0.248762 0.655442 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.0599222 -0.183785 0.689081 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0522053 -0.160406 0.690965 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0358698 -0.178533 0.687193 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0513956 -0.171954 0.669156 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0762577 -0.165658 0.692853 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.075448 -0.177206 0.671044 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0839747 -0.189036 0.690969 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0607319 -0.172236 0.71089 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0684488 -0.195615 0.709006 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0443964 -0.190363 0.707118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00673113 -0.215921 0.692479 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0258737 -0.20044 0.690591 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0203763 -0.215612 0.671903 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00551963 -0.196602 0.677151 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0122285 -0.200749 0.711167 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00812553 -0.196911 0.697727 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00691403 -0.21623 0.713055 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0270852 -0.21976 0.705919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00794264 -0.235241 0.707807 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0215878 -0.234932 0.687231 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0172857 -0.187119 0.6286 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.00705049 -0.176731 0.608675 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00352517 -0.200733 0.613272 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.025725 -0.192673 0.60607 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.020811 -0.163117 0.624003 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0394855 -0.179058 0.621398 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0310463 -0.173504 0.643928 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00138875 -0.171177 0.631205 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00884647 -0.181564 0.65113 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00491406 -0.195179 0.635801 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.115028 -0.216626 0.652044 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.127519 -0.195663 0.655816 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.108803 -0.201738 0.670732 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.104303 -0.194866 0.647447 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.133744 -0.210551 0.637128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.110528 -0.209754 0.628759 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.121254 -0.231514 0.633356 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.138245 -0.217423 0.660413 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.125754 -0.238386 0.656641 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.119529 -0.223497 0.675329 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0723919 -0.21996 0.591563 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0673141 -0.20388 0.573526 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0609052 -0.198742 0.596811 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0490355 -0.216456 0.584361 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0788008 -0.225098 0.568278 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0605222 -0.237674 0.579113 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0838786 -0.241177 0.586315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0906706 -0.207384 0.580727 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0957484 -0.223463 0.598764 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0842617 -0.202246 0.604012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.103481 -0.281603 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.126206 -0.291073 0.620293 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.110246 -0.293457 0.638981 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.119897 -0.271345 0.633733 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.119442 -0.279219 0.599717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.113132 -0.25949 0.613157 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0967168 -0.269749 0.597829 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.10979 -0.301332 0.604965 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0870656 -0.291862 0.603077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0938302 -0.303716 0.623653 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0910116 -0.245428 0.715923 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0942304 -0.234308 0.737733 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0714204 -0.238704 0.729364 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0854464 -0.221514 0.718528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.113822 -0.241032 0.724292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.105038 -0.228237 0.705088 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.110603 -0.252152 0.702483 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0997955 -0.258223 0.735128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0965768 -0.269343 0.713318 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0769856 -0.262619 0.726759 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0794645 -0.310405 0.682285 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0817333 -0.324811 0.702209 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0603366 -0.313378 0.697613 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0800146 -0.300317 0.704814 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.100861 -0.321838 0.686881 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0991425 -0.297345 0.689486 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0985923 -0.307433 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0811832 -0.334899 0.67968 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0789143 -0.320493 0.659755 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0597864 -0.323466 0.675083 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0243582 -0.277564 0.719322 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0076281 -0.275459 0.737359 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00142185 -0.270078 0.714074 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0167139 -0.255218 0.726523 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0305645 -0.282946 0.742607 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0396503 -0.262704 0.731771 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0472946 -0.285051 0.72457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0152725 -0.297806 0.730157 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0320026 -0.299911 0.71212 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00906621 -0.292425 0.706872 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.115031 -0.4293 0.544331 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.178985 -0.424299 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.190929 -0.412497 0.599471 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.16674 -0.417001 0.601529 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.174844 -0.400273 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.203175 -0.419795 0.57931 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.18709 -0.407571 0.565115 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.191231 -0.431597 0.561208 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.195071 -0.436523 0.595564 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.183127 -0.448325 0.577461 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.170881 -0.441027 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.115031 -0.4293 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.10495 -0.41922 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0911807 -0.42291 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.10864 -0.40545 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.128801 -0.425611 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.13249 -0.411841 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.138881 -0.435691 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.111341 -0.44307 0.638566 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.121421 -0.45315 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0975713 -0.44676 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.131634 -0.367336 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.12515 -0.343834 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.107784 -0.360946 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.122476 -0.353814 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.149 -0.350225 0.585275 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.146326 -0.360204 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.155484 -0.373727 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.134308 -0.357357 0.603794 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.140792 -0.380859 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.116942 -0.374468 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.178985 -0.424299 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.200165 -0.411775 0.505236 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.189948 -0.415187 0.527454 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.179342 -0.399922 0.511201 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.189202 -0.420888 0.485076 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.168379 -0.409035 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.168023 -0.433412 0.487134 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.199808 -0.436152 0.501329 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.178629 -0.448677 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.189591 -0.439564 0.523547 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.131634 -0.367336 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.123305 -0.350719 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.107784 -0.360946 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.116942 -0.374468 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.147155 -0.357109 0.491041 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.140792 -0.380859 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.155484 -0.373727 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.137998 -0.343587 0.509559 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.146326 -0.360204 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.122476 -0.353814 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.115031 -0.4293 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.125111 -0.41922 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.138881 -0.42291 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.121421 -0.40545 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.101261 -0.425611 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0975713 -0.411841 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0911807 -0.435691 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.11872 -0.44307 0.450097 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.10864 -0.45315 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.13249 -0.44676 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.162382 -0.486264 0.544331 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.174264 -0.502603 0.558526 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.15142 -0.495376 0.564491 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.170327 -0.479659 0.566757 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.185226 -0.49349 0.538366 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.18129 -0.470546 0.546597 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.173345 -0.477151 0.524171 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.166319 -0.509207 0.536101 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.154437 -0.492868 0.521905 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.143475 -0.501981 0.542066 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0984274 -0.491265 0.507294 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0810612 -0.508376 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0745774 -0.484874 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0837352 -0.498397 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.104911 -0.514767 0.503387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.107585 -0.504787 0.525813 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.122277 -0.497655 0.507294 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0957534 -0.501244 0.484868 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.11312 -0.484132 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0892696 -0.477742 0.488775 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0984274 -0.491265 0.581368 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.082906 -0.501491 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0745774 -0.484874 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0892696 -0.477742 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.106756 -0.507882 0.597621 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.11312 -0.484132 0.599887 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.122277 -0.497655 0.581368 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0920638 -0.515014 0.579103 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.107585 -0.504787 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0837352 -0.498397 0.56285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.153845 -0.574159 0.618405 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.202534 -0.612768 0.658726 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.225282 -0.612732 0.668328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.22113 -0.60221 0.64638 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.212428 -0.591695 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.206686 -0.62329 0.680674 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.193832 -0.602253 0.679302 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.183939 -0.623325 0.671072 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.215388 -0.633805 0.660098 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.192641 -0.63384 0.650495 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.211236 -0.623283 0.63815 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.225396 -0.554987 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.243024 -0.542885 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.225396 -0.554987 0.593714 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.219861 -0.534333 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.243024 -0.542885 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.219861 -0.534333 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.225396 -0.554987 0.643096 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.248559 -0.563539 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.23093 -0.575642 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.23093 -0.575642 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.184086 -0.543919 0.678886 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.200547 -0.527458 0.687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.205161 -0.540303 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.187702 -0.522843 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.179472 -0.531074 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.166627 -0.526459 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.163011 -0.547535 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.196931 -0.548533 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.18047 -0.564994 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.201546 -0.561378 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.130984 -0.631939 0.658726 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.132649 -0.643128 0.680674 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.152367 -0.631785 0.671072 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.133263 -0.618482 0.679302 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.111266 -0.643283 0.668328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.11188 -0.618637 0.666956 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.109601 -0.632094 0.64638 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.130371 -0.656585 0.660098 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.128706 -0.645397 0.63815 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.150088 -0.645242 0.650495 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.112536 -0.56309 0.678886 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.11011 -0.549659 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.132596 -0.555684 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.118927 -0.53924 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.09005 -0.557065 0.687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0988668 -0.546646 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0924762 -0.570497 0.666541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.103719 -0.573509 0.699462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.106145 -0.58694 0.678886 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.126205 -0.579534 0.691232 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0822954 -0.593331 0.618405 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0609772 -0.591664 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0822954 -0.593331 0.643096 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.076761 -0.572676 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0609772 -0.591664 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.076761 -0.572676 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0822954 -0.593331 0.593714 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0665116 -0.612319 0.618405 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0878298 -0.613986 0.606059 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0878298 -0.613986 0.630751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.172294 -0.643008 0.598245 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.189742 -0.660425 0.599616 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.196144 -0.636618 0.598245 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.185725 -0.645434 0.618821 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.165892 -0.666816 0.599616 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.161875 -0.651825 0.618821 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.148444 -0.649399 0.598245 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.17631 -0.657999 0.57904 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.158862 -0.640582 0.577669 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.182712 -0.634191 0.577669 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.123605 -0.6044 0.557924 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.107144 -0.620861 0.549693 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.119989 -0.625475 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.102529 -0.608016 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.11076 -0.599785 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.106145 -0.58694 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.127221 -0.583324 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.128219 -0.617245 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.14468 -0.600784 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.141064 -0.621859 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.195155 -0.585228 0.557924 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.203972 -0.574809 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.181486 -0.568784 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.201546 -0.561378 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.217641 -0.591253 0.549693 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.215215 -0.577822 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.208824 -0.601672 0.57027 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.197581 -0.598659 0.537348 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.188764 -0.609078 0.557924 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.175095 -0.592634 0.545578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0329639 -0.552323 0.43322 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.0248832 -0.625877 0.436618 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0316054 -0.646362 0.448652 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0478 -0.627981 0.445566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0287309 -0.625173 0.460998 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00868865 -0.644258 0.439705 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00581415 -0.623069 0.45205 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00196644 -0.623773 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0277577 -0.647066 0.424272 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0210355 -0.62658 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0439523 -0.628685 0.421186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0822954 -0.593331 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.105299 -0.593994 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.100664 -0.582384 0.457911 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0926585 -0.572783 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0869303 -0.604941 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0742898 -0.58373 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0639267 -0.604278 0.482603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0949359 -0.614541 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0719323 -0.613879 0.46131 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.090301 -0.602932 0.448964 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0138144 -0.584567 0.497099 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0177119 -0.584898 0.521479 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0364224 -0.580268 0.506047 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0185345 -0.56353 0.509133 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00489609 -0.589197 0.512531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00407348 -0.567829 0.500186 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00879364 -0.588867 0.488152 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0129918 -0.605935 0.509445 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00909422 -0.605605 0.485065 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0317022 -0.601305 0.494013 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0244483 -0.584869 0.399581 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0473753 -0.5935 0.402668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0308315 -0.595617 0.420874 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0399691 -0.57344 0.415013 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0409921 -0.582752 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0335859 -0.562692 0.39372 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0180651 -0.574121 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0318545 -0.604929 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00892756 -0.596298 0.384149 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0153107 -0.607046 0.405442 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0355172 -0.54356 0.460062 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0495897 -0.530389 0.475494 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0261165 -0.53532 0.481355 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.031221 -0.519442 0.463149 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0589904 -0.538628 0.454201 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0406217 -0.527681 0.441856 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0449178 -0.551799 0.438769 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0538859 -0.554507 0.472408 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0398133 -0.567678 0.456976 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0304127 -0.559438 0.478269 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0163676 -0.511316 0.396183 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0212225 -0.48882 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00896145 -0.491256 0.408529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00194055 -0.497372 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0286287 -0.50888 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00546563 -0.517432 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0237738 -0.531375 0.383837 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0395307 -0.502764 0.396183 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0346758 -0.525259 0.40513 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0272696 -0.505199 0.417476 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0440327 -0.593633 0.372739 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0604766 -0.607302 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0678827 -0.587242 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0604766 -0.607302 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0366265 -0.613693 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0366265 -0.613693 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0201827 -0.600023 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0440327 -0.593633 0.348047 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0275889 -0.579964 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0514389 -0.573573 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0521134 -0.520079 0.369341 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0542684 -0.523344 0.344961 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0591566 -0.541988 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0358996 -0.534291 0.357307 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0472252 -0.501435 0.353908 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0288565 -0.512382 0.366254 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0450702 -0.49817 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0704822 -0.509132 0.356995 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0683272 -0.505868 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0753703 -0.527777 0.372427 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.101445 -0.561087 0.406378 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.118381 -0.551884 0.390945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0944221 -0.550745 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.103361 -0.536664 0.403291 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.125404 -0.562225 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.110383 -0.547006 0.424584 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.108468 -0.571428 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.116465 -0.576307 0.394032 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0995293 -0.58551 0.409464 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0925065 -0.575168 0.388171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.247614 -0.494808 0.43322 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.313607 -0.494287 0.399581 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.326876 -0.484182 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.302705 -0.488171 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.310432 -0.470513 0.39372 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337778 -0.490299 0.402668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.321334 -0.476629 0.415013 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.324509 -0.500404 0.420874 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.330051 -0.507957 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.316783 -0.518062 0.405442 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.305881 -0.511946 0.384149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.269833 -0.434629 0.396183 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.279233 -0.426389 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.286276 -0.448298 0.383837 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.263449 -0.445377 0.37489 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.262789 -0.41272 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.247006 -0.431707 0.387235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.253389 -0.420959 0.408529 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.285616 -0.415641 0.396183 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.276216 -0.42388 0.417476 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29266 -0.43755 0.40513 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.302539 -0.452978 0.460062 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.320401 -0.436971 0.454201 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.3148 -0.455413 0.438769 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29902 -0.436675 0.441856 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.30814 -0.434535 0.475494 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.286759 -0.434239 0.463149 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.290278 -0.450543 0.481355 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.32392 -0.453274 0.472408 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.306057 -0.469281 0.478269 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.318318 -0.471717 0.456976 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.291389 -0.554467 0.436618 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.314604 -0.562288 0.439705 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.310183 -0.541186 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.306499 -0.542501 0.45205 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.29581 -0.575569 0.448652 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.287705 -0.555781 0.460998 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.272595 -0.567748 0.445566 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.299494 -0.574255 0.424272 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.276279 -0.566433 0.421186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.295073 -0.553152 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.28032 -0.513157 0.497099 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.298839 -0.507811 0.512531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.302049 -0.505577 0.488152 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.287442 -0.489718 0.500186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.27711 -0.515392 0.521479 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.265714 -0.497299 0.509133 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.258591 -0.520738 0.506047 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.291716 -0.531251 0.509445 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.273198 -0.536597 0.494013 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.294927 -0.529016 0.485065 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.225396 -0.554987 0.470257 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.227186 -0.567359 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.246777 -0.555283 0.482603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.227528 -0.54267 0.49155 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.205805 -0.567063 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.206147 -0.542374 0.479204 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.204014 -0.554691 0.457911 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.225054 -0.579676 0.470257 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.223263 -0.567305 0.448964 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.244644 -0.567601 0.46131 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.258683 -0.536117 0.372739 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.275127 -0.549787 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282533 -0.529727 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.275127 -0.549787 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.251277 -0.556177 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.251277 -0.556177 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.234833 -0.542508 0.372739 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.258683 -0.536117 0.348047 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.242239 -0.522448 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.266089 -0.516058 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.19269 -0.536638 0.406378 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.17251 -0.549603 0.412239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.191778 -0.549105 0.427671 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.177908 -0.528912 0.424584 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.173421 -0.537136 0.390945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.178819 -0.516445 0.403291 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.193601 -0.524171 0.385084 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.187292 -0.557329 0.394032 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.207471 -0.544363 0.388171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.20656 -0.556831 0.409464 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.214908 -0.476459 0.369341 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.209819 -0.457868 0.353908 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.210053 -0.453963 0.378288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.2312 -0.458164 0.366254 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.214674 -0.480363 0.344961 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.236055 -0.480659 0.357307 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.219763 -0.498954 0.360393 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.193527 -0.476163 0.356995 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.198616 -0.494753 0.372427 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.193761 -0.472258 0.381374 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.172546 -0.643951 1.11022e-16 RAD 0.166667
+ txt002
+ SPHERE CENTER -0.157543 -0.835815 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.122136 -0.871646 0.165419 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.102403 -0.871334 0.180258 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.100577 -0.862937 0.157111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.113406 -0.850164 0.173902 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.123961 -0.880044 0.188567 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.134964 -0.858873 0.182211 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.143694 -0.880356 0.173728 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.111133 -0.892817 0.171776 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.130866 -0.893129 0.156937 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.109307 -0.884419 0.148628 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0854653 -0.82339 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0654286 -0.811594 0.114524 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0820122 -0.820516 0.0985541 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0876595 -0.80102 0.112614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0688817 -0.814468 0.138803 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0911125 -0.803895 0.136894 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0889183 -0.826265 0.147112 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0632344 -0.833964 0.124743 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.083271 -0.845761 0.133052 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.079818 -0.842886 0.108773 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.135649 -0.799077 0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.120908 -0.781177 0.180075 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.113462 -0.795477 0.161374 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.13149 -0.778973 0.157875 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.143095 -0.784778 0.190293 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.153678 -0.782573 0.168094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.157836 -0.802678 0.181811 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.125067 -0.801282 0.193792 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.139808 -0.819182 0.18531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.11762 -0.815582 0.175091 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.194213 -0.884071 0.153697 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.197746 -0.891905 0.176845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.175383 -0.884286 0.169668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.193701 -0.867957 0.172398 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.216576 -0.89169 0.160875 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.212531 -0.867741 0.156428 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.213043 -0.883856 0.137727 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.198259 -0.908019 0.158144 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.194726 -0.900186 0.134996 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.175896 -0.900401 0.150967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.207727 -0.811502 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.212743 -0.794108 0.176661 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.189621 -0.802328 0.173931 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.199907 -0.788345 0.156372 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.230849 -0.803282 0.162601 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.218012 -0.797518 0.142311 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.225832 -0.820676 0.14581 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.220563 -0.817265 0.18016 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.215547 -0.83466 0.163369 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.197441 -0.825486 0.177429 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.229621 -0.84824 0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.25245 -0.843832 0.107698 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.233837 -0.846687 0.123668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.235043 -0.826426 0.109608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.248234 -0.845385 0.0834188 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.230827 -0.827978 0.0853287 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.225404 -0.849792 0.0751099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.247028 -0.865646 0.0974792 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.224198 -0.870053 0.0891702 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.228415 -0.868501 0.113449 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.14403 -0.908384 0.104938 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.128672 -0.926643 0.111295 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.1198 -0.904034 0.106848 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.133221 -0.90826 0.127138 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.152902 -0.930993 0.109385 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.157451 -0.912609 0.125228 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.16826 -0.912733 0.103028 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.139481 -0.926768 0.0890951 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.154838 -0.908508 0.0827387 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.130608 -0.904159 0.0846485 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.179437 -0.872552 0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.188167 -0.894035 0.0421477 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.172046 -0.89378 0.0608487 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.195141 -0.885777 0.0643473 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.195558 -0.872807 0.0319289 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.202532 -0.864549 0.0541285 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.186828 -0.851325 0.0404111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.172463 -0.880811 0.0284303 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.163733 -0.859328 0.0369125 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.156342 -0.880556 0.0471312 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.107359 -0.860128 0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0905999 -0.853284 0.0455609 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.111382 -0.840233 0.0482916 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0940331 -0.839638 0.0658506 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.086577 -0.873178 0.0596212 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0900102 -0.859532 0.079911 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.103336 -0.880022 0.0764123 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.103926 -0.873773 0.0420622 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.120685 -0.880618 0.0588533 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.124708 -0.860723 0.044793 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0133465 -0.69376 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.0838533 -0.674309 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.103063 -0.66171 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0876683 -0.673446 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0800983 -0.653258 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0992478 -0.662574 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0762832 -0.654121 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0800382 -0.675172 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.106818 -0.682761 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0876083 -0.69536 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0914233 -0.694497 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0539145 -0.666287 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0547519 -0.662466 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0439578 -0.682791 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0332597 -0.660752 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0647085 -0.645962 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0432164 -0.644249 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0638711 -0.649783 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0754066 -0.668 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0745692 -0.671821 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0646126 -0.688325 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0325183 -0.62221 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0446211 -0.604582 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.053173 -0.627745 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0325183 -0.62221 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0239663 -0.599047 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0118635 -0.616676 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0118635 -0.616676 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0446211 -0.604582 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0325183 -0.62221 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.053173 -0.627745 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0432853 -0.701782 0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0608821 -0.693716 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0652402 -0.694884 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0496759 -0.677932 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0389272 -0.700615 0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.027721 -0.684831 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0213304 -0.708681 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0544915 -0.717566 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0368947 -0.725632 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0588496 -0.718734 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00804971 -0.649684 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.00328338 -0.628657 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0152909 -0.642244 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.000378614 -0.630031 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.026624 -0.636097 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.022962 -0.637471 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0313903 -0.657124 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0117117 -0.648309 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.016478 -0.669336 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.00686255 -0.661896 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0272215 -0.721234 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0310802 -0.720593 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00820099 -0.718114 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0246945 -0.7 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0501007 -0.723713 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.043715 -0.70312 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.046242 -0.724354 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0336072 -0.741827 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0297485 -0.742467 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.010728 -0.739347 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0646815 -0.745859 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0887955 -0.750021 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0813312 -0.732161 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.078459 -0.729506 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0721458 -0.763719 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0618093 -0.743204 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0480318 -0.759557 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.075018 -0.766375 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.050904 -0.762212 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0675537 -0.748514 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0058253 -0.76531 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.00415829 -0.786629 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0148294 -0.770845 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0058253 -0.76531 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.024813 -0.781094 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.02648 -0.759776 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.02648 -0.759776 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00415829 -0.786629 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0058253 -0.76531 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0148294 -0.770845 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0347427 -0.737837 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0542122 -0.747099 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0550267 -0.7241 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0553974 -0.743371 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0339282 -0.760836 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0351134 -0.757108 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0144587 -0.751574 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0335575 -0.741565 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.014088 -0.732303 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0343719 -0.718566 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.172546 -0.643951 0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.142305 -0.61371 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.125845 -0.597249 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.12123 -0.610094 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.138689 -0.592635 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.14692 -0.600865 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.159765 -0.596251 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.163381 -0.617326 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.12946 -0.618324 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.145921 -0.634785 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.124846 -0.631169 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.100996 -0.624779 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0833673 -0.612676 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.100996 -0.624779 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.10653 -0.604124 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0833673 -0.612676 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.10653 -0.604124 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.100996 -0.624779 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0778329 -0.633331 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0954616 -0.645433 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0954616 -0.645433 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.153374 -0.5724 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.141271 -0.554772 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.13272 -0.577935 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.153374 -0.5724 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.161926 -0.549237 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.174029 -0.566866 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.174029 -0.566866 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.141271 -0.554772 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.153374 -0.5724 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.13272 -0.577935 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.213855 -0.632882 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.216282 -0.61945 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.193796 -0.625476 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.207465 -0.609032 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.236341 -0.626857 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.227525 -0.616438 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.233915 -0.640288 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.222672 -0.6433 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.220246 -0.656732 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.200186 -0.649326 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.224924 -0.591572 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.2291 -0.567237 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.209804 -0.576452 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.209804 -0.576452 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.24422 -0.582357 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.224924 -0.591572 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.240045 -0.606693 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.24422 -0.582357 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.240045 -0.606693 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.224924 -0.591572 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.244096 -0.663122 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.265414 -0.661455 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.244096 -0.663122 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.249631 -0.642468 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.265414 -0.661455 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.249631 -0.642468 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.244096 -0.663122 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.25988 -0.68211 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.238562 -0.683777 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.238562 -0.683777 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.161477 -0.68526 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.148046 -0.687686 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.137627 -0.678869 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.154071 -0.6652 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.171896 -0.694077 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.177921 -0.671591 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.185327 -0.691651 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.155452 -0.707746 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.168883 -0.70532 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.145033 -0.698929 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.191718 -0.715501 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.190051 -0.736819 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.171063 -0.721035 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.191718 -0.715501 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.210706 -0.731284 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.212373 -0.709966 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.212373 -0.709966 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.190051 -0.736819 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.191718 -0.715501 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.171063 -0.721035 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.120168 -0.696329 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.095832 -0.700504 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.105047 -0.681209 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.105047 -0.681209 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.110952 -0.715624 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.120168 -0.696329 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.135288 -0.711449 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.110952 -0.715624 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.135288 -0.711449 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.120168 -0.696329 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.343435 -0.786005 8.51251e-17 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.392454 -0.82165 0.0425863 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.400556 -0.824791 0.065698 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.376528 -0.821021 0.0614442 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.392663 -0.802599 0.058292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.416482 -0.82542 0.0468401 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.408589 -0.803228 0.0394341 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.40838 -0.822279 0.0237283 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.400347 -0.843843 0.0499923 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.392245 -0.840701 0.0268805 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.376319 -0.840073 0.0457385 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.323622 -0.80984 0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.308073 -0.80634 0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.300378 -0.802721 0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.316395 -0.786996 0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.331317 -0.813459 0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339639 -0.794116 0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.346866 -0.81696 0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.315299 -0.829184 0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.330849 -0.832685 0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.307605 -0.825565 0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.370774 -0.753118 0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.367981 -0.734271 0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.348136 -0.745269 0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.362711 -0.731279 0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.390619 -0.74212 0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.385349 -0.739128 0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.393412 -0.760966 0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.376044 -0.756109 0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.378837 -0.774956 0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.356199 -0.767107 0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.412267 -0.797815 -0.0246914 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.436217 -0.793573 -0.0204376 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.420728 -0.796968 -0.00151032 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.419454 -0.776294 -0.0149506 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.427756 -0.79442 -0.0436186 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.410993 -0.777141 -0.0381316 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.403807 -0.798662 -0.0478724 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.42903 -0.815094 -0.0301783 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.405081 -0.819335 -0.0344321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.413542 -0.818489 -0.0112511 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.390587 -0.729282 -0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.392427 -0.704862 -0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.373948 -0.714218 0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.374248 -0.717401 -0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.409067 -0.719927 -0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.390887 -0.732465 -0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.407227 -0.744347 -0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.408767 -0.716744 0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.406927 -0.741164 0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.390287 -0.726099 0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.363249 -0.76217 -0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.356966 -0.747522 -0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.352002 -0.740618 -0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339469 -0.759239 -0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.368213 -0.769074 -0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.350716 -0.780791 -0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.374496 -0.783722 -0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.380746 -0.750453 -0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.387029 -0.765101 -0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.375782 -0.743549 -0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.365116 -0.854538 -0.0178949 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.365674 -0.878086 -0.0104889 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.346241 -0.863875 -0.00500196 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.367962 -0.859887 0.00604126 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.384548 -0.868748 -0.0233819 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.386837 -0.85055 -0.00685171 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.38399 -0.8452 -0.0307879 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.362827 -0.872736 -0.0344251 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.362269 -0.849188 -0.0418311 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.343394 -0.858526 -0.0289382 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.316097 -0.818893 -0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.297057 -0.819591 -0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.304244 -0.79807 -0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.293153 -0.814956 -0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.30891 -0.840413 -0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.305006 -0.835779 -0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.32795 -0.839716 -0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.320001 -0.823527 -0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339041 -0.822829 -0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.327188 -0.802007 -0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.296284 -0.842728 0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.272611 -0.848999 0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.278432 -0.829121 -0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.281616 -0.828835 0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.290462 -0.862606 0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.299468 -0.842441 0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.314135 -0.856335 0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.287278 -0.862893 -0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.310951 -0.856621 -0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.293099 -0.843015 -0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.358439 -0.594141 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.389119 -0.547576 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.386849 -0.525642 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.366733 -0.538964 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.379645 -0.528407 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.409235 -0.534255 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.402031 -0.537019 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.411505 -0.556189 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.396323 -0.544812 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.398593 -0.566746 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.376207 -0.558134 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.317871 -0.566667 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.299647 -0.551072 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.29885 -0.563547 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.315344 -0.545434 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.318667 -0.554192 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.334364 -0.548554 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.336891 -0.569787 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.302174 -0.572306 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.320398 -0.587901 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.301377 -0.584781 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339267 -0.522591 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.327164 -0.504962 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.318612 -0.528125 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339267 -0.522591 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.347819 -0.499428 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.359921 -0.517056 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.359921 -0.517056 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.327164 -0.504962 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339267 -0.522591 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.318612 -0.528125 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.429687 -0.57505 0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.446515 -0.55776 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.428387 -0.562617 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.423296 -0.5512 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.447815 -0.570193 0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.424596 -0.563633 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.430987 -0.587483 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.452905 -0.58161 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436077 -0.5989 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.434777 -0.586467 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.379835 -0.550064 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.372012 -0.535334 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.359551 -0.536327 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.35918 -0.555599 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.392296 -0.549071 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.379464 -0.569335 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.400119 -0.563801 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.392667 -0.529799 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.400489 -0.54453 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.380205 -0.530793 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399007 -0.621614 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.420252 -0.632748 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.408963 -0.638118 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.419661 -0.61608 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.410295 -0.616244 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.409705 -0.599576 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.38905 -0.60511 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399597 -0.638282 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.378352 -0.627149 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.388308 -0.643653 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.408291 -0.619127 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.415912 -0.617918 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.39183 -0.616439 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.406911 -0.597788 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.432372 -0.620605 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.423371 -0.600475 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.424751 -0.621814 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.417292 -0.639257 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.409671 -0.640465 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.39321 -0.637778 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37761 -0.665691 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.375943 -0.687009 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.356956 -0.671225 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37761 -0.665691 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.396598 -0.681475 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.398265 -0.660156 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.398265 -0.660156 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.375943 -0.687009 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37761 -0.665691 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.356956 -0.671225 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.337042 -0.638217 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.320629 -0.641183 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.313702 -0.630777 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.328614 -0.618565 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.34397 -0.648623 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.351955 -0.626005 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.360383 -0.645657 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.329058 -0.660835 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.345471 -0.65787 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.32213 -0.65043 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.358439 -0.594141 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.409774 -0.542042 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.413579 -0.517869 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.395831 -0.525596 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.393219 -0.528508 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.427522 -0.534315 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.407161 -0.544953 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.423716 -0.558488 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.430134 -0.531404 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.426328 -0.555577 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.412386 -0.539131 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.379835 -0.550064 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.375068 -0.529037 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.356494 -0.542624 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.371406 -0.530412 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.398409 -0.536477 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.394747 -0.537852 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.403175 -0.557504 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.383497 -0.548689 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.388263 -0.569716 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.364922 -0.562276 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339267 -0.522591 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.327164 -0.504962 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.318612 -0.528125 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339267 -0.522591 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.347819 -0.499428 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.359921 -0.517056 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.359921 -0.517056 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.327164 -0.504962 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.339267 -0.522591 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.318612 -0.528125 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.388377 -0.586119 -0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.399584 -0.570335 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.403942 -0.569167 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.381987 -0.562269 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.384019 -0.587286 -0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.366422 -0.57922 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.372813 -0.60307 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.405974 -0.594185 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.394768 -0.609969 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.410332 -0.593017 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.317871 -0.566667 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.317033 -0.562847 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.327827 -0.583171 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.338525 -0.561133 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.307077 -0.546343 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.328569 -0.544629 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.307914 -0.550163 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.296378 -0.568381 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.297216 -0.572202 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.307172 -0.588706 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.337042 -0.638217 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.317573 -0.64748 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.316758 -0.624481 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.316388 -0.643752 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.337857 -0.661216 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.336672 -0.657489 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.357326 -0.651954 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.338228 -0.641945 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.357697 -0.632683 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.337413 -0.618946 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.428945 -0.613592 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.451897 -0.612625 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.432663 -0.614807 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.436515 -0.593593 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.448179 -0.61141 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.432797 -0.592379 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.425227 -0.612377 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.444328 -0.632624 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.421376 -0.633591 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.425094 -0.634806 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37761 -0.665691 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.375943 -0.687009 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.356956 -0.671225 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37761 -0.665691 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.396598 -0.681475 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.398265 -0.660156 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.398265 -0.660156 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.375943 -0.687009 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.37761 -0.665691 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.356956 -0.671225 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.399007 -0.621614 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.402865 -0.620974 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.379986 -0.618494 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.39648 -0.600381 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.421886 -0.624094 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.4155 -0.603501 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.418027 -0.624734 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.405392 -0.642207 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.401533 -0.642848 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.382513 -0.639728 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.157543 -0.835815 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.119969 -0.899353 -0.117284 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0977075 -0.909872 -0.115431 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0997803 -0.886771 -0.1239 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.104052 -0.891613 -0.100068 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.117896 -0.922453 -0.108814 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.124241 -0.904194 -0.0934517 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.140158 -0.911935 -0.110668 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.113625 -0.917612 -0.132647 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.135886 -0.907093 -0.1345 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.115698 -0.894512 -0.141116 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0844101 -0.836885 -0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0627848 -0.826973 -0.106005 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0805529 -0.830202 -0.122844 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.083104 -0.81296 -0.105354 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0666419 -0.833656 -0.0825505 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0869612 -0.819643 -0.0818993 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0882673 -0.843568 -0.0759343 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0640908 -0.850898 -0.10004 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0857161 -0.860809 -0.093424 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0818589 -0.854126 -0.116879 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.130205 -0.868703 -0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.11253 -0.867758 -0.0334138 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.107566 -0.860854 -0.0565949 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.122142 -0.846864 -0.0423994 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.135168 -0.875606 -0.0274488 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.14478 -0.854713 -0.0364345 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.152843 -0.876551 -0.0446649 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.120593 -0.889596 -0.0416443 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.138267 -0.890541 -0.0588603 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.115629 -0.882692 -0.0648253 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.193102 -0.898283 -0.129006 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.201143 -0.920038 -0.120537 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.17991 -0.910616 -0.112168 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.201384 -0.900209 -0.105825 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.214335 -0.907705 -0.137375 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.214576 -0.887876 -0.122663 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.206294 -0.88595 -0.145845 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.192861 -0.918112 -0.143718 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.18482 -0.896357 -0.152187 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.171628 -0.90869 -0.135349 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.203337 -0.867633 -0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.209658 -0.868948 -0.0385197 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.186008 -0.865773 -0.0448623 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.202239 -0.84746 -0.0481565 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.226988 -0.870808 -0.0560094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.219569 -0.84932 -0.0656463 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.220667 -0.869493 -0.0798417 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.210757 -0.889121 -0.0527151 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.204436 -0.887806 -0.0765474 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.187106 -0.885946 -0.0590577 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.230676 -0.834745 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.252002 -0.824206 -0.116217 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.234336 -0.827952 -0.0993785 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.231282 -0.810793 -0.116868 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.248342 -0.830999 -0.139672 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.227621 -0.817586 -0.140323 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.227016 -0.841538 -0.146288 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.251396 -0.848158 -0.122182 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.23007 -0.858698 -0.128798 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.23373 -0.851905 -0.105343 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.147308 -0.866465 -0.177765 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.130609 -0.876203 -0.193128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.124356 -0.857385 -0.178416 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.128522 -0.879733 -0.16878 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.153561 -0.885283 -0.192477 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.151474 -0.888813 -0.168128 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.170259 -0.875546 -0.177114 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.149395 -0.862935 -0.202114 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.166093 -0.853198 -0.186751 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.143141 -0.844117 -0.187402 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.184881 -0.802927 -0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.180723 -0.785723 -0.188808 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.173028 -0.782104 -0.165627 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.161937 -0.798991 -0.179823 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.192576 -0.806546 -0.194773 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.17379 -0.819813 -0.185788 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.196734 -0.82375 -0.177557 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.203667 -0.78966 -0.180578 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.207825 -0.806864 -0.163362 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.195972 -0.786041 -0.157397 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.111748 -0.803997 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.108311 -0.798532 -0.183703 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.119537 -0.819589 -0.17736 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.131037 -0.797989 -0.174066 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.100522 -0.78294 -0.166213 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.123249 -0.782397 -0.156576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.10396 -0.788405 -0.142381 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0890219 -0.80454 -0.169507 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0924597 -0.810005 -0.145675 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.100248 -0.825597 -0.163165 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.172546 -0.643951 -0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER -0.202787 -0.61371 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.200937 -0.595399 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.194794 -0.591462 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.180539 -0.605717 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.208929 -0.617647 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.188531 -0.627965 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.210779 -0.635958 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.223185 -0.603392 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.225035 -0.621702 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.217042 -0.599454 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.244096 -0.624779 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.260374 -0.607636 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.240901 -0.612854 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.237705 -0.600929 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.26357 -0.619561 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.240901 -0.612854 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.247291 -0.636704 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.266765 -0.631486 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.250487 -0.648629 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.247291 -0.636704 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.191718 -0.5724 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.185011 -0.549732 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.167868 -0.56601 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.179793 -0.569205 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.208861 -0.556122 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.203643 -0.575596 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.215568 -0.578791 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.196936 -0.552927 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.203643 -0.575596 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.179793 -0.569205 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.131237 -0.632882 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.131575 -0.625593 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.15071 -0.6381 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.146508 -0.614836 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.112102 -0.620375 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.127034 -0.609618 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.111763 -0.627664 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.116304 -0.643639 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.115965 -0.650927 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.135439 -0.656145 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.120168 -0.591572 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.105912 -0.577317 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.111438 -0.600302 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.128897 -0.582843 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.114642 -0.568587 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.137627 -0.574113 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.128897 -0.582843 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0971825 -0.586046 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.111438 -0.600302 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.102708 -0.609032 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.100996 -0.663122 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0783272 -0.656415 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0978007 -0.651197 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0946054 -0.639272 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0815225 -0.66834 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0978007 -0.651197 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.104191 -0.675047 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0847178 -0.680265 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.107387 -0.686972 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.104191 -0.675047 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.183615 -0.68526 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.182351 -0.708085 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.165569 -0.700531 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.188833 -0.704733 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.200397 -0.692813 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.206879 -0.689462 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.201661 -0.669989 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.177134 -0.688611 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.178397 -0.665787 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.160351 -0.681058 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.153374 -0.715501 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.136231 -0.731779 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.129524 -0.70911 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.141449 -0.712305 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.160081 -0.738169 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.165299 -0.718696 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.177224 -0.721891 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.148156 -0.734974 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.165299 -0.718696 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.141449 -0.712305 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.224924 -0.696329 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.23918 -0.710584 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.216195 -0.705059 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.233654 -0.687599 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.24791 -0.701855 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.242384 -0.678869 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.233654 -0.687599 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.23045 -0.719314 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.216195 -0.705059 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.207465 -0.713788 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0133465 -0.69376 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.0631985 -0.668775 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0667914 -0.661946 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0511945 -0.680354 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0452771 -0.65711 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0787954 -0.650366 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0572811 -0.64553 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0752026 -0.657195 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0847128 -0.673611 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.08112 -0.680439 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.069116 -0.692019 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00804971 -0.649684 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.000226782 -0.634953 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0122343 -0.635947 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.012605 -0.655218 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0205108 -0.64869 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00767898 -0.668955 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0283337 -0.66342 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0208815 -0.629419 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0287044 -0.644149 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00842045 -0.630413 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0325183 -0.62221 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0446211 -0.604582 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.053173 -0.627745 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0325183 -0.62221 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0239663 -0.599047 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0118635 -0.616676 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0118635 -0.616676 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0446211 -0.604582 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0325183 -0.62221 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.053173 -0.627745 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0845947 -0.712851 -0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.107813 -0.706291 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0896851 -0.701434 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0909853 -0.689001 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.102723 -0.717709 -0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0858949 -0.700418 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0795043 -0.724268 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.101422 -0.730141 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0782041 -0.736701 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0832945 -0.725284 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0539145 -0.666287 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0721382 -0.650692 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.072935 -0.663167 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0564414 -0.645053 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0531177 -0.653812 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0374209 -0.648173 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.034894 -0.669407 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0696112 -0.671925 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0513875 -0.68752 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.070408 -0.6844 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0347427 -0.737837 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0511556 -0.740802 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0580833 -0.730397 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.043171 -0.718185 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.027815 -0.748242 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0198304 -0.725625 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0114021 -0.745277 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0427273 -0.760455 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0263144 -0.757489 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0496549 -0.750049 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0440268 -0.740325 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.0650768 -0.746894 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0607735 -0.723153 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0653796 -0.739183 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.04833 -0.764065 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0486329 -0.756355 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.02728 -0.757496 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0437239 -0.748035 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0226739 -0.741466 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0394207 -0.724295 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0058253 -0.76531 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.00415829 -0.786629 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0148294 -0.770845 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0058253 -0.76531 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.024813 -0.781094 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.02648 -0.759776 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.02648 -0.759776 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00415829 -0.786629 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0058253 -0.76531 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.0148294 -0.770845 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0272215 -0.721234 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER -0.0484665 -0.732368 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0371781 -0.737738 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0478762 -0.715699 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0385099 -0.715864 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0379196 -0.699195 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0172649 -0.70473 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0278118 -0.737902 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.00656677 -0.726768 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER -0.0165234 -0.743272 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.471405 -0.471405 1.11022e-16 RAD 0.166667
+ txt002
+ SPHERE CENTER 0.690426 -0.508983 1.83812e-16 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.755941 -0.484794 -0.0246914 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.767658 -0.47411 -0.0436186 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.749038 -0.489758 -0.0478724 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.744501 -0.467528 -0.0381316 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.774562 -0.469146 -0.0204376 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.751405 -0.462564 -0.0149506 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.762845 -0.47983 -0.00151032 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.779098 -0.491377 -0.0301783 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.767382 -0.502061 -0.0112511 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.760478 -0.507025 -0.0344321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.695668 -0.478434 -0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.703418 -0.481931 -0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.716184 -0.491475 -0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.694124 -0.500827 -0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.682902 -0.46889 -0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.673608 -0.487786 -0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.675152 -0.465393 -0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.704962 -0.459538 -0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.697211 -0.456041 -0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.717727 -0.469082 -0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.7029 -0.436283 -0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.714226 -0.418941 -0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.724842 -0.44101 -0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.704751 -0.43889 -0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.692283 -0.414215 -0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.682808 -0.434163 -0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.680957 -0.431557 0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.712374 -0.416335 0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.701048 -0.433677 0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.722991 -0.438403 0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.7507 -0.515343 0.0425863 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.773394 -0.506594 0.0468401 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.764807 -0.507924 0.0237283 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.755462 -0.491321 0.0394341 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.759287 -0.514012 0.065698 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.741355 -0.49874 0.058292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.736593 -0.522762 0.0614442 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.768632 -0.530616 0.0499923 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.745938 -0.539365 0.0457385 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.760045 -0.531946 0.0268805 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.697658 -0.466832 0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.709346 -0.447385 0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.721188 -0.46231 0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.703286 -0.447429 0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.685816 -0.451907 0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.679757 -0.451951 0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.674129 -0.471354 0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.703718 -0.466788 0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.692031 -0.486235 0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.71556 -0.481713 0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.685185 -0.539531 0.0672777 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.693658 -0.538818 0.0904587 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.708875 -0.534075 0.0716007 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.691194 -0.517905 0.0775657 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669969 -0.544274 0.0861356 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.667505 -0.523361 0.0732426 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.661495 -0.544988 0.0629546 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.687649 -0.560445 0.0801706 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.679176 -0.561158 0.0569896 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.702866 -0.555702 0.0613127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.743468 -0.557494 -0.0178949 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.767402 -0.560084 -0.0233819 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.755145 -0.53997 -0.0307879 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.760285 -0.543179 -0.00685171 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.755725 -0.577608 -0.0104889 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.748608 -0.560703 0.00604126 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.731791 -0.575017 -0.00500196 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.750585 -0.574398 -0.0344251 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.726651 -0.571808 -0.0289382 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.738328 -0.554284 -0.0418311 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.677953 -0.581682 0.00679642 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.682851 -0.601808 0.0202367 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.700216 -0.58454 0.0170845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.680568 -0.579842 0.0312799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.660588 -0.59895 0.00994863 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.658304 -0.576984 0.0209919 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.65569 -0.578824 -0.00349164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.680237 -0.603648 -0.0042468 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.675339 -0.583522 -0.0176871 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.697602 -0.58638 -0.00739901 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.683194 -0.551134 -0.0604812 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.687731 -0.573364 -0.070222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.703871 -0.56324 -0.0545162 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.682033 -0.571303 -0.0462858 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.667055 -0.561258 -0.076187 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.661356 -0.559196 -0.0522508 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.662518 -0.539027 -0.0664462 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.688893 -0.553195 -0.0844174 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.684356 -0.530964 -0.0746767 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.705033 -0.543071 -0.0687117 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.607487 -0.335322 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.629404 -0.313405 -0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.626214 -0.316595 -0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.624401 -0.335868 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.606941 -0.318408 -0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.631217 -0.294133 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.611945 -0.295946 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.634407 -0.290942 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.648676 -0.311592 -0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.651867 -0.308402 -0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.646863 -0.330864 -0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.610996 -0.384191 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.623201 -0.403702 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.635431 -0.385946 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.62031 -0.401066 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.598766 -0.401947 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.595876 -0.399312 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.586561 -0.382437 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.613886 -0.386827 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.601681 -0.367317 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.626116 -0.369071 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.558618 -0.331813 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.539107 -0.319608 -0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.541743 -0.322499 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.556863 -0.307378 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.555982 -0.328923 -0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.573738 -0.316693 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.575492 -0.341128 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.540862 -0.344043 -0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.560372 -0.356248 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.543497 -0.346933 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.625895 -0.264535 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.637402 -0.248969 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.646193 -0.271807 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.625088 -0.268363 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.617105 -0.241698 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.604791 -0.261092 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.605598 -0.257264 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.638209 -0.245142 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.626702 -0.260708 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.647 -0.267979 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.555109 -0.282943 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.550934 -0.258608 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.570229 -0.267823 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.570229 -0.267823 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.535813 -0.273728 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.555109 -0.282943 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539989 -0.298064 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.535813 -0.273728 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539989 -0.298064 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.555109 -0.282943 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.603979 -0.286452 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.613271 -0.265398 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627912 -0.281225 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.610787 -0.26842 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.589337 -0.270625 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.586853 -0.273647 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.580045 -0.291679 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.606463 -0.283431 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.59717 -0.304484 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.621104 -0.299257 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.678274 -0.316914 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.69384 -0.305407 -0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.674446 -0.317721 -0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671002 -0.296616 -0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.697667 -0.3046 -0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.67483 -0.295809 -0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.682101 -0.316107 -0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.701111 -0.325704 -0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.685545 -0.337211 -0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.681717 -0.338018 -0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.656357 -0.33883 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.677411 -0.329538 -0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.674389 -0.332022 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.661584 -0.314897 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.659378 -0.336346 -0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.643552 -0.321705 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.638325 -0.345639 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.672184 -0.353472 -0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.65113 -0.362764 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669162 -0.355956 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.659866 -0.3877 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.684201 -0.391875 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.674986 -0.37258 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.674986 -0.37258 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669081 -0.406996 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.659866 -0.3877 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.644745 -0.40282 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669081 -0.406996 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.644745 -0.40282 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.659866 -0.3877 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.607487 -0.335322 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.659645 -0.283164 0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.672915 -0.269894 0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.666987 -0.293281 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.649528 -0.275822 0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.665573 -0.259777 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.642185 -0.265705 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.652302 -0.273047 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.683032 -0.277236 0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669762 -0.290507 0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.677104 -0.300624 0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.656357 -0.33883 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.663448 -0.328536 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.639482 -0.329516 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.654603 -0.314396 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.680322 -0.33785 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.671477 -0.32371 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.673232 -0.348145 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.665202 -0.35297 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.658111 -0.363265 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.641237 -0.353951 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.603979 -0.286452 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.614273 -0.279361 0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.628413 -0.288206 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.613293 -0.303327 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.589839 -0.277607 0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.588858 -0.301572 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.579544 -0.284698 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.604959 -0.262487 0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.594664 -0.269578 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.619099 -0.271332 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.610775 -0.279656 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.621535 -0.258061 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.634468 -0.275921 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.616678 -0.264057 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.597842 -0.261795 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.592985 -0.267791 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.587082 -0.28339 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.615632 -0.27366 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.604872 -0.295255 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.628565 -0.29152 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.555109 -0.282943 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.550934 -0.258608 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.570229 -0.267823 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.570229 -0.267823 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.535813 -0.273728 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.555109 -0.282943 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539989 -0.298064 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.535813 -0.273728 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539989 -0.298064 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.555109 -0.282943 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.558618 -0.331813 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.55307 -0.320611 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.57665 -0.325005 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.563845 -0.30788 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.535038 -0.327419 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.545813 -0.314688 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.540585 -0.338621 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.547843 -0.344544 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.553391 -0.355747 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.571423 -0.348938 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.663153 -0.332034 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.684748 -0.321274 0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.678752 -0.326131 0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.666888 -0.308341 0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669149 -0.327177 0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.651289 -0.314244 0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.647554 -0.337937 0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.681014 -0.344967 0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.659419 -0.355727 0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.675018 -0.349824 0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.610996 -0.384191 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.622198 -0.389739 0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.63493 -0.378964 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.617804 -0.366159 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.598265 -0.394966 0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.593871 -0.371386 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.587062 -0.389418 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.61539 -0.407771 0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.604188 -0.402224 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.628121 -0.396997 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.659866 -0.3877 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.684201 -0.391875 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.674986 -0.37258 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.674986 -0.37258 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669081 -0.406996 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.659866 -0.3877 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.644745 -0.40282 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.669081 -0.406996 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.644745 -0.40282 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.659866 -0.3877 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.554344 -0.645066 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.610229 -0.668521 0.153697 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.633406 -0.663938 0.160875 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.626429 -0.65892 0.137727 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.617928 -0.64522 0.156428 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.617206 -0.673539 0.176845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.601728 -0.654822 0.172398 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.59403 -0.678123 0.169668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.625707 -0.687239 0.158144 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.602531 -0.691822 0.150967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.61873 -0.682221 0.134996 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.622977 -0.619787 0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.63767 -0.608008 0.0834188 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.620102 -0.623239 0.0751099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.613891 -0.601637 0.0853287 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.640545 -0.604555 0.107698 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.616766 -0.598184 0.109608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.625852 -0.616334 0.123668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.646756 -0.626157 0.0974792 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.632063 -0.637936 0.113449 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.629188 -0.641389 0.0891702 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.585648 -0.598918 0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.601562 -0.580238 0.162601 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.605914 -0.59781 0.14581 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.587563 -0.581665 0.142311 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.581295 -0.581346 0.176661 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.567297 -0.582773 0.156372 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.565381 -0.600026 0.173931 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.599646 -0.597491 0.18016 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.583732 -0.616171 0.177429 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.603999 -0.615063 0.163369 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.541596 -0.6938 0.165419 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.547376 -0.70016 0.188567 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.564621 -0.690564 0.173728 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.546319 -0.676324 0.182211 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.524351 -0.703396 0.180258 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.523294 -0.679561 0.173902 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.518571 -0.697037 0.157111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.542652 -0.717636 0.171776 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.536873 -0.711276 0.148628 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.559898 -0.70804 0.156937 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.517014 -0.624197 0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.516313 -0.60809 0.190293 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.538029 -0.616221 0.181811 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.524375 -0.60089 0.168094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.495298 -0.616065 0.180075 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.50336 -0.608865 0.157875 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.495999 -0.632172 0.161374 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.508952 -0.631397 0.193792 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.509653 -0.647504 0.175091 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.530668 -0.639529 0.18531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.48571 -0.670344 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.466887 -0.67091 0.138803 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.490138 -0.671107 0.147112 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.480853 -0.650637 0.136894 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.46246 -0.670147 0.114524 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.476425 -0.649874 0.112614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.481283 -0.669581 0.0985541 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.471745 -0.690617 0.124743 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.490567 -0.690052 0.108773 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.494995 -0.690815 0.133052 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.578925 -0.714669 0.104938 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.597914 -0.729812 0.109385 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.602084 -0.70632 0.103028 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.592661 -0.711617 0.125228 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.574755 -0.738161 0.111295 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.569503 -0.719965 0.127138 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.555767 -0.723017 0.106848 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.584178 -0.732864 0.0890951 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.565189 -0.71772 0.0846485 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.588348 -0.709372 0.0827387 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.52304 -0.691213 0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.511567 -0.712906 0.0596212 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.529503 -0.710453 0.0764123 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.507717 -0.699372 0.079911 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.505104 -0.693665 0.0455609 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.501254 -0.680131 0.0658506 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.516576 -0.671972 0.0482916 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.526889 -0.704747 0.0420622 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.538362 -0.683054 0.044793 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.544826 -0.702295 0.0588533 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.591673 -0.665934 0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.605761 -0.658095 0.0319289 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.58746 -0.643855 0.0404111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.607672 -0.647455 0.0541285 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.609975 -0.680174 0.0421477 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.611885 -0.669535 0.0643473 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.595887 -0.688013 0.0608487 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.589763 -0.676573 0.0284303 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.575674 -0.684413 0.0471312 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.571461 -0.662334 0.0369125 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.471405 -0.471405 0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.501645 -0.441164 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.518106 -0.424703 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.522721 -0.437548 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.505261 -0.420089 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.497031 -0.428319 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.484186 -0.423704 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.48057 -0.44478 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.51449 -0.445778 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.498029 -0.462239 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.519105 -0.458623 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.542955 -0.452233 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.560583 -0.44013 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.542955 -0.452233 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.53742 -0.431578 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.560583 -0.44013 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.53742 -0.431578 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.542955 -0.452233 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.566118 -0.460785 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.548489 -0.472887 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.548489 -0.472887 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.490576 -0.399854 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.502679 -0.382226 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.511231 -0.405389 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.490576 -0.399854 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.482024 -0.376691 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.469922 -0.39432 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.469922 -0.39432 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.502679 -0.382226 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.490576 -0.399854 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.511231 -0.405389 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.430095 -0.460336 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.427669 -0.446904 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.450155 -0.45293 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436486 -0.436486 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.407609 -0.454311 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.416426 -0.443892 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.410035 -0.467742 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.421278 -0.470754 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.423704 -0.484186 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.443764 -0.47678 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.419026 -0.419026 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.414851 -0.39469 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.434147 -0.403906 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.434147 -0.403906 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399731 -0.409811 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.419026 -0.419026 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.403906 -0.434147 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399731 -0.409811 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.403906 -0.434147 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.419026 -0.419026 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399854 -0.490576 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.378536 -0.488909 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399854 -0.490576 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.39432 -0.469922 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.378536 -0.488909 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.39432 -0.469922 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399854 -0.490576 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.384071 -0.509564 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.405389 -0.511231 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.405389 -0.511231 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.482473 -0.512714 0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.495905 -0.51514 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.506323 -0.506323 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.48988 -0.492654 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472055 -0.521531 0.30328 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.46603 -0.499045 0.295049 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.458623 -0.519105 0.282703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.488498 -0.5352 0.290934 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.475067 -0.532774 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.498917 -0.526383 0.270358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.452233 -0.542955 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.4539 -0.564273 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472887 -0.548489 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.452233 -0.542955 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.433245 -0.558738 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.431578 -0.53742 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.431578 -0.53742 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4539 -0.564273 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.452233 -0.542955 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.472887 -0.548489 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.523783 -0.523783 0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.548119 -0.527958 0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.538903 -0.508662 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.538903 -0.508662 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.532998 -0.543078 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.523783 -0.523783 0.246914 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.508662 -0.538903 0.234568 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.532998 -0.543078 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.508662 -0.538903 0.209877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.523783 -0.523783 0.197531 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.335322 -0.607487 0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.313405 -0.629404 0.178389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.316595 -0.626214 0.202664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.335868 -0.624401 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.318408 -0.606941 0.187336 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.294133 -0.631217 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.295946 -0.611945 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.290942 -0.634407 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.311592 -0.648676 0.193717 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.308402 -0.651867 0.169441 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.330864 -0.646863 0.178389 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.384191 -0.610996 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.405245 -0.601704 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.402224 -0.604188 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.389418 -0.587062 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.387213 -0.608512 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.371386 -0.593871 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.366159 -0.617804 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.400018 -0.625637 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.378964 -0.63493 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.396997 -0.628121 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.331813 -0.558618 0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.341105 -0.537564 0.175614 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.355747 -0.553391 0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.338621 -0.540585 0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.317172 -0.542791 0.178701 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.314688 -0.545813 0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.30788 -0.563845 0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.334297 -0.555596 0.191046 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.325005 -0.57665 0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.348938 -0.571423 0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.264535 -0.625895 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.245336 -0.623429 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.268271 -0.624736 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.260997 -0.604627 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.2416 -0.624589 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.257262 -0.605787 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.2608 -0.627055 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.248874 -0.644697 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.268073 -0.647163 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271809 -0.646004 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282943 -0.555109 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.278768 -0.530773 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.298064 -0.539989 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.298064 -0.539989 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.263648 -0.545894 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282943 -0.555109 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.267823 -0.570229 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.263648 -0.545894 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.267823 -0.570229 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282943 -0.555109 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.286452 -0.603979 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.266942 -0.591774 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.269578 -0.594664 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.284698 -0.579544 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.283817 -0.601088 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.301572 -0.588858 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.303327 -0.613293 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.268696 -0.616209 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.288206 -0.628413 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.271332 -0.619099 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.316914 -0.678274 0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.31938 -0.697473 0.138161 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.338182 -0.681812 0.134867 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.318074 -0.674538 0.147213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.298112 -0.693935 0.126127 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.296805 -0.671 0.135179 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.295646 -0.674736 0.110799 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.31822 -0.701209 0.113782 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.315754 -0.682009 0.0984536 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.337022 -0.685547 0.110488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.33883 -0.656357 0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.351035 -0.675867 0.0466081 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.363265 -0.658111 0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.348145 -0.673232 0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.3266 -0.674113 0.0435217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.32371 -0.671477 0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.314396 -0.654603 0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.341721 -0.658993 0.031176 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.329516 -0.639482 0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.353951 -0.641237 0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.3877 -0.659866 0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.412036 -0.664041 0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.40282 -0.644745 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.40282 -0.644745 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.396915 -0.679161 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.3877 -0.659866 0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37258 -0.674986 0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.396915 -0.679161 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37258 -0.674986 0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.3877 -0.659866 0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.554344 -0.645066 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.616373 -0.681385 -0.129006 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.639472 -0.678928 -0.137375 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.621631 -0.664108 -0.145845 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.629767 -0.661636 -0.122663 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.634214 -0.696205 -0.120537 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.624508 -0.678912 -0.105825 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.611115 -0.698662 -0.112168 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.626079 -0.698678 -0.143718 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.602979 -0.701135 -0.135349 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.608237 -0.683858 -0.152187 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.617144 -0.607573 -0.122833 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.63057 -0.595495 -0.139672 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.617371 -0.615286 -0.146288 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.605919 -0.594239 -0.140323 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.630343 -0.587782 -0.116217 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.605692 -0.586526 -0.116868 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.616917 -0.59986 -0.0993785 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.641795 -0.608828 -0.122182 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.628369 -0.620906 -0.105343 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.628595 -0.628619 -0.128798 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.609912 -0.649723 -0.062352 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.631982 -0.640648 -0.0560094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.62585 -0.64267 -0.0798417 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.614812 -0.625749 -0.0656463 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.616044 -0.647702 -0.0385197 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.598874 -0.632802 -0.0481565 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.593974 -0.656777 -0.0448623 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.627081 -0.664623 -0.0527151 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.605012 -0.673698 -0.0590577 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.620949 -0.666645 -0.0765474 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.553573 -0.718878 -0.117284 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.563328 -0.73992 -0.108814 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.577348 -0.719679 -0.110668 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.559693 -0.720935 -0.0934517 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539553 -0.739118 -0.115431 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.535918 -0.720133 -0.100068 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.529798 -0.718076 -0.1239 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.557208 -0.737863 -0.132647 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.547453 -0.716821 -0.141116 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.571228 -0.717623 -0.1345 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.547112 -0.687216 -0.0506299 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.554862 -0.690713 -0.0274488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.570641 -0.682694 -0.0446649 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.552739 -0.667813 -0.0364345 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.531333 -0.695235 -0.0334138 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.52921 -0.672335 -0.0423994 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.523582 -0.691738 -0.0565949 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.549235 -0.710116 -0.0416443 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.541484 -0.706619 -0.0648253 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.565014 -0.702097 -0.0588603 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.491544 -0.682558 -0.099389 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.474542 -0.688647 -0.0825505 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.498226 -0.686417 -0.0759343 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.485132 -0.666351 -0.0818993 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.46786 -0.684788 -0.106005 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.47845 -0.662492 -0.105354 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.484862 -0.678699 -0.122844 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.480953 -0.704854 -0.10004 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.497955 -0.698765 -0.116879 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.504637 -0.702624 -0.093424 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.560805 -0.676727 -0.177765 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.57563 -0.689897 -0.192477 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.585222 -0.673115 -0.177114 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.575587 -0.693998 -0.168128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.551213 -0.693509 -0.193128 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.55117 -0.69761 -0.16878 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.536388 -0.680339 -0.178416 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.560848 -0.672626 -0.202114 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.546023 -0.659456 -0.187402 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.57044 -0.655844 -0.186751 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.498776 -0.640408 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.478525 -0.627785 -0.166213 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.484234 -0.630799 -0.142381 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.497935 -0.615951 -0.156576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.493066 -0.637394 -0.183703 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.512476 -0.62556 -0.174066 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.513317 -0.650016 -0.17736 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.479365 -0.652241 -0.169507 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.499616 -0.664864 -0.163165 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.485075 -0.655255 -0.145675 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.561576 -0.602915 -0.171592 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.570049 -0.602201 -0.194773 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.582252 -0.615021 -0.177557 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.560414 -0.623084 -0.185788 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.549372 -0.590095 -0.188808 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539737 -0.610978 -0.179823 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.540899 -0.590808 -0.165627 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.571211 -0.582032 -0.180578 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.562738 -0.582745 -0.157397 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.583414 -0.594852 -0.163362 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.335322 -0.607487 -0.111111 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.283164 -0.659645 -0.104315 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.269894 -0.672915 -0.0882695 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.293281 -0.666987 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.275822 -0.649528 -0.0830215 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.259777 -0.665573 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.265705 -0.642185 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.273047 -0.652302 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.277236 -0.683032 -0.109563 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.290507 -0.669762 -0.125608 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.300624 -0.677104 -0.104315 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.33883 -0.656357 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.350033 -0.661904 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.362764 -0.65113 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.345639 -0.638325 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.326099 -0.667131 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.321705 -0.643552 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.314897 -0.661584 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.343224 -0.679937 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.332022 -0.674389 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.355956 -0.669162 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.286452 -0.603979 -0.0555556 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.280905 -0.592776 -0.0342624 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.304484 -0.59717 -0.0401235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.291679 -0.580045 -0.0524691 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.262872 -0.599585 -0.0496945 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.273647 -0.586853 -0.0679012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.26842 -0.610787 -0.0709877 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.275678 -0.61671 -0.0373488 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.281225 -0.627912 -0.058642 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.299257 -0.621104 -0.0432099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.279656 -0.610775 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.256944 -0.602632 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.26347 -0.606749 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.273158 -0.587686 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.27313 -0.606658 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.289344 -0.591712 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.295841 -0.614801 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.263442 -0.62572 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.286153 -0.633864 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.269968 -0.629838 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282943 -0.555109 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.278768 -0.530773 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.298064 -0.539989 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.298064 -0.539989 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.263648 -0.545894 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282943 -0.555109 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.267823 -0.570229 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.263648 -0.545894 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.267823 -0.570229 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.282943 -0.555109 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.331813 -0.558618 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.342108 -0.551527 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.356248 -0.560372 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.341128 -0.575492 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.317673 -0.549772 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.316693 -0.573738 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.307378 -0.556863 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.332793 -0.534652 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.322499 -0.541743 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.346933 -0.543497 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.332034 -0.663153 -0.15987 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.340177 -0.685865 -0.165118 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.355123 -0.669651 -0.154009 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.33606 -0.679339 -0.141664 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.317089 -0.679367 -0.170979 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.312971 -0.672841 -0.147525 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.308945 -0.656656 -0.165731 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.336151 -0.669679 -0.183325 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.328008 -0.646968 -0.178077 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.351097 -0.653465 -0.172216 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.384191 -0.610996 -0.166667 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.391282 -0.600701 -0.18796 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.367317 -0.601681 -0.182099 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.382437 -0.586561 -0.169753 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.408157 -0.610016 -0.172528 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399312 -0.595876 -0.154321 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.401066 -0.62031 -0.151235 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.393037 -0.625136 -0.184873 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.385946 -0.635431 -0.16358 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.369071 -0.626116 -0.179012 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.3877 -0.659866 -0.111111 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.412036 -0.664041 -0.111111 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.40282 -0.644745 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.40282 -0.644745 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.396915 -0.679161 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.3877 -0.659866 -0.0864198 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37258 -0.674986 -0.0987654 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.396915 -0.679161 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.37258 -0.674986 -0.123457 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.3877 -0.659866 -0.135802 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.471405 -0.471405 -0.222222 RAD 0.0555556
+ txt002
+ SPHERE CENTER 0.441164 -0.441164 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.443014 -0.422853 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.449156 -0.418916 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.463412 -0.433171 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.435021 -0.445101 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.455419 -0.455419 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.433171 -0.463412 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.420766 -0.430846 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.418916 -0.449156 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.426908 -0.426908 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.399854 -0.452233 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.383576 -0.43509 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.40305 -0.440308 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.406245 -0.428383 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.380381 -0.447015 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.40305 -0.440308 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.396659 -0.464158 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.377186 -0.45894 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.393464 -0.476083 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.396659 -0.464158 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.452233 -0.399854 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.45894 -0.377186 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.476083 -0.393464 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.464158 -0.396659 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.43509 -0.383576 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.440308 -0.40305 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.428383 -0.406245 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.447015 -0.380381 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.440308 -0.40305 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.464158 -0.396659 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.512714 -0.460336 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.512375 -0.453047 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.493241 -0.465554 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.497443 -0.44229 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.531849 -0.447829 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.516916 -0.437072 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.532187 -0.455118 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.527647 -0.471093 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.527985 -0.478381 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.508512 -0.483599 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.523783 -0.419026 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.538038 -0.404771 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.532513 -0.427756 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.515053 -0.410297 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.529309 -0.396041 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.506323 -0.401567 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.515053 -0.410297 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.546768 -0.4135 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.532513 -0.427756 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.541242 -0.436486 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.542955 -0.490576 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.565623 -0.483869 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.54615 -0.478651 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.549345 -0.466726 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.562428 -0.495794 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.54615 -0.478651 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539759 -0.502501 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.559233 -0.507719 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.536564 -0.514426 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.539759 -0.502501 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.460336 -0.512714 -0.282703 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.461599 -0.535539 -0.292037 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.478381 -0.527985 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.455118 -0.532187 -0.268448 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.443553 -0.520267 -0.299164 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.437072 -0.516916 -0.275576 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.44229 -0.497443 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.466817 -0.516065 -0.306292 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.465554 -0.493241 -0.296959 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.483599 -0.508512 -0.289831 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.490576 -0.542955 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.507719 -0.559233 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.514426 -0.536564 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.502501 -0.539759 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.483869 -0.565623 -0.215094 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.478651 -0.54615 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.466726 -0.549345 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.495794 -0.562428 -0.236478 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.478651 -0.54615 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.502501 -0.539759 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.419026 -0.523783 -0.222222 RAD 0.0185185
+ txt002
+ SPHERE CENTER 0.404771 -0.538038 -0.207967 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.427756 -0.532513 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.410297 -0.515053 -0.200839 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.396041 -0.529309 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.401567 -0.506323 -0.222222 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.410297 -0.515053 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.4135 -0.546768 -0.22935 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.427756 -0.532513 -0.243606 RAD 0.00617284
+ txt002
+ SPHERE CENTER 0.436486 -0.541242 -0.222222 RAD 0.00617284
+ txt002
+
+END_SCENE
diff --git a/examples/parallel_for/tachyon/android/jni/Android.mk b/examples/parallel_for/tachyon/android/jni/Android.mk
new file mode 100644
index 0000000..e01eb66
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/jni/Android.mk
@@ -0,0 +1,84 @@
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+#
+# This file is part of Threading Building Blocks.
+#
+# Threading Building Blocks is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# Threading Building Blocks is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Threading Building Blocks; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction. Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License. This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+
+# The original source for this example is
+# Copyright (c) 1994-2008 John E. Stone
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+LOCAL_PATH := $(realpath $(call my-dir)/..)
+
+#Relative paths
+TBB_PATH := ../../../..
+SRC_PATH := $(TBB_PATH)/examples/parallel_for/tachyon/src
+
+#Absolute paths
+TBB_FULL_PATH := $(realpath $(TBB_PATH))
+TBB_COMMON_FULL_PATH := $(realpath $(TBB_PATH))/examples/common
+
+#The path is setup for binary package
+#Override if needed
+TBB_LIBRARY_FULL_PATH ?= $(TBB_FULL_PATH)/lib/android
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := jni-engine
+LOCAL_SRC_FILES := jni/jni-engine.cpp $(TBB_PATH)/examples/common/gui/convideo.cpp $(SRC_PATH)/trace.tbb.cpp $(SRC_PATH)/pthread.cpp $(SRC_PATH)/tachyon_video.cpp $(SRC_PATH)/api.cpp $(SRC_PATH)/apigeom.cpp $(SRC_PATH)/apitrigeom.cpp $(SRC_PATH)/bndbox.cpp $(SRC_PATH)/box.cpp $(SRC_PATH)/camera.cpp $(SRC_PATH)/coordsys.cpp $(SRC_PATH)/cylinder.cpp $(SRC_PATH)/extvol.cpp $(SRC_PATH)/global.cpp $(SRC_PATH)/grid.cpp $(SRC_PATH)/imageio.cpp $(SRC_PATH)/imap.cpp $(SRC_PATH)/intersect.cpp $(SR [...]
+# Add -DMARK_RENDERING_AREA=1 to see graphical threads work
+LOCAL_CFLAGS += -DTBB_USE_EXCEPTIONS=0 -DTBB_USE_GCC_BUILTINS -std=c++11 -fexceptions -Wdeprecated-declarations -I$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/include -I$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(APP_ABI)/include -I$(TBB_FULL_PATH)/include -I$(TBB_COMMON_FULL_PATH) -I$(realpath $(SRC_PATH))
+LOCAL_LDLIBS := -lm -llog -ljnigraphics -ltbb -lgnustl_shared -L./ -L$(TBB_FULL_PATH)/lib/android -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(APP_ABI)
+
+include $(BUILD_SHARED_LIBRARY)
+
+LOCAL_PATH := $(TBB_LIBRARY_FULL_PATH)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libtbb
+LOCAL_SRC_FILES := libtbb.so
+include $(PREBUILT_SHARED_LIBRARY)
+
diff --git a/build/test_launcher.sh b/examples/parallel_for/tachyon/android/jni/Application.mk
similarity index 77%
copy from build/test_launcher.sh
copy to examples/parallel_for/tachyon/android/jni/Application.mk
index 0e80d43..d4c8e17 100644
--- a/build/test_launcher.sh
+++ b/examples/parallel_for/tachyon/android/jni/Application.mk
@@ -1,6 +1,4 @@
-#!/bin/sh
-#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -26,17 +24,8 @@
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.
-while getopts "l:" flag #
-do #
- if [ `uname` != 'Linux' ] ; then #
- echo 'skip' #
- exit #
- fi #
- LD_PRELOAD=$OPTARG #
- shift `expr $OPTIND - 1` #
-done #
-# Set stack limit
-ulimit -s 10240 #
-# Run the command line passed via parameters
-export LD_PRELOAD #
-./$* #
+APP_ABI:=x86
+APP_STL:=gnustl_shared
+APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
+APP_PLATFORM:=android-15
+NDK_TOOLCHAIN_VERSION:=4.6
diff --git a/examples/parallel_for/tachyon/android/jni/jni-engine.cpp b/examples/parallel_for/tachyon/android/jni/jni-engine.cpp
new file mode 100644
index 0000000..ec65b02
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/jni/jni-engine.cpp
@@ -0,0 +1,287 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+/*
+ The original source for this example is
+ Copyright (c) 1994-2008 John E. Stone
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include <jni.h>
+#include <android/bitmap.h>
+#include <pthread.h>
+#include <signal.h>
+
+#include "utility/utility.h"
+#include "tachyon_video.h"
+#include "tbb/tick_count.h"
+#include "tbb/task_scheduler_init.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <android/log.h>
+#define LOG_INFO(...) __android_log_print(ANDROID_LOG_INFO,"tachyon",__VA_ARGS__)
+#define LOG_ERROR(...) __android_log_print(ANDROID_LOG_ERROR,"tachyon",__VA_ARGS__)
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "types.h"
+#include "api.h" /* The ray tracing library API */
+#include "parse.h" /* Support for my own file format */
+#include "ui.h"
+#include "util.h"
+
+SceneHandle global_scene;
+int global_xsize; /* size of graphic image rendered in window (from hres, vres) */
+int global_ysize;
+int global_xwinsize; /* size of window (may be larger than above) */
+int global_ywinsize;
+bool global_usegraphics;
+char* global_window_title;
+static long startTime=0;
+static volatile long elapsedTime=0;
+static volatile bool isCancelled=false;
+static volatile bool isPaused=false;
+
+bool silent_mode = false; /* silent mode */
+
+class tachyon_video *video = 0;
+
+typedef struct {
+ int foundfilename; /* was a model file name found in the args? */
+ char filename[1024]; /* model file to render */
+ int useoutfilename; /* command line override of output filename */
+ char outfilename[1024]; /* name of output image file */
+ int verbosemode; /* verbose flags */
+ int antialiasing; /* antialiasing setting */
+ int displaymode; /* display mode */
+ int boundmode; /* bounding mode */
+ int boundthresh; /* bounding threshold */
+ int usecamfile; /* use camera file */
+ char camfilename[1024]; /* camera filename */
+} argoptions;
+
+void initoptions(argoptions * opt) {
+ memset(opt, 0, sizeof(argoptions));
+ opt->foundfilename = -1;
+ opt->useoutfilename = -1;
+ opt->verbosemode = -1;
+ opt->antialiasing = -1;
+ opt->displaymode = -1;
+ opt->boundmode = -1;
+ opt->boundthresh = -1;
+ opt->usecamfile = -1;
+}
+
+int CreateScene(argoptions &opt) {
+ char *filename;
+
+ global_scene = rt_newscene();
+ rt_initialize();
+
+ //filename = "/mnt/sdcard/tachyon/data.dat";
+ filename = opt.filename;
+ LOG_INFO("CreateScene: data file name is %s", filename);
+
+ LOG_INFO("Readmodel");
+ if (readmodel(filename, global_scene) != 0) {
+ LOG_ERROR("Parser returned a non-zero error code reading %s\n", filename);
+ LOG_ERROR("Aborting Render...\n");
+ rt_finalize();
+ return -1;
+ }
+ LOG_INFO("Readmodel done");
+
+ scenedef *scene = (scenedef *) global_scene;
+
+ //scene->hres and scene->yres are taken from display properties in *initBitmap() function
+ scene->hres = global_xwinsize = global_xsize;
+ scene->vres = global_ywinsize = global_ysize;
+ LOG_INFO("CreateScene: global_xsize=%d global_ysize=%d", global_xsize, global_ysize);
+
+ return 0;
+}
+
+extern unsigned int * g_pImg;
+
+void* example_main(void *filename) {
+ try {
+ LOG_INFO("initoptions");
+ argoptions opt;
+ initoptions(&opt);
+ strcpy(opt.filename, (char*) filename);
+ LOG_INFO("initoptions done");
+
+ LOG_INFO("CreateScene");
+ if ((CreateScene(opt) != 0))
+ return NULL;
+ LOG_INFO("CreateScene done");
+
+ LOG_INFO("tachyon video");
+ tachyon_video tachyon;
+ LOG_INFO("tachyon video init_console");
+ tachyon.init_console();
+ LOG_INFO("tachyon video init_window");
+
+ tachyon.init_window(global_xsize, global_ysize);
+ LOG_INFO("tachyon video init_window done");
+ if( !tachyon.running )
+ return NULL;
+ LOG_INFO("tachyon video done");
+
+ video = &tachyon;
+ //Exit from the while via GUI "Exit" menu.
+ for(;;) {
+ LOG_INFO("main_loop() start");
+ elapsedTime = 0;
+ startTime=time(NULL);
+ isCancelled=false;
+ if (video)video->running = true;
+ memset(g_pImg, 0, 4 * global_xsize * global_ysize);
+ tachyon.main_loop();
+ elapsedTime = (long)(time(NULL)-startTime);
+ video->running=false;
+ //The timer to restart drawing then it is complete.
+ int timer=5;
+ do{
+ sleep(1);
+ }while( ( isPaused || !isCancelled && (timer--)>0 ) );
+ LOG_INFO("main_loop() done");
+ }
+ return NULL;
+ } catch (std::exception& e) {
+ LOG_ERROR("An error occurred. Error text is %s", e.what());
+ return NULL;
+ }
+}
+
+static int fill_rect(void* pixels, int size) {
+ if( pixels && g_pImg ){
+ memcpy(pixels, g_pImg, size);
+ if (video->running)
+ elapsedTime=(long)(time(NULL)-startTime);
+ return 0;
+ }else{
+ return -1;
+ }
+}
+
+extern "C" JNIEXPORT jlong JNICALL Java_com_intel_tbb_example_tachyon_tachyonView_getElapsedTime(
+ JNIEnv * env) {
+ return elapsedTime;
+}
+
+extern "C" JNIEXPORT void JNICALL Java_com_intel_tbb_example_tachyon_tachyonView_initBitmap(
+ JNIEnv * env, jobject obj, jobject bitmap, jint x_size, jint y_size,
+ jint number_of_threads, jstring filename) {
+ LOG_INFO("initBitmap start");
+ static pthread_t handle;
+ char buf[5];
+ LOG_INFO("video");
+ //TBB_NUM_THREADS is reading somewhere inside C++ common code
+ if (number_of_threads >= 0 && number_of_threads < 256) {
+ snprintf(buf, 4, "%d", number_of_threads);
+ setenv("TBB_NUM_THREADS", buf, 1);
+ }
+ LOG_INFO("TBB_NUM_THREADS=%s",getenv ("TBB_NUM_THREADS"));
+ //Cancel if we are in the middle of the painting
+ isCancelled = true;
+ if (video)
+ video->running = false;
+ if (!handle) {
+ LOG_INFO("Starting native thread");
+ pthread_attr_t s;
+ pthread_attr_init(&s);
+ //adjusting picture to physical resolution
+ global_xsize = x_size;
+ global_ysize = y_size;
+ char const* fn = env->GetStringUTFChars(filename, NULL);
+ LOG_INFO("fn=%s",fn);
+ //Starting example_main and returning back to GUI
+ pthread_create(&handle, NULL, &example_main, (void*) fn);
+ LOG_INFO("Thread handle is %x", handle);
+ }
+}
+
+extern "C" JNIEXPORT jint JNICALL Java_com_intel_tbb_example_tachyon_tachyonView_renderBitmap(
+ JNIEnv * env, jobject obj, jobject bitmap, jint size) {
+ AndroidBitmapInfo info;
+ void* pixels;
+ int ret;
+
+ //Getting bitmap to fill
+ if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {
+ LOG_ERROR("AndroidBitmap_getInfo() returned %d", ret);
+ return ret;
+ }
+
+ //Locking bitmap to fill
+ if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {
+ LOG_ERROR("AndroidBitmap_lockPixels() returned %d", ret);
+ }
+
+ //Filling the bitmap
+ ret = fill_rect(pixels, size);
+
+ //Unlocking the bitmap
+ AndroidBitmap_unlockPixels(env, bitmap);
+ return ret;
+}
+
+extern "C" JNIEXPORT void JNICALL Java_com_intel_tbb_example_tachyon_tachyon_setPaused(
+ JNIEnv * env, jobject obj, jboolean paused) {
+ if(video)video->pausing = isPaused = paused;
+ return;
+}
diff --git a/examples/parallel_for/tachyon/android/project.properties b/examples/parallel_for/tachyon/android/project.properties
new file mode 100644
index 0000000..0840b4a
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-15
diff --git a/examples/parallel_for/tachyon/android/res/menu/main_screen_menu.xml b/examples/parallel_for/tachyon/android/res/menu/main_screen_menu.xml
new file mode 100644
index 0000000..8d1d4e4
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/res/menu/main_screen_menu.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/thread0"
+ android:title="Auto" android:showAsAction="ifRoom"/>
+ <item android:id="@+id/thread1"
+ android:title="1 thread" android:showAsAction="ifRoom"/>
+ <item android:id="@+id/thread2"
+ android:title="2 threads" android:showAsAction="ifRoom"/>
+ <item android:id="@+id/thread4"
+ android:title="4 threads" android:showAsAction="ifRoom"/>
+ <item android:id="@+id/thread8"
+ android:title="8 threads" android:showAsAction="ifRoom"/>
+ <item android:id="@+id/exit"
+ android:title="Exit" android:showAsAction="ifRoom"/>
+</menu>
diff --git a/examples/parallel_for/tachyon/android/res/values/strings.xml b/examples/parallel_for/tachyon/android/res/values/strings.xml
new file mode 100644
index 0000000..f3514bb
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">Tachyon demo</string>
+</resources>
diff --git a/examples/parallel_for/tachyon/android/src/com/intel/tbb/example/tachyon/tachyon.java b/examples/parallel_for/tachyon/android/src/com/intel/tbb/example/tachyon/tachyon.java
new file mode 100644
index 0000000..520b365
--- /dev/null
+++ b/examples/parallel_for/tachyon/android/src/com/intel/tbb/example/tachyon/tachyon.java
@@ -0,0 +1,315 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+/*
+ The original source for this example is
+ Copyright (c) 1994-2008 John E. Stone
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+package com.intel.tbb.example.tachyon;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Environment;
+import android.content.Context;
+import android.content.res.AssetManager;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+
+public class tachyon extends Activity {
+ private tachyonView myView;
+ private int W;
+ private int H;
+ private String fileOnSDcard;
+ private float currentYMenuPosition=(float) 1e5;
+ private float previousYMenuPosition=0;
+ public int number_of_threads=0;
+ public static TextView txtThreadNumber;
+ public static TextView txtElapsedTime;
+
+ private static native void setPaused(boolean paused);
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ try {
+ fileOnSDcard = Environment.getExternalStorageDirectory()
+ .getPath() + "/tachyon/data.dat";
+ Log.i("tachyon", "Data file name is " + fileOnSDcard);
+ File dataFile = new File(fileOnSDcard);
+ if (dataFile.exists()) {
+ dataFile.delete();
+ }
+ if (!dataFile.exists()) {
+ AssetManager assetManager = getAssets();
+ InputStream inputFile = assetManager.open("data.dat");
+ dataFile.getParentFile().mkdirs();
+ dataFile.createNewFile();
+ OutputStream outputFile = new FileOutputStream(fileOnSDcard);
+ byte[] buffer = new byte[10000];
+ int bytesRead;
+ while ((bytesRead = inputFile.read(buffer)) != -1)
+ outputFile.write(buffer, 0, bytesRead);
+ inputFile.close();
+ inputFile = null;
+ outputFile.flush();
+ outputFile.close();
+ outputFile = null;
+ }
+ DisplayMetrics displayMetrics = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
+ ActionBar actionBar = getActionBar();
+ actionBar.hide();
+
+ H = displayMetrics.heightPixels;
+ W = displayMetrics.widthPixels;
+ Log.i("tachyon", "displayMetrics.heightPixels: " + H);
+ Log.i("tachyon", "displayMetrics.widthPixels: " + W);
+
+ //uncomment to override scene size
+ int sceneWidth = 400;
+ float ratio = W>H?(float)(W)/H:(float)(H)/W;
+ W = sceneWidth;
+ H = (int) (W/ratio);
+
+ Log.i("tachyon", "Scene size is " + W + "*" + H );
+
+ } catch (Exception e) {
+ Log.e("tachyon", "Exception in file copy: " + e.getMessage());
+ }
+ myView = new tachyonView(this, W, H, fileOnSDcard);
+ setContentView(myView);
+
+ LinearLayout llThreadNumber = new LinearLayout(this);
+ txtThreadNumber = new TextView(this);
+ txtThreadNumber.setText("");
+ txtThreadNumber.setTextColor(0xFF00FF00);
+ txtThreadNumber.setScaleX(1);
+ txtThreadNumber.setScaleY(1);
+ txtThreadNumber.setPadding(10, 10, 10, 10);
+ llThreadNumber.setGravity(Gravity.TOP | Gravity.CENTER);
+ llThreadNumber.addView(txtThreadNumber);
+ this.addContentView(llThreadNumber,
+ new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
+ LinearLayout llElapsedTime = new LinearLayout(this);
+ txtElapsedTime = new TextView(this);
+ txtElapsedTime.setText("");
+ txtElapsedTime.setTextColor(0xFFFF0000);
+ txtElapsedTime.setScaleX(2);
+ txtElapsedTime.setScaleY(2);
+ txtElapsedTime.setPadding(10, 10, 40, 10);
+ llElapsedTime.setGravity(Gravity.TOP | Gravity.RIGHT);
+ llElapsedTime.addView(txtElapsedTime);
+ this.addContentView(llElapsedTime,
+ new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
+ }
+
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.main_screen_menu, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event)
+ {
+ currentYMenuPosition = event.getY();
+ if(event.getAction()==MotionEvent.ACTION_UP ){
+ ActionBar actionBar = getActionBar();
+ if (previousYMenuPosition < currentYMenuPosition){
+ actionBar.show();
+ }else{
+ actionBar.hide();
+ }
+ previousYMenuPosition = currentYMenuPosition;
+ return true;
+ }
+ return super.onTouchEvent(event);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ Log.i("tachyon", "onPause working" );
+ setPaused(true);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ Log.i("tachyon", "onResume working" );
+ setPaused(false);
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.thread0: {
+ number_of_threads = 0;
+ break;
+ }
+ case R.id.thread1: {
+ number_of_threads = 1;
+ break;
+ }
+ case R.id.thread2: {
+ number_of_threads = 2;
+ break;
+ }
+ case R.id.thread4: {
+ number_of_threads = 4;
+ break;
+ }
+ case R.id.thread8: {
+ number_of_threads = 8;
+ break;
+ }
+ case R.id.exit: {
+ Log.i("tachyon", "Exiting...");
+ System.exit(0);
+ }
+ }
+ Log.i("tachyon", "Starting in " + number_of_threads + " Thread(s)");
+ myView.initNative(number_of_threads);
+ return true;
+ }
+
+ static {
+ System.loadLibrary("gnustl_shared");
+ System.loadLibrary("tbb");
+ System.loadLibrary("jni-engine");
+ }
+}
+
+class tachyonView extends View {
+ private Bitmap myBitmap;
+ private Rect targetRect;
+ private TimerTask myRefreshTask;
+ private static Timer myRefreshTimer;
+ private int W;
+ private int H;
+ private String filename;
+ public static String strCntDisplay;
+ public static String strFpsDisplay;
+
+ private static native int renderBitmap(Bitmap bitmap, int size);
+
+ private static native void initBitmap(Bitmap bitmap, int x_size,
+ int y_size, int number_of_threads, String fileOnSDcard);
+
+ private static native void pressButton(int x, int y);
+
+ private static native long getElapsedTime();
+
+ public void initNative(int number_of_threads) {
+ initBitmap(myBitmap, W, H, number_of_threads, filename);
+ }
+
+ public tachyonView(Context context, int widthPixels, int heightPixels, String fileOnSDcard) {
+ super(context);
+
+ //Landscape support only: H must be less than W
+ //In case application is started on locked phone portrait layout comes
+ //to the constructor even landscape is set in the manifest
+ W = widthPixels>heightPixels?widthPixels:heightPixels;
+ H = widthPixels>heightPixels?heightPixels:widthPixels;
+ filename=fileOnSDcard;
+ myBitmap = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888);
+ targetRect = new Rect();
+ initBitmap(myBitmap, W, H, 0, filename);
+
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ //Write bitmap buffer
+ if( renderBitmap(myBitmap, 4 * H * W) == 0 ){
+ targetRect.right = canvas.getWidth();
+ targetRect.bottom = canvas.getHeight();
+ //Draw bitmap buffer
+ canvas.drawBitmap(myBitmap, null, targetRect, null);
+ tachyon parent = (tachyon)getContext();
+ long elapsedTime=getElapsedTime();
+ if ( parent.number_of_threads > 0 ){
+ parent.getWindow().setTitle(parent.number_of_threads + " Thread(s): " + elapsedTime + " s.");
+ tachyon.txtThreadNumber.setText(parent.number_of_threads + " thread(s)");
+ tachyon.txtElapsedTime.setText(elapsedTime + " secs");
+ }else{
+ parent.getWindow().setTitle("HW concurrency: " + elapsedTime + " s.");
+ tachyon.txtThreadNumber.setText("Auto HW concurrency");
+ tachyon.txtElapsedTime.setText(elapsedTime + " secs");
+ }
+ }
+ invalidate();
+ return;
+ }
+}
diff --git a/examples/parallel_for/tachyon/index.html b/examples/parallel_for/tachyon/index.html
index 8d07c41..2001bbc 100644
--- a/examples/parallel_for/tachyon/index.html
+++ b/examples/parallel_for/tachyon/index.html
@@ -24,7 +24,7 @@ The following versions of the example are provided:
<DT>serial
<DD>Original sequential version.
<DT>tbb1d
-<DD>Parallel version that uses Intel® Threading Building Blocks (Intel TBB) and blocked_range to parallelize
+<DD>Parallel version that uses Intel® Threading Building Blocks (Intel® TBB) and blocked_range to parallelize
over tasks that are groups of scan-lines.
<UL>
<LI>By default, this version uses one thread per available processor. To change this
@@ -76,8 +76,11 @@ The following versions of the example are provided:
<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the
example (Windows* systems only).<DT><A HREF="xcode">xcode</A>
-<DD>Contains Xcode* IDE workspace for building and running the example (Mac OS* X
+<DD>Contains Xcode* IDE workspace for building and running the example (OS X*
systems only).</DL>
+<A HREF="android">android</A>
+<DD>Contains Eclipse* IDE workspace for building and running the example on Android* system. JNI part needs to be compiled by Android NDK.</DL>
+
<H2>To Build</H2>
General build directions can be found <A HREF=../../index.html#build>here</A>.
@@ -171,7 +174,7 @@ While running with the GUI display turned on the following keyboard keys can be
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_for/tachyon/src/api.cpp b/examples/parallel_for/tachyon/src/api.cpp
index 1aac39a..5fcd45d 100644
--- a/examples/parallel_for/tachyon/src/api.cpp
+++ b/examples/parallel_for/tachyon/src/api.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/api.h b/examples/parallel_for/tachyon/src/api.h
index 94f7b2d..78653dd 100644
--- a/examples/parallel_for/tachyon/src/api.h
+++ b/examples/parallel_for/tachyon/src/api.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/apigeom.cpp b/examples/parallel_for/tachyon/src/apigeom.cpp
index f07a2b5..fff2644 100644
--- a/examples/parallel_for/tachyon/src/apigeom.cpp
+++ b/examples/parallel_for/tachyon/src/apigeom.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/apitrigeom.cpp b/examples/parallel_for/tachyon/src/apitrigeom.cpp
index 2901df3..d96abff 100644
--- a/examples/parallel_for/tachyon/src/apitrigeom.cpp
+++ b/examples/parallel_for/tachyon/src/apitrigeom.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/apitrigeom.h b/examples/parallel_for/tachyon/src/apitrigeom.h
index 5b6a9eb..1c33c79 100644
--- a/examples/parallel_for/tachyon/src/apitrigeom.h
+++ b/examples/parallel_for/tachyon/src/apitrigeom.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/bndbox.cpp b/examples/parallel_for/tachyon/src/bndbox.cpp
index b72b6ce..9a8611a 100644
--- a/examples/parallel_for/tachyon/src/bndbox.cpp
+++ b/examples/parallel_for/tachyon/src/bndbox.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -122,7 +122,7 @@ static void bndbox_intersect(bndbox * bx, ray * ry) {
/* eliminate bounded rays whose bounds do not intersect */
/* the bounds of the box.. */
- if (ry->flags |= RT_RAY_BOUNDED) {
+ if (ry->flags & RT_RAY_BOUNDED) {
if ((ry->s.x > bx->max.x) && (ry->e.x > bx->max.x)) return;
if ((ry->s.x < bx->min.x) && (ry->e.x < bx->min.x)) return;
diff --git a/examples/parallel_for/tachyon/src/bndbox.h b/examples/parallel_for/tachyon/src/bndbox.h
index 6bcfcf6..402ac9c 100644
--- a/examples/parallel_for/tachyon/src/bndbox.h
+++ b/examples/parallel_for/tachyon/src/bndbox.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/box.cpp b/examples/parallel_for/tachyon/src/box.cpp
index c90f1c8..3d2175c 100644
--- a/examples/parallel_for/tachyon/src/box.cpp
+++ b/examples/parallel_for/tachyon/src/box.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/box.h b/examples/parallel_for/tachyon/src/box.h
index db3d073..997afc6 100644
--- a/examples/parallel_for/tachyon/src/box.h
+++ b/examples/parallel_for/tachyon/src/box.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/camera.cpp b/examples/parallel_for/tachyon/src/camera.cpp
index a5a9053..ca6bfb5 100644
--- a/examples/parallel_for/tachyon/src/camera.cpp
+++ b/examples/parallel_for/tachyon/src/camera.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/camera.h b/examples/parallel_for/tachyon/src/camera.h
index d75abb2..c25cc54 100644
--- a/examples/parallel_for/tachyon/src/camera.h
+++ b/examples/parallel_for/tachyon/src/camera.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/coordsys.cpp b/examples/parallel_for/tachyon/src/coordsys.cpp
index c21c00a..ac10f00 100644
--- a/examples/parallel_for/tachyon/src/coordsys.cpp
+++ b/examples/parallel_for/tachyon/src/coordsys.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/coordsys.h b/examples/parallel_for/tachyon/src/coordsys.h
index 32870a5..035d8a0 100644
--- a/examples/parallel_for/tachyon/src/coordsys.h
+++ b/examples/parallel_for/tachyon/src/coordsys.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/cylinder.cpp b/examples/parallel_for/tachyon/src/cylinder.cpp
index 07822a0..1a3329e 100644
--- a/examples/parallel_for/tachyon/src/cylinder.cpp
+++ b/examples/parallel_for/tachyon/src/cylinder.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/cylinder.h b/examples/parallel_for/tachyon/src/cylinder.h
index 3f92778..96a1dc9 100644
--- a/examples/parallel_for/tachyon/src/cylinder.h
+++ b/examples/parallel_for/tachyon/src/cylinder.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/extvol.cpp b/examples/parallel_for/tachyon/src/extvol.cpp
index 33c6489..61673ad 100644
--- a/examples/parallel_for/tachyon/src/extvol.cpp
+++ b/examples/parallel_for/tachyon/src/extvol.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/extvol.h b/examples/parallel_for/tachyon/src/extvol.h
index e973278..fc2f019 100644
--- a/examples/parallel_for/tachyon/src/extvol.h
+++ b/examples/parallel_for/tachyon/src/extvol.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/global.cpp b/examples/parallel_for/tachyon/src/global.cpp
index 05d4be1..9773a32 100644
--- a/examples/parallel_for/tachyon/src/global.cpp
+++ b/examples/parallel_for/tachyon/src/global.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/global.h b/examples/parallel_for/tachyon/src/global.h
index ebfbc95..598658e 100644
--- a/examples/parallel_for/tachyon/src/global.h
+++ b/examples/parallel_for/tachyon/src/global.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/grid.cpp b/examples/parallel_for/tachyon/src/grid.cpp
index b96989d..893d33c 100644
--- a/examples/parallel_for/tachyon/src/grid.cpp
+++ b/examples/parallel_for/tachyon/src/grid.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/grid.h b/examples/parallel_for/tachyon/src/grid.h
index 3670313..6b5579f 100644
--- a/examples/parallel_for/tachyon/src/grid.h
+++ b/examples/parallel_for/tachyon/src/grid.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/imageio.cpp b/examples/parallel_for/tachyon/src/imageio.cpp
index f405418..d2e119f 100644
--- a/examples/parallel_for/tachyon/src/imageio.cpp
+++ b/examples/parallel_for/tachyon/src/imageio.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/imageio.h b/examples/parallel_for/tachyon/src/imageio.h
index f28117e..e7b6921 100644
--- a/examples/parallel_for/tachyon/src/imageio.h
+++ b/examples/parallel_for/tachyon/src/imageio.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/imap.cpp b/examples/parallel_for/tachyon/src/imap.cpp
index 663be61..685e9d0 100644
--- a/examples/parallel_for/tachyon/src/imap.cpp
+++ b/examples/parallel_for/tachyon/src/imap.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/imap.h b/examples/parallel_for/tachyon/src/imap.h
index 824928b..4994a50 100644
--- a/examples/parallel_for/tachyon/src/imap.h
+++ b/examples/parallel_for/tachyon/src/imap.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/intersect.cpp b/examples/parallel_for/tachyon/src/intersect.cpp
index 8c719fd..11e8048 100644
--- a/examples/parallel_for/tachyon/src/intersect.cpp
+++ b/examples/parallel_for/tachyon/src/intersect.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/intersect.h b/examples/parallel_for/tachyon/src/intersect.h
index a783cc4..fc3ccff 100644
--- a/examples/parallel_for/tachyon/src/intersect.h
+++ b/examples/parallel_for/tachyon/src/intersect.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/jpeg.cpp b/examples/parallel_for/tachyon/src/jpeg.cpp
index d2c3a82..f9a8a09 100644
--- a/examples/parallel_for/tachyon/src/jpeg.cpp
+++ b/examples/parallel_for/tachyon/src/jpeg.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/jpeg.h b/examples/parallel_for/tachyon/src/jpeg.h
index d6b99dc..6463340 100644
--- a/examples/parallel_for/tachyon/src/jpeg.h
+++ b/examples/parallel_for/tachyon/src/jpeg.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/light.cpp b/examples/parallel_for/tachyon/src/light.cpp
index eac02a2..70eed51 100644
--- a/examples/parallel_for/tachyon/src/light.cpp
+++ b/examples/parallel_for/tachyon/src/light.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/light.h b/examples/parallel_for/tachyon/src/light.h
index 404ee13..9515ad9 100644
--- a/examples/parallel_for/tachyon/src/light.h
+++ b/examples/parallel_for/tachyon/src/light.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/machine.h b/examples/parallel_for/tachyon/src/machine.h
index e8e4196..764a7ce 100644
--- a/examples/parallel_for/tachyon/src/machine.h
+++ b/examples/parallel_for/tachyon/src/machine.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/macros.h b/examples/parallel_for/tachyon/src/macros.h
index c7d8a3e..0d0e27e 100644
--- a/examples/parallel_for/tachyon/src/macros.h
+++ b/examples/parallel_for/tachyon/src/macros.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/main.cpp b/examples/parallel_for/tachyon/src/main.cpp
index ef4483b..178cba0 100644
--- a/examples/parallel_for/tachyon/src/main.cpp
+++ b/examples/parallel_for/tachyon/src/main.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/objbound.cpp b/examples/parallel_for/tachyon/src/objbound.cpp
index 0735365..27cfda7 100644
--- a/examples/parallel_for/tachyon/src/objbound.cpp
+++ b/examples/parallel_for/tachyon/src/objbound.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/objbound.h b/examples/parallel_for/tachyon/src/objbound.h
index c2b7535..fba0742 100644
--- a/examples/parallel_for/tachyon/src/objbound.h
+++ b/examples/parallel_for/tachyon/src/objbound.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/parse.cpp b/examples/parallel_for/tachyon/src/parse.cpp
index cc4083c..fb90f04 100644
--- a/examples/parallel_for/tachyon/src/parse.cpp
+++ b/examples/parallel_for/tachyon/src/parse.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/parse.h b/examples/parallel_for/tachyon/src/parse.h
index b1f8a63..7f73150 100644
--- a/examples/parallel_for/tachyon/src/parse.h
+++ b/examples/parallel_for/tachyon/src/parse.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/plane.cpp b/examples/parallel_for/tachyon/src/plane.cpp
index 2e4bbbc..8568159 100644
--- a/examples/parallel_for/tachyon/src/plane.cpp
+++ b/examples/parallel_for/tachyon/src/plane.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/plane.h b/examples/parallel_for/tachyon/src/plane.h
index 050e7e5..e4f8ca9 100644
--- a/examples/parallel_for/tachyon/src/plane.h
+++ b/examples/parallel_for/tachyon/src/plane.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/ppm.cpp b/examples/parallel_for/tachyon/src/ppm.cpp
index c3e99db..77f307b 100644
--- a/examples/parallel_for/tachyon/src/ppm.cpp
+++ b/examples/parallel_for/tachyon/src/ppm.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/ppm.h b/examples/parallel_for/tachyon/src/ppm.h
index a13c21f..8f2d8f9 100644
--- a/examples/parallel_for/tachyon/src/ppm.h
+++ b/examples/parallel_for/tachyon/src/ppm.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/pthread.cpp b/examples/parallel_for/tachyon/src/pthread.cpp
index 93b7f2a..2b687f6 100644
--- a/examples/parallel_for/tachyon/src/pthread.cpp
+++ b/examples/parallel_for/tachyon/src/pthread.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -58,7 +58,7 @@
#ifdef EMULATE_PTHREADS
#include <assert.h>
-#include "pthread.h"
+#include "pthread_w.h"
/*
Basics
diff --git a/examples/parallel_for/tachyon/src/pthread.h b/examples/parallel_for/tachyon/src/pthread_w.h
similarity index 98%
rename from examples/parallel_for/tachyon/src/pthread.h
rename to examples/parallel_for/tachyon/src/pthread_w.h
index 1f518fd..8a754a1 100644
--- a/examples/parallel_for/tachyon/src/pthread.h
+++ b/examples/parallel_for/tachyon/src/pthread_w.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/quadric.cpp b/examples/parallel_for/tachyon/src/quadric.cpp
index 5d6ac8a..4c4bc3e 100644
--- a/examples/parallel_for/tachyon/src/quadric.cpp
+++ b/examples/parallel_for/tachyon/src/quadric.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/quadric.h b/examples/parallel_for/tachyon/src/quadric.h
index 508546a..adc808b 100644
--- a/examples/parallel_for/tachyon/src/quadric.h
+++ b/examples/parallel_for/tachyon/src/quadric.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/render.cpp b/examples/parallel_for/tachyon/src/render.cpp
index 3ad0f2f..b1d46a5 100644
--- a/examples/parallel_for/tachyon/src/render.cpp
+++ b/examples/parallel_for/tachyon/src/render.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/render.h b/examples/parallel_for/tachyon/src/render.h
index 30990bb..173de89 100644
--- a/examples/parallel_for/tachyon/src/render.h
+++ b/examples/parallel_for/tachyon/src/render.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/ring.cpp b/examples/parallel_for/tachyon/src/ring.cpp
index f8ec449..f420b03 100644
--- a/examples/parallel_for/tachyon/src/ring.cpp
+++ b/examples/parallel_for/tachyon/src/ring.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/ring.h b/examples/parallel_for/tachyon/src/ring.h
index b3b66be..ab4d78d 100644
--- a/examples/parallel_for/tachyon/src/ring.h
+++ b/examples/parallel_for/tachyon/src/ring.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/shade.cpp b/examples/parallel_for/tachyon/src/shade.cpp
index c081680..e54cb83 100644
--- a/examples/parallel_for/tachyon/src/shade.cpp
+++ b/examples/parallel_for/tachyon/src/shade.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/shade.h b/examples/parallel_for/tachyon/src/shade.h
index 6d3a736..f892b95 100644
--- a/examples/parallel_for/tachyon/src/shade.h
+++ b/examples/parallel_for/tachyon/src/shade.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/sphere.cpp b/examples/parallel_for/tachyon/src/sphere.cpp
index b71bb19..2b8b18a 100644
--- a/examples/parallel_for/tachyon/src/sphere.cpp
+++ b/examples/parallel_for/tachyon/src/sphere.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/sphere.h b/examples/parallel_for/tachyon/src/sphere.h
index 4d25441..e2d7fbf 100644
--- a/examples/parallel_for/tachyon/src/sphere.h
+++ b/examples/parallel_for/tachyon/src/sphere.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/tachyon_video.cpp b/examples/parallel_for/tachyon/src/tachyon_video.cpp
index 64ee65e..641bc16 100644
--- a/examples/parallel_for/tachyon/src/tachyon_video.cpp
+++ b/examples/parallel_for/tachyon/src/tachyon_video.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/tachyon_video.h b/examples/parallel_for/tachyon/src/tachyon_video.h
index e87157b..8b42375 100644
--- a/examples/parallel_for/tachyon/src/tachyon_video.h
+++ b/examples/parallel_for/tachyon/src/tachyon_video.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/texture.cpp b/examples/parallel_for/tachyon/src/texture.cpp
index 5849c3a..9429df1 100644
--- a/examples/parallel_for/tachyon/src/texture.cpp
+++ b/examples/parallel_for/tachyon/src/texture.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/texture.h b/examples/parallel_for/tachyon/src/texture.h
index 6b825d7..7b6f691 100644
--- a/examples/parallel_for/tachyon/src/texture.h
+++ b/examples/parallel_for/tachyon/src/texture.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/tgafile.cpp b/examples/parallel_for/tachyon/src/tgafile.cpp
index 895ec53..d32ba16 100644
--- a/examples/parallel_for/tachyon/src/tgafile.cpp
+++ b/examples/parallel_for/tachyon/src/tgafile.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/tgafile.h b/examples/parallel_for/tachyon/src/tgafile.h
index f326f17..9b7d2b9 100644
--- a/examples/parallel_for/tachyon/src/tgafile.h
+++ b/examples/parallel_for/tachyon/src/tgafile.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/trace.h b/examples/parallel_for/tachyon/src/trace.h
index caa9e52..c8ead8a 100644
--- a/examples/parallel_for/tachyon/src/trace.h
+++ b/examples/parallel_for/tachyon/src/trace.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/trace.serial.cpp b/examples/parallel_for/tachyon/src/trace.serial.cpp
index d239499..8a7378e 100644
--- a/examples/parallel_for/tachyon/src/trace.serial.cpp
+++ b/examples/parallel_for/tachyon/src/trace.serial.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/trace.tbb.cpp b/examples/parallel_for/tachyon/src/trace.tbb.cpp
index ea6fb0e..9c33b0d 100644
--- a/examples/parallel_for/tachyon/src/trace.tbb.cpp
+++ b/examples/parallel_for/tachyon/src/trace.tbb.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/trace.tbb1d.cpp b/examples/parallel_for/tachyon/src/trace.tbb1d.cpp
index 0f93f36..f644b72 100644
--- a/examples/parallel_for/tachyon/src/trace.tbb1d.cpp
+++ b/examples/parallel_for/tachyon/src/trace.tbb1d.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/trace_rest.cpp b/examples/parallel_for/tachyon/src/trace_rest.cpp
index 00ca172..94c18b0 100644
--- a/examples/parallel_for/tachyon/src/trace_rest.cpp
+++ b/examples/parallel_for/tachyon/src/trace_rest.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/triangle.cpp b/examples/parallel_for/tachyon/src/triangle.cpp
index 8f10735..8e0bb07 100644
--- a/examples/parallel_for/tachyon/src/triangle.cpp
+++ b/examples/parallel_for/tachyon/src/triangle.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/triangle.h b/examples/parallel_for/tachyon/src/triangle.h
index d3e71aa..bbeb9a4 100644
--- a/examples/parallel_for/tachyon/src/triangle.h
+++ b/examples/parallel_for/tachyon/src/triangle.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/types.h b/examples/parallel_for/tachyon/src/types.h
index 273493e..9f5ee9c 100644
--- a/examples/parallel_for/tachyon/src/types.h
+++ b/examples/parallel_for/tachyon/src/types.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/ui.cpp b/examples/parallel_for/tachyon/src/ui.cpp
index 160d96c..bf54d6d 100644
--- a/examples/parallel_for/tachyon/src/ui.cpp
+++ b/examples/parallel_for/tachyon/src/ui.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/ui.h b/examples/parallel_for/tachyon/src/ui.h
index b3a7f3c..1fa618d 100644
--- a/examples/parallel_for/tachyon/src/ui.h
+++ b/examples/parallel_for/tachyon/src/ui.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/util.cpp b/examples/parallel_for/tachyon/src/util.cpp
index de2e83a..b40b3e7 100644
--- a/examples/parallel_for/tachyon/src/util.cpp
+++ b/examples/parallel_for/tachyon/src/util.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/util.h b/examples/parallel_for/tachyon/src/util.h
index 26b7ef6..de03339 100644
--- a/examples/parallel_for/tachyon/src/util.h
+++ b/examples/parallel_for/tachyon/src/util.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/vector.cpp b/examples/parallel_for/tachyon/src/vector.cpp
index a7dff76..acd357b 100644
--- a/examples/parallel_for/tachyon/src/vector.cpp
+++ b/examples/parallel_for/tachyon/src/vector.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/vector.h b/examples/parallel_for/tachyon/src/vector.h
index 5b7e659..d8a3aa9 100644
--- a/examples/parallel_for/tachyon/src/vector.h
+++ b/examples/parallel_for/tachyon/src/vector.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/vol.cpp b/examples/parallel_for/tachyon/src/vol.cpp
index 7a33172..3b84860 100644
--- a/examples/parallel_for/tachyon/src/vol.cpp
+++ b/examples/parallel_for/tachyon/src/vol.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_for/tachyon/src/vol.h b/examples/parallel_for/tachyon/src/vol.h
index 130608a..0529dc1 100644
--- a/examples/parallel_for/tachyon/src/vol.h
+++ b/examples/parallel_for/tachyon/src/vol.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/parallel_reduce/convex_hull/Makefile b/examples/parallel_reduce/convex_hull/Makefile
index 5b1cd76..9860bdc 100644
--- a/examples/parallel_reduce/convex_hull/Makefile
+++ b/examples/parallel_reduce/convex_hull/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=convex_hull_bench
ARGS=
PERF_RUN_ARGS = silent auto 40000000
@@ -36,8 +37,13 @@ CXX=icc
endif # icc
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -56,9 +62,9 @@ perf_build: release
perf_run:
./convex_hull_sample $(PERF_RUN_ARGS)
-
+
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
light_test:
./$(PROG) $(LIGHT_ARGS)
diff --git a/examples/parallel_reduce/convex_hull/Makefile.windows b/examples/parallel_reduce/convex_hull/Makefile.windows
index f354d02..57f2272 100644
--- a/examples/parallel_reduce/convex_hull/Makefile.windows
+++ b/examples/parallel_reduce/convex_hull/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/parallel_reduce/convex_hull/convex_hull.h b/examples/parallel_reduce/convex_hull/convex_hull.h
index babd81f..cbc6558 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull.h
+++ b/examples/parallel_reduce/convex_hull/convex_hull.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -69,8 +69,8 @@ namespace util {
utility::parse_cli_arguments(
argc,argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(cfg::threads,"n-of-threads","number of threads to run on; a non-negative integer, or 'auto' to use HW number of threads, or range of the form low:high")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(cfg::threads,"n-of-threads",utility::thread_number_range_desc)
.positional_arg(cfg::numberOfPoints,"n-of-points","number of points")
.arg(silent,"silent","no output except elapsed time")
.arg(verbose,"verbose","turns verbose ON")
diff --git a/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp b/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp
index b83f34d..fc92ace 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp
+++ b/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -590,8 +590,7 @@ int main(int argc, char* argv[]) {
std::cout << "Starting STL locked unbuffered push_back version of QUICK HULL algorithm" << std::endl;
#endif // USECONCVEC
- for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last;
- ++nthreads) {
+ for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last; nthreads=cfg::threads.step(nthreads)) {
pointVec_t points;
pointVec_t hull;
@@ -613,8 +612,7 @@ int main(int argc, char* argv[]) {
std::cout << "Starting STL locked buffered version of QUICK HULL algorithm" << std::endl;
#endif
- for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last;
- ++nthreads) {
+ for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last; nthreads=cfg::threads.step(nthreads)) {
pointVec_t points;
pointVec_t hull;
diff --git a/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp b/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
index 810f2aa..41ecb6e 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
+++ b/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -283,9 +283,7 @@ int main(int argc, char* argv[]) {
std::cout << "Starting TBB-buffered version of QUICK HULL algorithm" << std::endl;
}
-
- for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last;
- ++nthreads) {
+ for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last; nthreads=cfg::threads.step(nthreads)) {
tbb::task_scheduler_init init(nthreads);
points.clear();
diff --git a/examples/parallel_reduce/convex_hull/index.html b/examples/parallel_reduce/convex_hull/index.html
index f1d1083..43a5264 100644
--- a/examples/parallel_reduce/convex_hull/index.html
+++ b/examples/parallel_reduce/convex_hull/index.html
@@ -42,7 +42,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_reduce/index.html b/examples/parallel_reduce/index.html
index c25a0bb..970b242 100644
--- a/examples/parallel_reduce/index.html
+++ b/examples/parallel_reduce/index.html
@@ -15,7 +15,7 @@ This directory has examples of the template <code>parallel_reduce</code>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_reduce/primes/Makefile b/examples/parallel_reduce/primes/Makefile
index 9b6f06e..dee9641 100644
--- a/examples/parallel_reduce/primes/Makefile
+++ b/examples/parallel_reduce/primes/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=primes
ARGS=
PERF_RUN_ARGS=silent auto 1000000000 1000 20
@@ -35,20 +36,28 @@ CXX=icc
endif # icc
ifeq ($(offload), mic)
-override CXXFLAGS += -D__TBB_MIC=1
+override CXXFLAGS += -D__TBB_MIC_OFFLOAD=1
endif
-ifeq ($(CXX), icc)
-TBBLIB = -tbb
-TBBLIB_DEBUG = -tbb
-else
+ifeq (,$(filter icc icpc,$(CXX)))
TBBLIB = -ltbb
TBBLIB_DEBUG = -ltbb_debug
+else
+TBBLIB = -tbb
+TBBLIB_DEBUG = -ltbb_debug
+ifeq ($(offload), mic)
+TBBLIB_DEBUG += -offload-option,mic,ld,"-ltbb_debug -L${TBBROOT}/lib/mic/"
+endif
endif
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -62,7 +71,7 @@ clean:
$(RM) $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
perf_build: release
diff --git a/examples/parallel_reduce/primes/Makefile.windows b/examples/parallel_reduce/primes/Makefile.windows
index a5c813b..ce91ee1 100644
--- a/examples/parallel_reduce/primes/Makefile.windows
+++ b/examples/parallel_reduce/primes/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/parallel_reduce/primes/index.html b/examples/parallel_reduce/primes/index.html
index 39c1d36..6fb6147 100644
--- a/examples/parallel_reduce/primes/index.html
+++ b/examples/parallel_reduce/primes/index.html
@@ -52,7 +52,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_reduce/primes/main.cpp b/examples/parallel_reduce/primes/main.cpp
index 510ec97..4f4674d 100644
--- a/examples/parallel_reduce/primes/main.cpp
+++ b/examples/parallel_reduce/primes/main.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -57,9 +57,9 @@ struct RunOptions{
int do_get_default_num_threads() {
int threads;
- #if __TBB_MIC
+ #if __TBB_MIC_OFFLOAD
#pragma offload target(mic) out(threads)
- #endif // __TBB_MIC
+ #endif // __TBB_MIC_OFFLOAD
threads = tbb::task_scheduler_init::default_num_threads();
return threads;
}
@@ -79,8 +79,8 @@ static RunOptions ParseCommandLine( int argc, const char* argv[] ) {
utility::parse_cli_arguments(argc,argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc)
.positional_arg(number,"number","upper bound of range to search primes in, must be a positive integer")
.positional_arg(grainSize,"grain-size","must be a positive integer")
.positional_arg(repeatNumber,"n-of-repeats","repeat the calculation this number of times, must be a positive integer")
@@ -96,21 +96,21 @@ int main( int argc, const char* argv[] ) {
RunOptions options =ParseCommandLine(argc,argv);
// Try different numbers of threads
- for( int p=options.threads.first; p<=options.threads.last; ++p ) {
+ for( int p=options.threads.first; p<=options.threads.last; p=options.threads.step(p) ) {
for (NumberType i=0; i<options.repeatNumber;++i){
tbb::tick_count iterationBeginMark = tbb::tick_count::now();
NumberType count = 0;
NumberType n = options.n;
if( p==0 ) {
- #if __TBB_MIC
+ #if __TBB_MIC_OFFLOAD
#pragma offload target(mic) in(n) out(count)
- #endif // __TBB_MIC
+ #endif // __TBB_MIC_OFFLOAD
count = SerialCountPrimes(n);
} else {
NumberType grainSize = options.grainSize;
- #if __TBB_MIC
+ #if __TBB_MIC_OFFLOAD
#pragma offload target(mic) in(n, p, grainSize) out(count)
- #endif // __TBB_MIC
+ #endif // __TBB_MIC_OFFLOAD
count = ParallelCountPrimes(n, p, grainSize);
}
tbb::tick_count iterationEndMark = tbb::tick_count::now();
diff --git a/examples/parallel_reduce/primes/primes.cpp b/examples/parallel_reduce/primes/primes.cpp
index 414eff5..ee4dded 100644
--- a/examples/parallel_reduce/primes/primes.cpp
+++ b/examples/parallel_reduce/primes/primes.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -34,9 +34,9 @@
#include "primes.h"
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (target(mic))
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
#include <algorithm>
#include <cassert>
#include <cstdio>
diff --git a/examples/parallel_reduce/primes/primes.h b/examples/parallel_reduce/primes/primes.h
index b763a14..2d740b1 100644
--- a/examples/parallel_reduce/primes/primes.h
+++ b/examples/parallel_reduce/primes/primes.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,9 +29,9 @@
#ifndef PRIMES_H_
#define PRIMES_H_
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (push,target(mic))
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
#include "tbb/task_scheduler_init.h"
#include <cstddef>
@@ -45,8 +45,8 @@ NumberType SerialCountPrimes( NumberType n);
/** This is the parallel version. */
NumberType ParallelCountPrimes( NumberType n, int numberOfThreads= tbb::task_scheduler_init::automatic, NumberType grainSize = 1000);
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (pop)
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
#endif /* PRIMES_H_ */
diff --git a/examples/pipeline/index.html b/examples/pipeline/index.html
index 20c213c..e100c59 100644
--- a/examples/pipeline/index.html
+++ b/examples/pipeline/index.html
@@ -13,7 +13,7 @@ This directory has examples of the template <code>pipeline</code>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/pipeline/square/Makefile b/examples/pipeline/square/Makefile
index 44e2850..0153cb4 100644
--- a/examples/pipeline/square/Makefile
+++ b/examples/pipeline/square/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,44 +25,43 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=square
ARGS=0 input.txt output.txt
PERF_RUN_ARGS=auto input.txt output.txt silent
-GEN=gen_input
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
-SQUARE = square.cpp
+SOURCES = square.cpp gen_input.cpp
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
-release: $(SQUARE) input.txt
- $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $(SQUARE) -ltbb $(LIBS)
+release: $(SOURCES)
+ $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
-debug: $(SQUARE) input.txt
- $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $(SQUARE) -ltbb_debug $(LIBS)
+debug: $(SOURCES)
+ $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
clean:
- $(RM) $(PROG) $(GEN) *.o *.d input.txt output.txt
+ $(RM) $(PROG) *.o *.d input.txt output.txt
-$(GEN): gen_input.cpp
- $(CXX) -O2 $(CXXFLAGS) -o $(GEN) $^ $(LIBS)
+test:
+ $(run_cmd) ./$(PROG) $(ARGS)
-input.txt: $(GEN)
- ./$(GEN) >input.txt
+perf_build: $(SOURCES)
+ $(CXX) -O2 -msse2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
-test: input.txt
- ./$(PROG) $(ARGS)
-
-perf_build: $(SQUARE) input.txt
- $(CXX) -O2 -msse2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $(SQUARE) -ltbb $(LIBS)
-
-perf_run: input.txt
+perf_run:
./$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/pipeline/square/Makefile.windows b/examples/pipeline/square/Makefile.windows
index 747e143..87e3ef7 100644
--- a/examples/pipeline/square/Makefile.windows
+++ b/examples/pipeline/square/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -39,24 +39,20 @@ CXX = $(CXX2:-=cl.exe)
# The C++ compiler options
MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS) /D _CRT_SECURE_NO_DEPRECATE /D _SECURE_SCL=0 /arch:sse2
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
-SQUARE = square.cpp
+SOURCES = square.cpp gen_input.cpp
all: release test
release: compiler_check
- $(CXX) $(SQUARE) /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
+ $(CXX) $(SOURCES) /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
debug: compiler_check
- $(CXX) $(SQUARE) /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
+ $(CXX) $(SOURCES) /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
clean:
@cmd.exe /C del $(PROG).exe input.txt output.txt *.obj *.?db *.manifest gen_input.exe
-gen_input.exe: gen_input.cpp
- $(CXX) gen_input.cpp
-input.txt: gen_input.exe
- gen_input.exe > input.txt
-test: input.txt
+test:
$(PROG) $(ARGS)
compiler_check:
@echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
@cmd.exe /C del compiler_test
perf_build: release
-perf_run: input.txt
+perf_run:
$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/pipeline/square/gen_input.cpp b/examples/pipeline/square/gen_input.cpp
index b870952..d5f9e95 100644
--- a/examples/pipeline/square/gen_input.cpp
+++ b/examples/pipeline/square/gen_input.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -28,17 +28,43 @@
#include <stdlib.h>
#include <stdio.h>
+#include <stdexcept>
+
+#if _WIN32
+#include <io.h>
+#ifndef F_OK
+#define F_OK 0
+#endif
+#define access _access
+#else
+#include <unistd.h>
+#endif
+
+const long INPUT_SIZE = 1000000;
//! Generates sample input for square.cpp
-int main( int argc, char* argv[] ) {
- long num = argc>1 ? atol(argv[1]) : 1000000;
+void gen_input( const char *fname ) {
+ long num = INPUT_SIZE;
+ FILE *fptr = fopen(fname, "w");
+ if(!fptr) {
+ throw std::runtime_error("Could not open file for generating input");
+ }
+
int a=0;
int b=1;
for( long j=0; j<num; ++j ) {
- printf("%u\n",a);
+ fprintf(fptr, "%u\n",a);
b+=a;
a=(b-a)%10000;
if (a<0) a=-a;
}
- return 0;
+
+ if(fptr) {
+ fclose(fptr);
+ }
+}
+
+void generate_if_needed( const char *fname ) {
+ if ( access(fname, F_OK) != 0 )
+ gen_input(fname);
}
diff --git a/examples/pipeline/square/index.html b/examples/pipeline/square/index.html
index af17a97..c78d606 100644
--- a/examples/pipeline/square/index.html
+++ b/examples/pipeline/square/index.html
@@ -61,7 +61,7 @@ Two additional targets for this example:
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/pipeline/square/msvs/gen_input.icproj b/examples/pipeline/square/msvs/gen_input.icproj
deleted file mode 100644
index 50048b7..0000000
--- a/examples/pipeline/square/msvs/gen_input.icproj
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Intel C++ Project"
- Version="11.1"
- Name="gen_input"
- ProjectGUID="{18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}"
- VCNestedProjectGUID="{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
- VCNestedProjectFileName="gen_input.vcproj">
- <Configurations/>
- <Files/>
-</VisualStudioProject>
diff --git a/examples/pipeline/square/msvs/gen_input.vcproj b/examples/pipeline/square/msvs/gen_input.vcproj
deleted file mode 100644
index 9a0af57..0000000
--- a/examples/pipeline/square/msvs/gen_input.vcproj
+++ /dev/null
@@ -1,354 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="gen_input"
- ProjectGUID="{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
- RootNamespace="gen_input"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\gen_input.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/pipeline/square/msvs/square.vcproj b/examples/pipeline/square/msvs/square.vcproj
index 3632731..94087ff 100644
--- a/examples/pipeline/square/msvs/square.vcproj
+++ b/examples/pipeline/square/msvs/square.vcproj
@@ -30,10 +30,6 @@
/>
<Tool
Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
/>
<Tool
Name="VCXMLDataGeneratorTool"
@@ -112,10 +108,6 @@
/>
<Tool
Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
/>
<Tool
Name="VCXMLDataGeneratorTool"
@@ -194,10 +186,6 @@
/>
<Tool
Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
/>
<Tool
Name="VCXMLDataGeneratorTool"
@@ -277,10 +265,6 @@
/>
<Tool
Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
/>
<Tool
Name="VCXMLDataGeneratorTool"
@@ -358,6 +342,10 @@
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
+ RelativePath="..\gen_input.cpp"
+ >
+ </File>
+ <File
RelativePath="..\square.cpp"
>
</File>
diff --git a/examples/pipeline/square/msvs/square_cl.sln b/examples/pipeline/square/msvs/square_cl.sln
index 056f4f2..f631972 100644
--- a/examples/pipeline/square/msvs/square_cl.sln
+++ b/examples/pipeline/square/msvs/square_cl.sln
@@ -1,11 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "square", "square.vcproj", "{A21C0AEE-ADDC-45F0-A668-58FF10351D23}"
- ProjectSection(ProjectDependencies) = postProject
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7} = {25A46A49-406F-4681-8AC9-5FE46F38E5A7}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gen_input", "gen_input.vcproj", "{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -23,14 +18,6 @@ Global
{A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|Win32.Build.0 = Release|Win32
{A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.ActiveCfg = Release|x64
{A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.Build.0 = Release|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.ActiveCfg = Debug|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.Build.0 = Debug|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.ActiveCfg = Debug|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.Build.0 = Debug|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.ActiveCfg = Release|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.Build.0 = Release|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.ActiveCfg = Release|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/examples/pipeline/square/square.cpp b/examples/pipeline/square/square.cpp
index 96c39eb..19baa58 100644
--- a/examples/pipeline/square/square.cpp
+++ b/examples/pipeline/square/square.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -40,6 +40,8 @@
#include <cctype>
#include "../../common/utility/utility.h"
+extern void generate_if_needed(const char*);
+
using namespace std;
//! Holds a slice of text.
@@ -244,16 +246,17 @@ int main( int argc, char* argv[] ) {
utility::parse_cli_arguments(argc,argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc)
.positional_arg(InputFileName,"input-file","input file name")
.positional_arg(OutputFileName,"output-file","output file name")
.positional_arg(MAX_CHAR_PER_INPUT_SLICE, "max-slice-size","the maximum number of characters in one slice")
.arg(silent,"silent","no output except elapsed time")
);
+ generate_if_needed( InputFileName.c_str() );
if ( threads.first ) {
- for(int p = threads.first; p <= threads.last; ++p ) {
+ for(int p = threads.first; p <= threads.last; p=threads.step(p) ) {
if ( !silent ) printf("threads = %d ", p);
tbb::task_scheduler_init init(p);
if(!run_pipeline (p))
diff --git a/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj b/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj
index 6ef82ba..3e18873 100644
--- a/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj
+++ b/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj
@@ -7,22 +7,12 @@
objects = {
/* Begin PBXBuildFile section */
- 6DA3F3EC0DE5D3D80039CADE /* gen_input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D0FC7170DE5BA4D0026B02B /* gen_input.cpp */; };
A1F593A60B8F042A00073279 /* square.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* square.cpp */; };
A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
+ EA09E56116E4F19700CA4CF4 /* gen_input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D0FC7170DE5BA4D0026B02B /* gen_input.cpp */; };
/* End PBXBuildFile section */
-/* Begin PBXContainerItemProxy section */
- 6DA3F3ED0DE5D4090039CADE /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 6DA3F3E10DE5D34A0039CADE;
- remoteInfo = "gen-input";
- };
-/* End PBXContainerItemProxy section */
-
/* Begin PBXCopyFilesBuildPhase section */
8DD76F690486A84900D96B5E /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
@@ -38,20 +28,12 @@
/* Begin PBXFileReference section */
6D0FC7170DE5BA4D0026B02B /* gen_input.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = gen_input.cpp; path = ../gen_input.cpp; sourceTree = SOURCE_ROOT; };
- 6DA3F3E20DE5D34A0039CADE /* gen-input */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "gen-input"; sourceTree = BUILT_PRODUCTS_DIR; };
8DD76F6C0486A84900D96B5E /* square */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = square; sourceTree = BUILT_PRODUCTS_DIR; };
A1F593A50B8F042A00073279 /* square.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = square.cpp; path = ../square.cpp; sourceTree = SOURCE_ROOT; };
A1F593B30B8F06F900073279 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
- 6DA3F3E00DE5D34A0039CADE /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
8DD76F660486A84900D96B5E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -86,7 +68,6 @@
isa = PBXGroup;
children = (
8DD76F6C0486A84900D96B5E /* square */,
- 6DA3F3E20DE5D34A0039CADE /* gen-input */,
);
name = Products;
sourceTree = "<group>";
@@ -102,22 +83,6 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
- 6DA3F3E10DE5D34A0039CADE /* gen-input */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 6DA3F3E40DE5D36B0039CADE /* Build configuration list for PBXNativeTarget "gen-input" */;
- buildPhases = (
- 6DA3F3DF0DE5D34A0039CADE /* Sources */,
- 6DA3F3E00DE5D34A0039CADE /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "gen-input";
- productName = "gen-input";
- productReference = 6DA3F3E20DE5D34A0039CADE /* gen-input */;
- productType = "com.apple.product-type.tool";
- };
8DD76F620486A84900D96B5E /* square */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "square" */;
@@ -125,12 +90,10 @@
8DD76F640486A84900D96B5E /* Sources */,
8DD76F660486A84900D96B5E /* Frameworks */,
8DD76F690486A84900D96B5E /* CopyFiles */,
- 6D3576C90DE5C7A500C03B6D /* ShellScript */,
);
buildRules = (
);
dependencies = (
- 6DA3F3EE0DE5D4090039CADE /* PBXTargetDependency */,
);
name = square;
productInstallPath = "$(HOME)/bin";
@@ -158,55 +121,22 @@
projectRoot = "";
targets = (
8DD76F620486A84900D96B5E /* square */,
- 6DA3F3E10DE5D34A0039CADE /* gen-input */,
);
};
/* End PBXProject section */
-/* Begin PBXShellScriptBuildPhase section */
- 6D3576C90DE5C7A500C03B6D /* ShellScript */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- outputPaths = (
- "$(TARGET_BUILD_DIR)/input.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "$TARGET_BUILD_DIR/gen-input >$TARGET_BUILD_DIR/input.txt";
- };
-/* End PBXShellScriptBuildPhase section */
-
/* Begin PBXSourcesBuildPhase section */
- 6DA3F3DF0DE5D34A0039CADE /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 6DA3F3EC0DE5D3D80039CADE /* gen_input.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
8DD76F640486A84900D96B5E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ EA09E56116E4F19700CA4CF4 /* gen_input.cpp in Sources */,
A1F593A60B8F042A00073279 /* square.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
-/* Begin PBXTargetDependency section */
- 6DA3F3EE0DE5D4090039CADE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 6DA3F3E10DE5D34A0039CADE /* gen-input */;
- targetProxy = 6DA3F3ED0DE5D4090039CADE /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
/* Begin XCBuildConfiguration section */
1DEB923208733DC60010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
@@ -272,58 +202,6 @@
};
name = Release;
};
- 6DA3F3E50DE5D36B0039CADE /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- INSTALL_PATH = "$(HOME)/bin";
- PRODUCT_NAME = "gen-input";
- ZERO_LINK = YES;
- };
- name = Debug;
- };
- 6DA3F3E60DE5D36B0039CADE /* Debug64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT)";
- GCC_MODEL_TUNING = G5;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- INSTALL_PATH = "$(HOME)/bin";
- PRODUCT_NAME = "gen-input";
- ZERO_LINK = YES;
- };
- name = Debug64;
- };
- 6DA3F3E70DE5D36B0039CADE /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_MODEL_TUNING = G5;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- INSTALL_PATH = "$(HOME)/bin";
- PRODUCT_NAME = "gen-input";
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 6DA3F3E80DE5D36B0039CADE /* Release64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT)";
- GCC_MODEL_TUNING = G5;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- INSTALL_PATH = "$(HOME)/bin";
- PRODUCT_NAME = "gen-input";
- ZERO_LINK = YES;
- };
- name = Release64;
- };
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -425,17 +303,6 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 6DA3F3E40DE5D36B0039CADE /* Build configuration list for PBXNativeTarget "gen-input" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 6DA3F3E50DE5D36B0039CADE /* Debug */,
- 6DA3F3E60DE5D36B0039CADE /* Debug64 */,
- 6DA3F3E70DE5D36B0039CADE /* Release */,
- 6DA3F3E80DE5D36B0039CADE /* Release64 */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
/* End XCConfigurationList section */
};
rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
diff --git a/examples/task/index.html b/examples/task/index.html
index 75605d7..c1a1f60 100644
--- a/examples/task/index.html
+++ b/examples/task/index.html
@@ -13,7 +13,7 @@ This directory has examples of how to use the raw task scheduler.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/task/tree_sum/Makefile b/examples/task/tree_sum/Makefile
index a9681e1..8bbd31c 100644
--- a/examples/task/tree_sum/Makefile
+++ b/examples/task/tree_sum/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=tree_sum
ARGS=
PERF_RUN_ARGS=auto 100000000 silent
@@ -35,8 +36,13 @@ CXX=icc
endif # icc
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -50,9 +56,9 @@ clean:
$(RM) $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
- ./$(PROG) stdmalloc $(ARGS)
-
+ $(run_cmd) ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) stdmalloc $(ARGS)
+
perf_build: release
perf_run:
diff --git a/examples/task/tree_sum/Makefile.windows b/examples/task/tree_sum/Makefile.windows
index 08ecf03..0dda1f5 100644
--- a/examples/task/tree_sum/Makefile.windows
+++ b/examples/task/tree_sum/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/task/tree_sum/OptimizedParallelSumTree.cpp b/examples/task/tree_sum/OptimizedParallelSumTree.cpp
index 7e81e8d..b3a454a 100644
--- a/examples/task/tree_sum/OptimizedParallelSumTree.cpp
+++ b/examples/task/tree_sum/OptimizedParallelSumTree.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/task/tree_sum/SerialSumTree.cpp b/examples/task/tree_sum/SerialSumTree.cpp
index da6c2b5..03acf77 100644
--- a/examples/task/tree_sum/SerialSumTree.cpp
+++ b/examples/task/tree_sum/SerialSumTree.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/task/tree_sum/SimpleParallelSumTree.cpp b/examples/task/tree_sum/SimpleParallelSumTree.cpp
index a7d68ee..2e9cf93 100644
--- a/examples/task/tree_sum/SimpleParallelSumTree.cpp
+++ b/examples/task/tree_sum/SimpleParallelSumTree.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/task/tree_sum/TreeMaker.h b/examples/task/tree_sum/TreeMaker.h
index 90a1cd3..db8c420 100644
--- a/examples/task/tree_sum/TreeMaker.h
+++ b/examples/task/tree_sum/TreeMaker.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/task/tree_sum/common.h b/examples/task/tree_sum/common.h
index 7191c3b..afa63de 100644
--- a/examples/task/tree_sum/common.h
+++ b/examples/task/tree_sum/common.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/task/tree_sum/index.html b/examples/task/tree_sum/index.html
index c0c8f15..7c868b5 100644
--- a/examples/task/tree_sum/index.html
+++ b/examples/task/tree_sum/index.html
@@ -65,7 +65,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/task/tree_sum/main.cpp b/examples/task/tree_sum/main.cpp
index 92c8fc0..defd19f 100644
--- a/examples/task/tree_sum/main.cpp
+++ b/examples/task/tree_sum/main.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -71,8 +71,8 @@ int main( int argc, const char *argv[] ) {
utility::parse_cli_arguments(argc,argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc)
.positional_arg(number_of_nodes,"number-of-nodes","the number of nodes")
.arg(silent,"silent","no output except elapsed time")
.arg(use_stdmalloc,"stdmalloc","use standard allocator")
@@ -95,7 +95,7 @@ int main( int argc, const char *argv[] ) {
SerialSumTree(root);
if ( !silent ) printf("Calculations:\n");
if ( threads.first ) {
- for(int p = threads.first; p <= threads.last; ++p ) {
+ for(int p = threads.first; p <= threads.last; p = threads.step(p) ) {
if ( !silent ) printf("threads = %d\n", p );
tbb::task_scheduler_init init( p );
Run ( "SimpleParallelSumTree", SimpleParallelSumTree, root, silent );
diff --git a/examples/task_group/index.html b/examples/task_group/index.html
index 9a93ddb..6b36cb6 100644
--- a/examples/task_group/index.html
+++ b/examples/task_group/index.html
@@ -13,7 +13,7 @@ This directory has examples of how to use task_groups.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/task_group/sudoku/Makefile b/examples/task_group/sudoku/Makefile
index 12702a7..eb4a155 100644
--- a/examples/task_group/sudoku/Makefile
+++ b/examples/task_group/sudoku/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=sudoku
ARGS=4 input1 verbose
PERF_RUN_ARGS=auto input1 silent
@@ -35,21 +36,29 @@ CXX=icc
endif # which icc
ifeq ($(offload), mic)
-override CXXFLAGS += -D__TBB_MIC=1
+override CXXFLAGS += -D__TBB_MIC_OFFLOAD=1
endif
-ifeq ($(CXX), icc)
+ifeq (,$(filter icc icpc,$(CXX)))
+TBBLIB = -ltbb
+TBBLIB_DEBUG = -ltbb_debug
+else
TBBLIB = -tbb
-TBBLIB_DEBUG = -tbb
CXX0XFLAGS?=-std=c++0x -D_TBB_CPP0X
-else
-TBBLIB = -ltbb
TBBLIB_DEBUG = -ltbb_debug
+ifeq ($(offload), mic)
+TBBLIB_DEBUG += -offload-option,mic,ld,"-ltbb_debug -L${TBBROOT}/lib/mic/"
+endif
endif
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -63,7 +72,7 @@ clean:
$(RM) $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
perf_build: release
diff --git a/examples/task_group/sudoku/Makefile.windows b/examples/task_group/sudoku/Makefile.windows
index b525cdc..79210c3 100644
--- a/examples/task_group/sudoku/Makefile.windows
+++ b/examples/task_group/sudoku/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/task_group/sudoku/index.html b/examples/task_group/sudoku/index.html
index dca0111..e1aefe7 100644
--- a/examples/task_group/sudoku/index.html
+++ b/examples/task_group/sudoku/index.html
@@ -66,7 +66,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/task_group/sudoku/sudoku.cpp b/examples/task_group/sudoku/sudoku.cpp
index d241b80..a3c244e 100644
--- a/examples/task_group/sudoku/sudoku.cpp
+++ b/examples/task_group/sudoku/sudoku.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,23 +26,23 @@
the GNU General Public License.
*/
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (push,target(mic))
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
+
+// This header should come before any other one.
+// For details, see Known Issues in the Release Notes.
+#include "tbb/tbb_stddef.h"
#include <cstdio>
#include <cstdlib>
#include <string>
+
#include "tbb/atomic.h"
#include "tbb/tick_count.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/task_group.h"
-#if __INTEL_COMPILER
-// Suppress "std::auto_prt<> is deprecated" warning
-// TODO: replace auto_ptr with unique_ptr for compilers supporting C++11
-#pragma warning(disable: 1478)
-#endif
#include "../../common/utility/utility.h"
#pragma warning(disable: 4996)
@@ -279,15 +279,15 @@ unsigned solve(int p) {
return nSols;
}
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
#pragma offload_attribute (pop)
-#endif // __TBB_MIC
+#endif // __TBB_MIC_OFFLOAD
int do_get_default_num_threads() {
int threads;
- #if __TBB_MIC
+ #if __TBB_MIC_OFFLOAD
#pragma offload target(mic) out(threads)
- #endif // __TBB_MIC
+ #endif // __TBB_MIC_OFFLOAD
threads = tbb::task_scheduler_init::default_num_threads();
return threads;
}
@@ -307,8 +307,8 @@ int main(int argc, char *argv[]) {
utility::parse_cli_arguments(argc,argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc)
.positional_arg(filename,"filename","input filename")
.arg(verbose,"verbose","prints the first solution")
@@ -321,16 +321,16 @@ int main(int argc, char *argv[]) {
if ( !filename.empty() )
read_board( filename.c_str() );
// otherwise (if file name not specified), the default statically initialized board will be used.
- for(int p = threads.first; p <= threads.last; ++p ) {
+ for(int p = threads.first; p <= threads.last; p = threads.step(p) ) {
unsigned number;
- #if __TBB_MIC
+ #if __TBB_MIC_OFFLOAD
#pragma offload target(mic) in(init_values, p, verbose, find_one) out(number, solve_time)
{
- #endif // __TBB_MIC
+ #endif // __TBB_MIC_OFFLOAD
number = solve(p);
- #if __TBB_MIC
+ #if __TBB_MIC_OFFLOAD
}
- #endif // __TBB_MIC
+ #endif // __TBB_MIC_OFFLOAD
if ( !silent ) {
if ( find_one ) {
diff --git a/examples/task_priority/fractal/Makefile b/examples/task_priority/fractal/Makefile
index 875b02a..c191602 100644
--- a/examples/task_priority/fractal/Makefile
+++ b/examples/task_priority/fractal/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/task_priority/fractal/Makefile.windows b/examples/task_priority/fractal/Makefile.windows
index 7d9a00b..a3d7c85 100644
--- a/examples/task_priority/fractal/Makefile.windows
+++ b/examples/task_priority/fractal/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/examples/task_priority/fractal/fractal.cpp b/examples/task_priority/fractal/fractal.cpp
index 518ce56..edfc803 100644
--- a/examples/task_priority/fractal/fractal.cpp
+++ b/examples/task_priority/fractal/fractal.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/task_priority/fractal/fractal.h b/examples/task_priority/fractal/fractal.h
index f060553..bbee4e9 100644
--- a/examples/task_priority/fractal/fractal.h
+++ b/examples/task_priority/fractal/fractal.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/task_priority/fractal/fractal_video.h b/examples/task_priority/fractal/fractal_video.h
index c3b8f49..0df73d2 100644
--- a/examples/task_priority/fractal/fractal_video.h
+++ b/examples/task_priority/fractal/fractal_video.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/task_priority/fractal/index.html b/examples/task_priority/fractal/index.html
index 7caed5e..5357f3c 100644
--- a/examples/task_priority/fractal/index.html
+++ b/examples/task_priority/fractal/index.html
@@ -55,7 +55,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/task_priority/fractal/main.cpp b/examples/task_priority/fractal/main.cpp
index f364474..d0cb370 100644
--- a/examples/task_priority/fractal/main.cpp
+++ b/examples/task_priority/fractal/main.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -59,8 +59,8 @@ int main(int argc, char *argv[])
// command line parsing
utility::parse_cli_arguments(argc,argv,
utility::cli_argument_pack()
- //"-h" option for for displaying help is present implicitly
- .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+ //"-h" option for displaying help is present implicitly
+ .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc)
.positional_arg(num_frames,"n-of-frames","number of frames the example processes internally")
.positional_arg(max_iterations,"max-of-iterations","maximum number of the fractal iterations")
.positional_arg(grain_size,"grain-size","the grain size value")
@@ -84,7 +84,7 @@ int main(int argc, char *argv[])
else if ( video.init_console() ) {
// in console mode we always have limited number of frames
num_frames = num_frames<0 ? 1 : num_frames;
- for(int p = threads.first; p <= threads.last; ++p ) {
+ for(int p = threads.first; p <= threads.last; p = threads.step(p) ) {
if ( !silent ) printf("Threads = %d\n", p);
fractal_group fg( video.get_drawing_memory(), p, max_iterations, num_frames );
fg.run( !single );
diff --git a/examples/task_priority/index.html b/examples/task_priority/index.html
index cf2ff56..1612e68 100644
--- a/examples/task_priority/index.html
+++ b/examples/task_priority/index.html
@@ -13,7 +13,7 @@ This directory has examples of how to use the task priority feature.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/test_all/fibonacci/Fibonacci.cpp b/examples/test_all/fibonacci/Fibonacci.cpp
index bcd9ac4..14bf5ba 100644
--- a/examples/test_all/fibonacci/Fibonacci.cpp
+++ b/examples/test_all/fibonacci/Fibonacci.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/examples/test_all/fibonacci/Makefile b/examples/test_all/fibonacci/Makefile
index 5144576..6e9966a 100644
--- a/examples/test_all/fibonacci/Makefile
+++ b/examples/test_all/fibonacci/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -25,6 +25,7 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
+run_cmd=
PROG=fibonacci
ARGS=
@@ -34,8 +35,13 @@ CXX=icc
endif # icc
ifeq ($(shell uname), Linux)
+ifeq ($(target), android)
+LIBS+= --sysroot=$(SYSROOT)
+run_cmd=../../common/android.linux.launcher.sh
+else
LIBS+= -lrt
endif
+endif
all: release test
@@ -49,4 +55,4 @@ clean:
$(RM) $(PROG) *.o *.d
test:
- ./$(PROG) $(ARGS)
+ $(run_cmd) ./$(PROG) $(ARGS)
diff --git a/examples/test_all/fibonacci/Makefile.windows b/examples/test_all/fibonacci/Makefile.windows
index 79a20e4..756d7b4 100644
--- a/examples/test_all/fibonacci/Makefile.windows
+++ b/examples/test_all/fibonacci/Makefile.windows
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -36,7 +36,7 @@ CXX2 = $(CXX1:icl.exe-=icl.exe)
CXX = $(CXX2:-=cl.exe)
# The C++ compiler options
-MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS)
+MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _WIN32_WINNT=0x0501 $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
diff --git a/examples/test_all/fibonacci/index.html b/examples/test_all/fibonacci/index.html
index 684c02b..5d43170 100644
--- a/examples/test_all/fibonacci/index.html
+++ b/examples/test_all/fibonacci/index.html
@@ -41,7 +41,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/test_all/index.html b/examples/test_all/index.html
index 277d315..2ae10f8 100644
--- a/examples/test_all/index.html
+++ b/examples/test_all/index.html
@@ -13,7 +13,7 @@ This directory contains programs that exercise all the components of Intel®
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/include/index.html b/include/index.html
index 26cd33a..64c59c3 100644
--- a/include/index.html
+++ b/include/index.html
@@ -13,7 +13,7 @@ Include files for Intel® Threading Building Blocks (Intel® TBB).
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/include/serial/tbb/parallel_for.h b/include/serial/tbb/parallel_for.h
index 7f10403..6c689fc 100644
--- a/include/serial/tbb/parallel_for.h
+++ b/include/serial/tbb/parallel_for.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -80,11 +80,11 @@ class start_for : tbb::internal::no_copy {
}
public:
- static void run( const Range& range, const Body& body, const Partitioner& partitioner ) {
+ static void run( const Range& range, const Body& body, Partitioner& partitioner ) {
if( !range.empty() ) {
ANNOTATE_SITE_BEGIN( tbb_parallel_for );
{
- start_for a( range, body, const_cast< Partitioner& >( partitioner ) );
+ start_for a( range, body, partitioner );
a.execute();
}
ANNOTATE_SITE_END( tbb_parallel_for );
@@ -107,25 +107,25 @@ void start_for< Range, Body, Partitioner >::execute() {
}
}
-//! Parallel iteration over range with default partitioner..
+//! Parallel iteration over range with default partitioner.
/** @ingroup algorithms **/
template<typename Range, typename Body>
void parallel_for( const Range& range, const Body& body ) {
- serial::interface6::start_for<Range,Body,auto_partitioner>::run(range,body,auto_partitioner());
+ serial::interface6::start_for<Range,Body,const __TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
}
//! Parallel iteration over range with simple partitioner.
/** @ingroup algorithms **/
template<typename Range, typename Body>
void parallel_for( const Range& range, const Body& body, const simple_partitioner& partitioner ) {
- serial::interface6::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);
+ serial::interface6::start_for<Range,Body,const simple_partitioner>::run(range,body,partitioner);
}
//! Parallel iteration over range with auto_partitioner.
/** @ingroup algorithms **/
template<typename Range, typename Body>
void parallel_for( const Range& range, const Body& body, const auto_partitioner& partitioner ) {
- serial::interface6::start_for<Range,Body,auto_partitioner>::run(range,body,partitioner);
+ serial::interface6::start_for<Range,Body,const auto_partitioner>::run(range,body,partitioner);
}
//! Parallel iteration over range with affinity_partitioner.
@@ -135,9 +135,9 @@ void parallel_for( const Range& range, const Body& body, affinity_partitioner& p
serial::interface6::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);
}
-//! Parallel iteration over a range of integers with a step value
-template <typename Index, typename Function>
-void parallel_for(Index first, Index last, Index step, const Function& f) {
+//! Implementation of parallel iteration over stepped range of integers with explicit step and partitioner (ignored)
+template <typename Index, typename Function, typename Partitioner>
+void parallel_for_impl(Index first, Index last, Index step, const Function& f, Partitioner& ) {
if (step <= 0 )
throw std::invalid_argument( "nonpositive_step" );
else if (last > first) {
@@ -152,10 +152,46 @@ void parallel_for(Index first, Index last, Index step, const Function& f) {
}
}
-//! Parallel iteration over a range of integers with a default step value
+//! Parallel iteration over a range of integers with explicit step and default partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f) {
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, auto_partitioner());
+}
+//! Parallel iteration over a range of integers with explicit step and simple partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, const simple_partitioner& p) {
+ parallel_for_impl<Index,Function,const simple_partitioner>(first, last, step, f, p);
+}
+//! Parallel iteration over a range of integers with explicit step and auto partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, const auto_partitioner& p) {
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, p);
+}
+//! Parallel iteration over a range of integers with explicit step and affinity partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, affinity_partitioner& p) {
+ parallel_for_impl(first, last, step, f, p);
+}
+
+//! Parallel iteration over a range of integers with default step and default partitioner
template <typename Index, typename Function>
void parallel_for(Index first, Index last, const Function& f) {
- parallel_for(first, last, static_cast<Index>(1), f);
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, auto_partitioner());
+}
+//! Parallel iteration over a range of integers with default step and simple partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, const Function& f, const simple_partitioner& p) {
+ parallel_for_impl<Index,Function,const simple_partitioner>(first, last, static_cast<Index>(1), f, p);
+}
+//! Parallel iteration over a range of integers with default step and auto partitioner
+template <typename Index, typename Function>
+ void parallel_for(Index first, Index last, const Function& f, const auto_partitioner& p) {
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, p);
+}
+//! Parallel iteration over a range of integers with default step and affinity_partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, const Function& f, affinity_partitioner& p) {
+ parallel_for_impl(first, last, static_cast<Index>(1), f, p);
}
} // namespace interface6
diff --git a/include/serial/tbb/tbb_annotate.h b/include/serial/tbb/tbb_annotate.h
index 58385f6..a144e27 100644
--- a/include/serial/tbb/tbb_annotate.h
+++ b/include/serial/tbb/tbb_annotate.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/aggregator.h b/include/tbb/aggregator.h
index 5415528..1095af9 100644
--- a/include/tbb/aggregator.h
+++ b/include/tbb/aggregator.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/aligned_space.h b/include/tbb/aligned_space.h
index d23baed..d7397d4 100644
--- a/include/tbb/aligned_space.h
+++ b/include/tbb/aligned_space.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/atomic.h b/include/tbb/atomic.h
index 8715a1e..294a924 100644
--- a/include/tbb/atomic.h
+++ b/include/tbb/atomic.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,7 +30,6 @@
#define __TBB_atomic_H
#include <cstddef>
-#include "tbb_stddef.h"
#if _MSC_VER
#define __TBB_LONG_LONG __int64
@@ -43,7 +42,7 @@
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
// Workaround for overzealous compiler warnings
#pragma warning (push)
- #pragma warning (disable: 4244 4267)
+ #pragma warning (disable: 4244 4267 4512)
#endif
namespace tbb {
@@ -77,12 +76,10 @@ struct atomic_rep; // Primary template declared, but never defined.
template<>
struct atomic_rep<1> { // Specialization
typedef int8_t word;
- int8_t value;
};
template<>
struct atomic_rep<2> { // Specialization
typedef int16_t word;
- __TBB_DECL_ATOMIC_FIELD(int16_t,value,2)
};
template<>
struct atomic_rep<4> { // Specialization
@@ -92,16 +89,51 @@ struct atomic_rep<4> { // Specialization
#else
typedef int32_t word;
#endif
- __TBB_DECL_ATOMIC_FIELD(int32_t,value,4)
};
#if __TBB_64BIT_ATOMICS
template<>
struct atomic_rep<8> { // Specialization
typedef int64_t word;
- __TBB_DECL_ATOMIC_FIELD(int64_t,value,8)
};
#endif
+template<typename value_type, size_t size>
+struct aligned_storage;
+
+//the specializations are needed to please MSVC syntax of __declspec(align()) which accept _literal_ constants only
+#if __TBB_ATOMIC_CTORS
+ #define ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(S) \
+ template<typename value_type> \
+ struct aligned_storage<value_type,S> { \
+ __TBB_DECL_ATOMIC_FIELD(value_type,my_value,S) \
+ aligned_storage() = default ; \
+ constexpr aligned_storage(value_type value):my_value(value){} \
+ }; \
+
+#else
+ #define ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(S) \
+ template<typename value_type> \
+ struct aligned_storage<value_type,S> { \
+ __TBB_DECL_ATOMIC_FIELD(value_type,my_value,S) \
+ }; \
+
+#endif
+
+template<typename value_type>
+struct aligned_storage<value_type,1> {
+ value_type my_value;
+#if __TBB_ATOMIC_CTORS
+ aligned_storage() = default ;
+ constexpr aligned_storage(value_type value):my_value(value){}
+#endif
+};
+
+ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(2)
+ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(4)
+#if __TBB_64BIT_ATOMICS
+ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(8)
+#endif
+
template<size_t Size, memory_semantics M>
struct atomic_traits; // Primary template declared, but not defined.
@@ -193,22 +225,66 @@ __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(relaxed);
template<typename T>
struct atomic_impl {
protected:
- atomic_rep<sizeof(T)> rep;
+ aligned_storage<T,sizeof(T)> my_storage;
private:
+ //TODO: rechecks on recent versions of gcc if union is still the _only_ way to do a conversion without warnings
//! Union type used to convert type T to underlying integral type.
+ template<typename value_type>
union converter {
- T value;
- typename atomic_rep<sizeof(T)>::word bits;
+ typedef typename atomic_rep<sizeof(value_type)>::word bits_type;
+ converter(){}
+ converter(value_type a_value) : value(a_value) {}
+ value_type value;
+ bits_type bits;
+ };
+
+ template<typename value_t>
+ static typename converter<value_t>::bits_type to_bits(value_t value){
+ return converter<value_t>(value).bits;
+ }
+ template<typename value_t>
+ static value_t to_value(typename converter<value_t>::bits_type bits){
+ converter<value_t> u;
+ u.bits = bits;
+ return u.value;
+ }
+
+ template<typename value_t>
+ union ptr_converter; //Primary template declared, but never defined.
+
+ template<typename value_t>
+ union ptr_converter<value_t *> {
+ ptr_converter(){}
+ ptr_converter(value_t* a_value) : value(a_value) {}
+ value_t* value;
+ uintptr_t bits;
};
+ //TODO: check if making to_bits accepting reference (thus unifying it with to_bits_ref)
+ //does not hurt performance
+ template<typename value_t>
+ static typename converter<value_t>::bits_type & to_bits_ref(value_t& value){
+ //TODO: this #ifdef is temporary workaround, as union conversion seems to fail
+ //on suncc for 64 bit types for 32 bit target
+ #if !__SUNPRO_CC
+ return *(typename converter<value_t>::bits_type*)ptr_converter<value_t*>(&value).bits;
+ #else
+ return *(typename converter<value_t>::bits_type*)(&value);
+ #endif
+ }
+
+
public:
typedef T value_type;
+#if __TBB_ATOMIC_CTORS
+ atomic_impl() = default ;
+ constexpr atomic_impl(value_type value):my_storage(value){}
+#endif
template<memory_semantics M>
value_type fetch_and_store( value_type value ) {
- converter u, w;
- u.value = value;
- w.bits = internal::atomic_traits<sizeof(value_type),M>::fetch_and_store(&rep.value,u.bits);
- return w.value;
+ return to_value<value_type>(
+ internal::atomic_traits<sizeof(value_type),M>::fetch_and_store( &my_storage.my_value, to_bits(value) )
+ );
}
value_type fetch_and_store( value_type value ) {
@@ -217,11 +293,9 @@ public:
template<memory_semantics M>
value_type compare_and_swap( value_type value, value_type comparand ) {
- converter u, v, w;
- u.value = value;
- v.value = comparand;
- w.bits = internal::atomic_traits<sizeof(value_type),M>::compare_and_swap(&rep.value,u.bits,v.bits);
- return w.value;
+ return to_value<value_type>(
+ internal::atomic_traits<sizeof(value_type),M>::compare_and_swap( &my_storage.my_value, to_bits(value), to_bits(comparand) )
+ );
}
value_type compare_and_swap( value_type value, value_type comparand ) {
@@ -229,16 +303,16 @@ public:
}
operator value_type() const volatile { // volatile qualifier here for backwards compatibility
- converter w;
- w.bits = __TBB_load_with_acquire( rep.value );
- return w.value;
+ return to_value<value_type>(
+ __TBB_load_with_acquire( to_bits_ref(my_storage.my_value) )
+ );
}
template<memory_semantics M>
value_type load () const {
- converter u;
- u.bits = internal::atomic_load_store_traits<M>::load( rep.value );
- return u.value;
+ return to_value<value_type>(
+ internal::atomic_load_store_traits<M>::load( to_bits_ref(my_storage.my_value) )
+ );
}
value_type load () const {
@@ -247,9 +321,7 @@ public:
template<memory_semantics M>
void store ( value_type value ) {
- converter u;
- u.value = value;
- internal::atomic_load_store_traits<M>::store( rep.value, u.bits );
+ internal::atomic_load_store_traits<M>::store( to_bits_ref(my_storage.my_value), to_bits(value));
}
void store ( value_type value ) {
@@ -258,9 +330,8 @@ public:
protected:
value_type store_with_release( value_type rhs ) {
- converter u;
- u.value = rhs;
- __TBB_store_with_release(rep.value,u.bits);
+ //TODO: unify with store<release>
+ __TBB_store_with_release( to_bits_ref(my_storage.my_value), to_bits(rhs) );
return rhs;
}
};
@@ -273,10 +344,13 @@ template<typename I, typename D, typename StepType>
struct atomic_impl_with_arithmetic: atomic_impl<I> {
public:
typedef I value_type;
-
+#if __TBB_ATOMIC_CTORS
+ atomic_impl_with_arithmetic() = default ;
+ constexpr atomic_impl_with_arithmetic(value_type value): atomic_impl<I>(value){}
+#endif
template<memory_semantics M>
value_type fetch_and_add( D addend ) {
- return value_type(internal::atomic_traits<sizeof(value_type),M>::fetch_and_add( &this->rep.value, addend*sizeof(StepType) ));
+ return value_type(internal::atomic_traits<sizeof(value_type),M>::fetch_and_add( &this->my_storage.my_value, addend*sizeof(StepType) ));
}
value_type fetch_and_add( D addend ) {
@@ -337,6 +411,10 @@ public:
@ingroup synchronization */
template<typename T>
struct atomic: internal::atomic_impl<T> {
+#if __TBB_ATOMIC_CTORS
+ atomic() = default;
+ constexpr atomic(T arg): internal::atomic_impl<T>(arg) {}
+#endif
T operator=( T rhs ) {
// "this" required here in strict ISO C++ because store_with_release is a dependent name
return this->store_with_release(rhs);
@@ -344,13 +422,25 @@ struct atomic: internal::atomic_impl<T> {
atomic<T>& operator=( const atomic<T>& rhs ) {this->store_with_release(rhs); return *this;}
};
-#define __TBB_DECL_ATOMIC(T) \
- template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \
- T operator=( T rhs ) {return store_with_release(rhs);} \
- atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \
- };
+#if __TBB_ATOMIC_CTORS
+ #define __TBB_DECL_ATOMIC(T) \
+ template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \
+ atomic() = default; \
+ constexpr atomic(T arg): internal::atomic_impl_with_arithmetic<T,T,char>(arg) {} \
+ \
+ T operator=( T rhs ) {return store_with_release(rhs);} \
+ atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \
+ };
+#else
+ #define __TBB_DECL_ATOMIC(T) \
+ template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \
+ T operator=( T rhs ) {return store_with_release(rhs);} \
+ atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \
+ };
+#endif
#if __TBB_64BIT_ATOMICS
+//TODO: consider adding non-default (and atomic) copy constructor for 32bit platform
__TBB_DECL_ATOMIC(__TBB_LONG_LONG)
__TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)
#else
@@ -360,16 +450,26 @@ __TBB_DECL_ATOMIC(long)
__TBB_DECL_ATOMIC(unsigned long)
#if _MSC_VER && !_WIN64
+#if __TBB_ATOMIC_CTORS
/* Special version of __TBB_DECL_ATOMIC that avoids gratuitous warnings from cl /Wp64 option.
It is identical to __TBB_DECL_ATOMIC(unsigned) except that it replaces operator=(T)
with an operator=(U) that explicitly converts the U to a T. Types T and U should be
type synonyms on the platform. Type U should be the wider variant of T from the
perspective of /Wp64. */
#define __TBB_DECL_ATOMIC_ALT(T,U) \
- template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \
- T operator=( U rhs ) {return store_with_release(T(rhs));} \
+ template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \
+ atomic() = default ; \
+ constexpr atomic(T arg): internal::atomic_impl_with_arithmetic<T,T,char>(arg) {} \
+ T operator=( U rhs ) {return store_with_release(T(rhs));} \
atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \
};
+#else
+#define __TBB_DECL_ATOMIC_ALT(T,U) \
+ template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \
+ T operator=( U rhs ) {return store_with_release(T(rhs));} \
+ atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \
+ };
+#endif
__TBB_DECL_ATOMIC_ALT(unsigned,size_t)
__TBB_DECL_ATOMIC_ALT(int,ptrdiff_t)
#else
@@ -389,6 +489,10 @@ __TBB_DECL_ATOMIC(wchar_t)
//! Specialization for atomic<T*> with arithmetic and operator->.
template<typename T> struct atomic<T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
+#if __TBB_ATOMIC_CTORS
+ atomic() = default ;
+ constexpr atomic(T* arg): internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T>(arg) {}
+#endif
T* operator=( T* rhs ) {
// "this" required here in strict ISO C++ because store_with_release is a dependent name
return this->store_with_release(rhs);
@@ -403,6 +507,10 @@ template<typename T> struct atomic<T*>: internal::atomic_impl_with_arithmetic<T*
//! Specialization for atomic<void*>, for sake of not allowing arithmetic or operator->.
template<> struct atomic<void*>: internal::atomic_impl<void*> {
+#if __TBB_ATOMIC_CTORS
+ atomic() = default ;
+ constexpr atomic(void* arg): internal::atomic_impl<void*>(arg) {}
+#endif
void* operator=( void* rhs ) {
// "this" required here in strict ISO C++ because store_with_release is a dependent name
return this->store_with_release(rhs);
diff --git a/include/tbb/blocked_range.h b/include/tbb/blocked_range.h
index 670e43a..43474d2 100644
--- a/include/tbb/blocked_range.h
+++ b/include/tbb/blocked_range.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/blocked_range2d.h b/include/tbb/blocked_range2d.h
index 08a8efe..1919223 100644
--- a/include/tbb/blocked_range2d.h
+++ b/include/tbb/blocked_range2d.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/blocked_range3d.h b/include/tbb/blocked_range3d.h
index e741a12..534fc90 100644
--- a/include/tbb/blocked_range3d.h
+++ b/include/tbb/blocked_range3d.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/cache_aligned_allocator.h b/include/tbb/cache_aligned_allocator.h
index f6782bf..34da462 100644
--- a/include/tbb/cache_aligned_allocator.h
+++ b/include/tbb/cache_aligned_allocator.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -103,12 +103,12 @@ public:
//! Copy-construct value at location pointed to by p.
#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT
- template<typename... Args>
- void construct(pointer p, Args&&... args)
+ template<typename U, typename... Args>
+ void construct(U *p, Args&&... args)
#if __TBB_CPP11_STD_FORWARD_BROKEN
- { ::new((void *)p) T((args)...); }
+ { ::new((void *)p) U((args)...); }
#else
- { ::new((void *)p) T(std::forward<Args>(args)...); }
+ { ::new((void *)p) U(std::forward<Args>(args)...); }
#endif
#else // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT
void construct( pointer p, const value_type& value ) {::new((void*)(p)) value_type(value);}
diff --git a/include/tbb/combinable.h b/include/tbb/combinable.h
index d9a3bb5..a530995 100644
--- a/include/tbb/combinable.h
+++ b/include/tbb/combinable.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/compat/condition_variable b/include/tbb/compat/condition_variable
index 16caf12..9829cd0 100644
--- a/include/tbb/compat/condition_variable
+++ b/include/tbb/compat/condition_variable
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/compat/ppl.h b/include/tbb/compat/ppl.h
index 514a7b4..4d2fc28 100644
--- a/include/tbb/compat/ppl.h
+++ b/include/tbb/compat/ppl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/compat/thread b/include/tbb/compat/thread
index 54483ea..80e2619 100644
--- a/include/tbb/compat/thread
+++ b/include/tbb/compat/thread
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/compat/tuple b/include/tbb/compat/tuple
index 0c8721c..5e79b3f 100644
--- a/include/tbb/compat/tuple
+++ b/include/tbb/compat/tuple
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,10 +29,6 @@
#ifndef __TBB_tuple_H
#define __TBB_tuple_H
-#if !TBB_PREVIEW_TUPLE
-#error Set TBB_PREVIEW_TUPLE to include compat/tuple
-#endif
-
#include <utility>
#include "../tbb_stddef.h"
@@ -41,8 +37,8 @@
#if __TBB_VARIADIC_MAX <= 5
#define __TBB_T_PACK
#define __TBB_U_PACK
-#define __TBB_CLASS_T_PACK
-#define __TBB_CLASS_U_PACK
+#define __TBB_TYPENAME_T_PACK
+#define __TBB_TYPENAME_U_PACK
#define __TBB_NULL_TYPE_PACK
#define __TBB_REF_T_PARAM_PACK
#define __TBB_CONST_REF_T_PARAM_PACK
@@ -52,8 +48,8 @@
#elif __TBB_VARIADIC_MAX == 6
#define __TBB_T_PACK ,T5
#define __TBB_U_PACK ,U5
-#define __TBB_CLASS_T_PACK , class T5
-#define __TBB_CLASS_U_PACK , class U5
+#define __TBB_TYPENAME_T_PACK , typename T5
+#define __TBB_TYPENAME_U_PACK , typename U5
#define __TBB_NULL_TYPE_PACK , null_type
#define __TBB_REF_T_PARAM_PACK ,T5& t5
#define __TBB_CONST_REF_T_PARAM_PACK ,const T5& t5
@@ -63,8 +59,8 @@
#elif __TBB_VARIADIC_MAX == 7
#define __TBB_T_PACK ,T5, T6
#define __TBB_U_PACK ,U5, U6
-#define __TBB_CLASS_T_PACK , class T5 , class T6
-#define __TBB_CLASS_U_PACK , class U5 , class U6
+#define __TBB_TYPENAME_T_PACK , typename T5 , typename T6
+#define __TBB_TYPENAME_U_PACK , typename U5 , typename U6
#define __TBB_NULL_TYPE_PACK , null_type, null_type
#define __TBB_REF_T_PARAM_PACK ,T5& t5, T6& t6
#define __TBB_CONST_REF_T_PARAM_PACK ,const T5& t5, const T6& t6
@@ -74,8 +70,8 @@
#elif __TBB_VARIADIC_MAX == 8
#define __TBB_T_PACK ,T5, T6, T7
#define __TBB_U_PACK ,U5, U6, U7
-#define __TBB_CLASS_T_PACK , class T5 , class T6, class T7
-#define __TBB_CLASS_U_PACK , class U5 , class U6, class U7
+#define __TBB_TYPENAME_T_PACK , typename T5 , typename T6, typename T7
+#define __TBB_TYPENAME_U_PACK , typename U5 , typename U6, typename U7
#define __TBB_NULL_TYPE_PACK , null_type, null_type, null_type
#define __TBB_REF_T_PARAM_PACK ,T5& t5, T6& t6, T7& t7
#define __TBB_CONST_REF_T_PARAM_PACK , const T5& t5, const T6& t6, const T7& t7
@@ -85,8 +81,8 @@
#elif __TBB_VARIADIC_MAX == 9
#define __TBB_T_PACK ,T5, T6, T7, T8
#define __TBB_U_PACK ,U5, U6, U7, U8
-#define __TBB_CLASS_T_PACK , class T5, class T6, class T7, class T8
-#define __TBB_CLASS_U_PACK , class U5, class U6, class U7, class U8
+#define __TBB_TYPENAME_T_PACK , typename T5, typename T6, typename T7, typename T8
+#define __TBB_TYPENAME_U_PACK , typename U5, typename U6, typename U7, typename U8
#define __TBB_NULL_TYPE_PACK , null_type, null_type, null_type, null_type
#define __TBB_REF_T_PARAM_PACK ,T5& t5, T6& t6, T7& t7, T8& t8
#define __TBB_CONST_REF_T_PARAM_PACK , const T5& t5, const T6& t6, const T7& t7, const T8& t8
@@ -96,8 +92,8 @@
#elif __TBB_VARIADIC_MAX >= 10
#define __TBB_T_PACK ,T5, T6, T7, T8, T9
#define __TBB_U_PACK ,U5, U6, U7, U8, U9
-#define __TBB_CLASS_T_PACK , class T5, class T6, class T7, class T8, class T9
-#define __TBB_CLASS_U_PACK , class U5, class U6, class U7, class U8, class U9
+#define __TBB_TYPENAME_T_PACK , typename T5, typename T6, typename T7, typename T8, typename T9
+#define __TBB_TYPENAME_U_PACK , typename U5, typename U6, typename U7, typename U8, typename U9
#define __TBB_NULL_TYPE_PACK , null_type, null_type, null_type, null_type, null_type
#define __TBB_REF_T_PARAM_PACK ,T5& t5, T6& t6, T7& t7, T8& t8, T9& t9
#define __TBB_CONST_REF_T_PARAM_PACK , const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9
@@ -109,23 +105,25 @@
namespace tbb {
namespace interface5 {
+
namespace internal {
struct null_type { };
}
using internal::null_type;
// tuple forward declaration
-template <class T0=null_type, class T1=null_type, class T2=null_type, class T3=null_type, class T4=null_type
+template <typename T0=null_type, typename T1=null_type, typename T2=null_type,
+ typename T3=null_type, typename T4=null_type
#if __TBB_VARIADIC_MAX >= 6
-, class T5=null_type
+, typename T5=null_type
#if __TBB_VARIADIC_MAX >= 7
-, class T6=null_type
+, typename T6=null_type
#if __TBB_VARIADIC_MAX >= 8
-, class T7=null_type
+, typename T7=null_type
#if __TBB_VARIADIC_MAX >= 9
-, class T8=null_type
+, typename T8=null_type
#if __TBB_VARIADIC_MAX >= 10
-, class T9=null_type
+, typename T9=null_type
#endif
#endif
#endif
@@ -140,16 +138,16 @@ namespace internal {
inline const null_type cnull() { return null_type(); }
// cons forward declaration
-template <class HT, class TT> struct cons;
+template <typename HT, typename TT> struct cons;
// type of a component of the cons
-template<int N, class T>
+template<int N, typename T>
struct component {
typedef typename T::tail_type next;
typedef typename component<N-1,next>::type type;
};
-template<class T>
+template<typename T>
struct component<0,T> {
typedef typename T::head_type type;
};
@@ -161,14 +159,14 @@ struct component<0,null_type> {
// const version of component
-template<int N, class T>
+template<int N, typename T>
struct component<N, const T>
{
typedef typename T::tail_type next;
typedef const typename component<N-1,next>::type type;
};
-template<class T>
+template<typename T>
struct component<0, const T>
{
typedef const typename T::head_type type;
@@ -178,11 +176,11 @@ struct component<0, const T>
// helper class for getting components of cons
template< int N>
struct get_helper {
-template<class HT, class TT>
+template<typename HT, typename TT>
inline static typename component<N, cons<HT,TT> >::type& get(cons<HT,TT>& ti) {
return get_helper<N-1>::get(ti.tail);
}
-template<class HT, class TT>
+template<typename HT, typename TT>
inline static typename component<N, cons<HT,TT> >::type const& get(const cons<HT,TT>& ti) {
return get_helper<N-1>::get(ti.tail);
}
@@ -190,24 +188,24 @@ inline static typename component<N, cons<HT,TT> >::type const& get(const cons<HT
template<>
struct get_helper<0> {
-template<class HT, class TT>
+template<typename HT, typename TT>
inline static typename component<0, cons<HT,TT> >::type& get(cons<HT,TT>& ti) {
return ti.head;
}
-template<class HT, class TT>
+template<typename HT, typename TT>
inline static typename component<0, cons<HT,TT> >::type const& get(const cons<HT,TT>& ti) {
return ti.head;
}
};
// traits adaptor
-template <class T0, class T1, class T2, class T3, class T4 __TBB_CLASS_T_PACK>
+template <typename T0, typename T1, typename T2, typename T3, typename T4 __TBB_TYPENAME_T_PACK>
struct tuple_traits {
typedef cons <T0, typename tuple_traits<T1, T2, T3, T4 __TBB_T_PACK , null_type>::U > U;
};
-template <>
-struct tuple_traits<class T0, null_type, null_type, null_type, null_type __TBB_NULL_TYPE_PACK > {
+template <typename T0>
+struct tuple_traits<T0, null_type, null_type, null_type, null_type __TBB_NULL_TYPE_PACK > {
typedef cons<T0, null_type> U;
};
@@ -218,14 +216,14 @@ struct tuple_traits<null_type, null_type, null_type, null_type, null_type __TBB_
// core cons defs
-template <class HT, class TT>
+template <typename HT, typename TT>
struct cons{
typedef HT head_type;
typedef TT tail_type;
- HT head;
- TT tail;
+ head_type head;
+ tail_type tail;
static const int length = 1 + tail_type::length;
@@ -235,15 +233,15 @@ struct cons{
// non-default constructors
cons(head_type& h, const tail_type& t) : head(h), tail(t) { }
- template <class T0, class T1, class T2, class T3, class T4 __TBB_CLASS_T_PACK >
+ template <typename T0, typename T1, typename T2, typename T3, typename T4 __TBB_TYPENAME_T_PACK >
cons(const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4 __TBB_CONST_REF_T_PARAM_PACK) :
head(t0), tail(t1, t2, t3, t4 __TBB_T_PARAM_LIST_PACK, cnull()) { }
- template <class T0, class T1, class T2, class T3, class T4 __TBB_CLASS_T_PACK >
+ template <typename T0, typename T1, typename T2, typename T3, typename T4 __TBB_TYPENAME_T_PACK >
cons(T0& t0, T1& t1, T2& t2, T3& t3, T4& t4 __TBB_REF_T_PARAM_PACK) :
head(t0), tail(t1, t2, t3, t4 __TBB_T_PARAM_LIST_PACK , cnull()) { }
- template <class HT1, class TT1>
+ template <typename HT1, typename TT1>
cons(const cons<HT1,TT1>& other) : head(other.head), tail(other.tail) { }
cons& operator=(const cons& other) { head = other.head; tail = other.tail; return *this; }
@@ -259,58 +257,60 @@ struct cons{
friend bool operator>=(const cons& me, const cons& other) { return !(me<other); }
friend bool operator<=(const cons& me, const cons& other) { return !(me>other); }
- template<class HT1, class TT1>
+ template<typename HT1, typename TT1>
friend bool operator==(const cons<HT,TT>& me, const cons<HT1,TT1>& other) {
return me.head == other.head && me.tail == other.tail;
}
- template<class HT1, class TT1>
+ template<typename HT1, typename TT1>
friend bool operator<(const cons<HT,TT>& me, const cons<HT1,TT1>& other) {
return me.head < other.head || (!(other.head < me.head) && me.tail < other.tail);
}
- template<class HT1, class TT1>
+ template<typename HT1, typename TT1>
friend bool operator>(const cons<HT,TT>& me, const cons<HT1,TT1>& other) { return other<me; }
- template<class HT1, class TT1>
+ template<typename HT1, typename TT1>
friend bool operator!=(const cons<HT,TT>& me, const cons<HT1,TT1>& other) { return !(me==other); }
- template<class HT1, class TT1>
+ template<typename HT1, typename TT1>
friend bool operator>=(const cons<HT,TT>& me, const cons<HT1,TT1>& other) { return !(me<other); }
- template<class HT1, class TT1>
+ template<typename HT1, typename TT1>
friend bool operator<=(const cons<HT,TT>& me, const cons<HT1,TT1>& other) { return !(me>other); }
}; // cons
-template <class HT>
+template <typename HT>
struct cons<HT,null_type> {
typedef HT head_type;
typedef null_type tail_type;
- static const int length = 1;
+
head_type head;
+ static const int length = 1;
+
// default constructor
cons() : head() { /*std::cout << "default constructor 1\n";*/ }
cons(const null_type&, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head() { /*std::cout << "default constructor 2\n";*/ }
// non-default constructor
- template<class T1>
+ template<typename T1>
cons(T1& t1, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head(t1) { /*std::cout << "non-default a1, t1== " << t1 << "\n";*/}
cons(head_type& h, const null_type& = null_type() ) : head(h) { }
cons(const head_type& t0, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head(t0) { }
// converting constructor
- template<class HT1>
+ template<typename HT1>
cons(HT1 h1, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head(h1) { }
// copy constructor
- template<class HT1>
+ template<typename HT1>
cons( const cons<HT1, null_type>& other) : head(other.head) { }
// assignment operator
@@ -323,26 +323,26 @@ struct cons<HT,null_type> {
friend bool operator<=(const cons& me, const cons& other) {return !(me>other); }
friend bool operator>=(const cons& me, const cons& other) {return !(me<other); }
- template<class HT1>
+ template<typename HT1>
friend bool operator==(const cons<HT,null_type>& me, const cons<HT1,null_type>& other) {
return me.head == other.head;
}
- template<class HT1>
+ template<typename HT1>
friend bool operator<(const cons<HT,null_type>& me, const cons<HT1,null_type>& other) {
return me.head < other.head;
}
- template<class HT1>
+ template<typename HT1>
friend bool operator>(const cons<HT,null_type>& me, const cons<HT1,null_type>& other) { return other<me; }
- template<class HT1>
+ template<typename HT1>
friend bool operator!=(const cons<HT,null_type>& me, const cons<HT1,null_type>& other) { return !(me==other); }
- template<class HT1>
+ template<typename HT1>
friend bool operator<=(const cons<HT,null_type>& me, const cons<HT1,null_type>& other) { return !(me>other); }
- template<class HT1>
+ template<typename HT1>
friend bool operator>=(const cons<HT,null_type>& me, const cons<HT1,null_type>& other) { return !(me<other); }
}; // cons
@@ -351,16 +351,17 @@ template <>
struct cons<null_type,null_type> { typedef null_type tail_type; static const int length = 0; };
// wrapper for default constructor
-template<class T>
+template<typename T>
inline const T wrap_dcons(T*) { return T(); }
+
} // namespace internal
// tuple definition
-template<class T0, class T1, class T2, class T3, class T4 __TBB_CLASS_T_PACK >
+template<typename T0, typename T1, typename T2, typename T3, typename T4 __TBB_TYPENAME_T_PACK >
class tuple : public internal::tuple_traits<T0, T1, T2, T3, T4 __TBB_T_PACK >::U {
// friends
- template <class T> friend class tuple_size;
- template<int N, class T> friend struct tuple_element;
+ template <typename T> friend class tuple_size;
+ template<int N, typename T> friend struct tuple_element;
// stl components
typedef tuple<T0,T1,T2,T3,T4 __TBB_T_PACK > value_type;
@@ -371,8 +372,8 @@ class tuple : public internal::tuple_traits<T0, T1, T2, T3, T4 __TBB_T_PACK >::U
typedef size_t size_type;
typedef typename internal::tuple_traits<T0,T1,T2,T3, T4 __TBB_T_PACK >::U my_cons;
-public:
+public:
tuple(const T0& t0=internal::wrap_dcons((T0*)NULL)
,const T1& t1=internal::wrap_dcons((T1*)NULL)
,const T2& t2=internal::wrap_dcons((T2*)NULL)
@@ -394,7 +395,7 @@ public:
#endif
#endif
) :
- internal::tuple_traits<T0,T1,T2,T3,T4 __TBB_T_PACK >::U(t0,t1,t2,t3,t4 __TBB_T_PARAM_LIST_PACK) { }
+ my_cons(t0,t1,t2,t3,t4 __TBB_T_PARAM_LIST_PACK) { }
template<int N>
struct internal_tuple_element {
@@ -407,13 +408,13 @@ public:
template<int N>
typename internal_tuple_element<N>::type const& get() const { return internal::get_helper<N>::get(*this); }
- template<class U1, class U2>
+ template<typename U1, typename U2>
tuple& operator=(const internal::cons<U1,U2>& other) {
my_cons::operator=(other);
return *this;
}
- template<class U1, class U2>
+ template<typename U1, typename U2>
tuple& operator=(const std::pair<U1,U2>& other) {
// __TBB_ASSERT(tuple_size<value_type>::value == 2, "Invalid size for pair to tuple assignment");
this->head = other.first;
@@ -428,47 +429,16 @@ public:
friend bool operator>=(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)>=(other);}
friend bool operator<=(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)<=(other);}
- template<class U0, class U1, class U2, class U3, class U4 __TBB_CLASS_U_PACK >
- friend bool operator==(const tuple& me, const tuple<U0,U1,U2,U3,U4 __TBB_U_PACK >& other) {
- return static_cast<const my_cons &>(me)==(other);
- }
-
- template<class U0, class U1, class U2, class U3, class U4 __TBB_CLASS_U_PACK >
- friend bool operator<(const tuple& me, const tuple<U0,U1,U2,U3,U4 __TBB_U_PACK >& other) {
- return static_cast<const my_cons &>(me)<(other);
- }
-
- template<class U0, class U1, class U2, class U3, class U4 __TBB_CLASS_U_PACK >
- friend bool operator>(const tuple& me, const tuple<U0,U1,U2,U3,U4 __TBB_U_PACK >& other) {
- return static_cast<const my_cons &>(me)>(other);
- }
-
- template<class U0, class U1, class U2, class U3, class U4 __TBB_CLASS_U_PACK >
- friend bool operator!=(const tuple& me, const tuple<U0,U1,U2,U3,U4 __TBB_U_PACK >& other) {
- return static_cast<const my_cons &>(me)!=(other);
- }
-
- template<class U0, class U1, class U2, class U3, class U4 __TBB_CLASS_U_PACK >
- friend bool operator>=(const tuple& me, const tuple<U0,U1,U2,U3,U4 __TBB_U_PACK >& other) {
- return static_cast<const my_cons &>(me)>=(other);
- }
-
- template<class U0, class U1, class U2, class U3, class U4 __TBB_CLASS_U_PACK >
- friend bool operator<=(const tuple& me, const tuple<U0,U1,U2,U3,U4 __TBB_U_PACK >& other) {
- return static_cast<const my_cons &>(me)<=(other);
- }
-
}; // tuple
// empty tuple
template<>
class tuple<null_type, null_type, null_type, null_type, null_type __TBB_NULL_TYPE_PACK > : public null_type {
- typedef null_type inherited;
};
// helper classes
-template < class T>
+template < typename T>
class tuple_size {
public:
static const size_t value = 1 + tuple_size<typename T::tail_type>::value;
@@ -486,35 +456,37 @@ public:
static const size_t value = 0;
};
-template<int N, class T>
+template<int N, typename T>
struct tuple_element {
typedef typename internal::component<N, typename T::my_cons>::type type;
};
-template<int N, class T0, class T1, class T2, class T3, class T4 __TBB_CLASS_T_PACK >
+template<int N, typename T0, typename T1, typename T2, typename T3, typename T4 __TBB_TYPENAME_T_PACK >
inline static typename tuple_element<N,tuple<T0,T1,T2,T3,T4 __TBB_T_PACK > >::type&
- get(tuple<T0,T1,T2,T3,T4 __TBB_T_PACK >& t) { return t.get<N>(); }
+ get(tuple<T0,T1,T2,T3,T4 __TBB_T_PACK >& t) { return internal::get_helper<N>::get(t); }
-template<int N, class T0, class T1, class T2, class T3, class T4 __TBB_CLASS_T_PACK >
+template<int N, typename T0, typename T1, typename T2, typename T3, typename T4 __TBB_TYPENAME_T_PACK >
inline static typename tuple_element<N,tuple<T0,T1,T2,T3,T4 __TBB_T_PACK > >::type const&
- get(const tuple<T0,T1,T2,T3,T4 __TBB_T_PACK >& t) { return t.get<N>(); }
+ get(const tuple<T0,T1,T2,T3,T4 __TBB_T_PACK >& t) { return internal::get_helper<N>::get(t); }
} // interface5
} // tbb
-#if TBB_IMPLEMENT_CPP0X
-namespace std {
-using tbb::interface5::tuple;
-using tbb::interface5::tuple_size;
-using tbb::interface5::tuple_element;
-using tbb::interface5::get;
+#if !__TBB_CPP11_TUPLE_PRESENT
+namespace tbb {
+ namespace flow {
+ using tbb::interface5::tuple;
+ using tbb::interface5::tuple_size;
+ using tbb::interface5::tuple_element;
+ using tbb::interface5::get;
+ }
}
#endif
#undef __TBB_T_PACK
#undef __TBB_U_PACK
-#undef __TBB_CLASS_T_PACK
-#undef __TBB_CLASS_U_PACK
+#undef __TBB_TYPENAME_T_PACK
+#undef __TBB_TYPENAME_U_PACK
#undef __TBB_NULL_TYPE_PACK
#undef __TBB_REF_T_PARAM_PACK
#undef __TBB_CONST_REF_T_PARAM_PACK
diff --git a/include/tbb/concurrent_hash_map.h b/include/tbb/concurrent_hash_map.h
index d12ceb3..c130faf 100644
--- a/include/tbb/concurrent_hash_map.h
+++ b/include/tbb/concurrent_hash_map.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -76,6 +76,7 @@ namespace interface5 {
//! @cond INTERNAL
namespace internal {
+ using namespace tbb::internal;
//! Type of a hash code.
@@ -285,8 +286,9 @@ namespace interface5 {
if( sz >= mask ) { // TODO: add custom load_factor
segment_index_t new_seg = __TBB_Log2( mask+1 ); //optimized segment_index_of
__TBB_ASSERT( is_valid(my_table[new_seg-1]), "new allocations must not publish new mask until segment has allocated");
+ static const segment_ptr_t is_allocating = (segment_ptr_t)2;
if( !itt_hide_load_word(my_table[new_seg])
- && __TBB_CompareAndSwapW(&my_table[new_seg], 2, 0) == 0 )
+ && as_atomic(my_table[new_seg]).compare_and_swap(is_allocating, NULL) == NULL )
return new_seg; // The value must be processed
}
return 0;
@@ -596,7 +598,7 @@ protected:
return ptr;
}
// match placement-new form above to be called if exception thrown in constructor
- void operator delete( void *ptr, node_allocator_type &a ) {return a.deallocate(static_cast<node*>(ptr),1); }
+ void operator delete( void *ptr, node_allocator_type &a ) { a.deallocate(static_cast<node*>(ptr),1); }
};
void delete_node( node_base *n ) {
diff --git a/include/tbb/concurrent_lru_cache.h b/include/tbb/concurrent_lru_cache.h
index a251163..f6258d1 100644
--- a/include/tbb/concurrent_lru_cache.h
+++ b/include/tbb/concurrent_lru_cache.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -140,6 +140,11 @@ private:
}
private:
void operator=(handle_object&);
+#if __SUNPRO_CC
+ // Presumably due to a compiler error, private copy constructor
+ // breaks expressions like handle h = cache[key];
+ public:
+#endif
handle_object(handle_object &);
};
private:
diff --git a/include/tbb/concurrent_priority_queue.h b/include/tbb/concurrent_priority_queue.h
index 47f40cd..cc7668d 100644
--- a/include/tbb/concurrent_priority_queue.h
+++ b/include/tbb/concurrent_priority_queue.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/concurrent_queue.h b/include/tbb/concurrent_queue.h
index b2d495b..f8dbb80 100644
--- a/include/tbb/concurrent_queue.h
+++ b/include/tbb/concurrent_queue.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/concurrent_unordered_map.h b/include/tbb/concurrent_unordered_map.h
index 1f5272a..a226ac3 100644
--- a/include/tbb/concurrent_unordered_map.h
+++ b/include/tbb/concurrent_unordered_map.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -77,13 +77,16 @@ protected:
hash_compare my_hash_compare; // the comparator predicate for keys
};
-template <typename Key, typename T, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
-class concurrent_unordered_map : public internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
+template <typename Key, typename T, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>,
+ typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
+class concurrent_unordered_map :
+ public internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T,
+ internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
{
// Base type definitions
typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
- typedef internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> > base_type;
- typedef concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> traits_type;
+ typedef concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> traits_type;
+ typedef internal::concurrent_unordered_base< traits_type > base_type;
using traits_type::my_hash_compare;
#if __TBB_EXTRA_DEBUG
public:
@@ -117,9 +120,10 @@ public:
typedef typename base_type::const_iterator const_local_iterator;
// Construction/destruction/copying
- explicit concurrent_unordered_map(size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
- const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())
- : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
+ explicit concurrent_unordered_map(size_type n_of_buckets = 8,
+ const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),
+ const allocator_type& a = allocator_type())
+ : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)
{
}
@@ -128,9 +132,10 @@ public:
}
template <typename Iterator>
- concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
- const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())
- : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
+ concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8,
+ const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),
+ const allocator_type& a = allocator_type())
+ : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)
{
for (; first != last; ++first)
base_type::insert(*first);
@@ -219,9 +224,120 @@ public:
}
};
+template < typename Key, typename T, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>,
+ typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
+class concurrent_unordered_multimap :
+ public internal::concurrent_unordered_base< concurrent_unordered_map_traits< Key, T,
+ internal::hash_compare<Key, Hasher, Key_equality>, Allocator, true> >
+{
+ // Base type definitions
+ typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
+ typedef concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, true> traits_type;
+ typedef internal::concurrent_unordered_base< traits_type > base_type;
+ using traits_type::my_hash_compare;
+#if __TBB_EXTRA_DEBUG
+public:
+#endif
+ using traits_type::allow_multimapping;
+public:
+ using base_type::end;
+ using base_type::find;
+ using base_type::insert;
+
+ // Type definitions
+ typedef Key key_type;
+ typedef typename base_type::value_type value_type;
+ typedef T mapped_type;
+ typedef Hasher hasher;
+ typedef Key_equality key_equal;
+ typedef hash_compare key_compare;
+
+ typedef typename base_type::allocator_type allocator_type;
+ typedef typename base_type::pointer pointer;
+ typedef typename base_type::const_pointer const_pointer;
+ typedef typename base_type::reference reference;
+ typedef typename base_type::const_reference const_reference;
+
+ typedef typename base_type::size_type size_type;
+ typedef typename base_type::difference_type difference_type;
+
+ typedef typename base_type::iterator iterator;
+ typedef typename base_type::const_iterator const_iterator;
+ typedef typename base_type::iterator local_iterator;
+ typedef typename base_type::const_iterator const_local_iterator;
+
+ // Construction/destruction/copying
+ explicit concurrent_unordered_multimap(size_type n_of_buckets = 8,
+ const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),
+ const allocator_type& a = allocator_type())
+ : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)
+ {
+ }
+
+ concurrent_unordered_multimap(const Allocator& a) : base_type(8, key_compare(), a)
+ {
+ }
+
+ template <typename Iterator>
+ concurrent_unordered_multimap(Iterator first, Iterator last, size_type n_of_buckets = 8,
+ const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),
+ const allocator_type& a = allocator_type())
+ : base_type(n_of_buckets,key_compare(_Hasher,_Key_equality), a)
+ {
+ for (; first != last; ++first)
+ base_type::insert(*first);
+ }
+
+ concurrent_unordered_multimap(const concurrent_unordered_multimap& table) : base_type(table)
+ {
+ }
+
+ concurrent_unordered_multimap(const concurrent_unordered_multimap& table, const Allocator& a)
+ : base_type(table, a)
+ {
+ }
+
+ concurrent_unordered_multimap& operator=(const concurrent_unordered_multimap& table)
+ {
+ base_type::operator=(table);
+ return (*this);
+ }
+
+ iterator unsafe_erase(const_iterator where)
+ {
+ return base_type::unsafe_erase(where);
+ }
+
+ size_type unsafe_erase(const key_type& key)
+ {
+ return base_type::unsafe_erase(key);
+ }
+
+ iterator unsafe_erase(const_iterator first, const_iterator last)
+ {
+ return base_type::unsafe_erase(first, last);
+ }
+
+ void swap(concurrent_unordered_multimap& table)
+ {
+ base_type::swap(table);
+ }
+
+ // Observers
+ hasher hash_function() const
+ {
+ return my_hash_compare.my_hash_object;
+ }
+
+ key_equal key_eq() const
+ {
+ return my_hash_compare.my_key_compare_object;
+ }
+};
} // namespace interface5
using interface5::concurrent_unordered_map;
+using interface5::concurrent_unordered_multimap;
} // namespace tbb
diff --git a/include/tbb/concurrent_unordered_set.h b/include/tbb/concurrent_unordered_set.h
index acf550b..21494e0 100644
--- a/include/tbb/concurrent_unordered_set.h
+++ b/include/tbb/concurrent_unordered_set.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -168,9 +168,132 @@ public:
}
};
+template <typename Key, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>,
+ typename Allocator = tbb::tbb_allocator<Key> >
+class concurrent_unordered_multiset :
+ public internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key,
+ internal::hash_compare<Key, Hasher, Key_equality>, Allocator, true> >
+{
+public:
+ // Base type definitions
+ typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
+ typedef concurrent_unordered_set_traits<Key, hash_compare, Allocator, true> traits_type;
+ typedef internal::concurrent_unordered_base< traits_type > base_type;
+ using traits_type::allow_multimapping;
+ using traits_type::my_hash_compare;
+
+ // Type definitions
+ typedef Key key_type;
+ typedef typename base_type::value_type value_type;
+ typedef Key mapped_type;
+ typedef Hasher hasher;
+ typedef Key_equality key_equal;
+ typedef hash_compare key_compare;
+
+ typedef typename base_type::allocator_type allocator_type;
+ typedef typename base_type::pointer pointer;
+ typedef typename base_type::const_pointer const_pointer;
+ typedef typename base_type::reference reference;
+ typedef typename base_type::const_reference const_reference;
+
+ typedef typename base_type::size_type size_type;
+ typedef typename base_type::difference_type difference_type;
+
+ typedef typename base_type::iterator iterator;
+ typedef typename base_type::const_iterator const_iterator;
+ typedef typename base_type::iterator local_iterator;
+ typedef typename base_type::const_iterator const_local_iterator;
+
+ // Construction/destruction/copying
+ explicit concurrent_unordered_multiset(size_type n_of_buckets = 8,
+ const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),
+ const allocator_type& a = allocator_type())
+ : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)
+ {
+ }
+
+ concurrent_unordered_multiset(const Allocator& a) : base_type(8, key_compare(), a)
+ {
+ }
+
+ template <typename Iterator>
+ concurrent_unordered_multiset(Iterator first, Iterator last, size_type n_of_buckets = 8,
+ const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),
+ const allocator_type& a = allocator_type())
+ : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)
+ {
+ for (; first != last; ++first)
+ {
+ base_type::insert(*first);
+ }
+ }
+
+ concurrent_unordered_multiset(const concurrent_unordered_multiset& table) : base_type(table)
+ {
+ }
+
+ concurrent_unordered_multiset(const concurrent_unordered_multiset& table, const Allocator& a) : base_type(table, a)
+ {
+ }
+
+ concurrent_unordered_multiset& operator=(const concurrent_unordered_multiset& table)
+ {
+ base_type::operator=(table);
+ return (*this);
+ }
+
+ // Modifiers
+ std::pair<iterator, bool> insert(const value_type& value)
+ {
+ return base_type::insert(value);
+ }
+
+ iterator insert(const_iterator where, const value_type& value)
+ {
+ return base_type::insert(where, value);
+ }
+
+ template<class Iterator>
+ void insert(Iterator first, Iterator last)
+ {
+ base_type::insert(first, last);
+ }
+
+ iterator unsafe_erase(const_iterator where)
+ {
+ return base_type::unsafe_erase(where);
+ }
+
+ size_type unsafe_erase(const key_type& key)
+ {
+ return base_type::unsafe_erase(key);
+ }
+
+ iterator unsafe_erase(const_iterator first, const_iterator last)
+ {
+ return base_type::unsafe_erase(first, last);
+ }
+
+ void swap(concurrent_unordered_multiset& table)
+ {
+ base_type::swap(table);
+ }
+
+ // Observers
+ hasher hash_function() const
+ {
+ return my_hash_compare.my_hash_object;
+ }
+
+ key_equal key_eq() const
+ {
+ return my_hash_compare.my_key_compare_object;
+ }
+};
} // namespace interface5
using interface5::concurrent_unordered_set;
+using interface5::concurrent_unordered_multiset;
} // namespace tbb
diff --git a/include/tbb/concurrent_vector.h b/include/tbb/concurrent_vector.h
index 3692cf0..41cfbc7 100644
--- a/include/tbb/concurrent_vector.h
+++ b/include/tbb/concurrent_vector.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -62,6 +62,10 @@
#pragma warning( pop )
#endif
+#if __TBB_INITIALIZER_LISTS_PRESENT
+ #include <initializer_list>
+#endif
+
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)
// Workaround for overzealous compiler warnings in /Wp64 mode
#pragma warning (push)
@@ -73,6 +77,9 @@ namespace tbb {
template<typename T, class A = cache_aligned_allocator<T> >
class concurrent_vector;
+template<typename Container, typename Value>
+class vector_iterator;
+
//! @cond INTERNAL
namespace internal {
@@ -135,6 +142,10 @@ namespace internal {
}
__TBB_EXPORTED_METHOD ~concurrent_vector_base_v3();
+ //these helpers methods use the fact that segments are allocated so
+ //that every segment size is a (increasing) power of 2.
+ //with one exception 0 segment has size of 2 as well segment 1;
+ //e.g. size of segment with index of 3 is 2^3=8;
static segment_index_t segment_index_of( size_type index ) {
return segment_index_t( __TBB_Log2( index|1 ) );
}
@@ -153,6 +164,16 @@ namespace internal {
return segment_index_t(1)<<k; // fake value for k==0
}
+
+ static bool is_first_element_in_segment(size_type element_index){
+ //check if element_index is a power of 2 that is at least 2.
+ //The idea is to detect if the iterator crosses a segment boundary,
+ //and 2 is the minimal index for which it's true
+ __TBB_ASSERT(element_index, "there should be no need to call "
+ "is_first_element_in_segment for 0th element" );
+ return is_power_of_two_factor( element_index, 2 );
+ }
+
//! An operation on an n-element array starting at begin.
typedef void (__TBB_EXPORTED_FUNC *internal_array_op1)(void* begin, size_type n );
@@ -189,6 +210,10 @@ private:
//! Private functionality
class helper;
friend class helper;
+
+ template<typename Container, typename Value>
+ friend class vector_iterator;
+
};
typedef concurrent_vector_base_v3 concurrent_vector_base;
@@ -278,11 +303,12 @@ public: // workaround for MSVC
//! Pre increment
vector_iterator& operator++() {
- size_t k = ++my_index;
+ size_t element_index = ++my_index;
if( my_item ) {
- // Following test uses 2's-complement wizardry
- if( (k& (k-2))==0 ) {
- // k is a power of two that is at least k-2
+ //TODO: consider using of knowledge about "first_block optimization" here as well?
+ if( concurrent_vector_base::is_first_element_in_segment(element_index)) {
+ //if the iterator crosses a segment boundary, the pointer become invalid
+ //as possibly next segment is in another memory location
my_item= NULL;
} else {
++my_item;
@@ -294,11 +320,11 @@ public: // workaround for MSVC
//! Pre decrement
vector_iterator& operator--() {
__TBB_ASSERT( my_index>0, "operator--() applied to iterator already at beginning of concurrent_vector" );
- size_t k = my_index--;
+ size_t element_index = my_index--;
if( my_item ) {
- // Following test uses 2's-complement wizardry
- if( (k& (k-2))==0 ) {
- // k is a power of two that is at least k-2
+ if(concurrent_vector_base::is_first_element_in_segment(element_index)) {
+ //if the iterator crosses a segment boundary, the pointer become invalid
+ //as possibly next segment is in another memory location
my_item= NULL;
} else {
--my_item;
@@ -509,6 +535,23 @@ public:
vector_allocator_ptr = &internal_allocator;
}
+#if __TBB_INITIALIZER_LISTS_PRESENT
+ //! Constructor from initializer_list
+ concurrent_vector(std::initializer_list<T> init_list, const allocator_type &a = allocator_type())
+ : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+ {
+ vector_allocator_ptr = &internal_allocator;
+ __TBB_TRY {
+ internal_assign_iterators(init_list.begin(), init_list.end());
+ } __TBB_CATCH(...) {
+ segment_t *table = my_segment;
+ internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+ __TBB_RETHROW();
+ }
+
+ }
+#endif //# __TBB_INITIALIZER_LISTS_PRESENT
+
//! Copying constructor
concurrent_vector( const concurrent_vector& vector, const allocator_type& a = allocator_type() )
: internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
@@ -587,6 +630,8 @@ public:
return *this;
}
+ //TODO: add an template assignment operator? (i.e. with different element type)
+
//! Assignment for vector with different allocator type
template<class M>
concurrent_vector& operator=( const concurrent_vector<T, M>& vector ) {
@@ -596,9 +641,20 @@ public:
return *this;
}
+#if __TBB_INITIALIZER_LISTS_PRESENT
+ //! Assignment for initializer_list
+ concurrent_vector& operator=( const std::initializer_list<T> & init_list) {
+ internal_clear(&destroy_array);
+ internal_assign_iterators(init_list.begin(), init_list.end());
+ return *this;
+ }
+#endif //#if __TBB_INITIALIZER_LISTS_PRESENT
+
//------------------------------------------------------------------------
// Concurrent operations
//------------------------------------------------------------------------
+ //TODO: consider adding overload of grow_by accepting range of iterators: grow_by(iterator,iterator)
+ //TODO: consider adding overload of grow_by accepting initializer_list: grow_by(std::initializer_list<T>), as a analogy to std::vector::insert(initializer_list)
//! Grow by "delta" elements.
#if TBB_DEPRECATED
/** Returns old size. */
@@ -805,6 +861,13 @@ public:
clear(); internal_assign_range( first, last, static_cast<is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
}
+#if __TBB_INITIALIZER_LISTS_PRESENT
+ //! assigns an initializer list
+ void assign(std::initializer_list<T> init_list) {
+ clear(); internal_assign_iterators( init_list.begin(), init_list.end());
+ }
+#endif //# __TBB_INITIALIZER_LISTS_PRESENT
+
//! swap two instances
void swap(concurrent_vector &vector) {
if( this != &vector ) {
@@ -890,6 +953,7 @@ private:
void init(const void *src) { for(; i < n; ++i) new( &array[i] ) T(*static_cast<const T*>(src)); }
void copy(const void *src) { for(; i < n; ++i) new( &array[i] ) T(static_cast<const T*>(src)[i]); }
void assign(const void *src) { for(; i < n; ++i) array[i] = static_cast<const T*>(src)[i]; }
+ //TODO: rename to construct_range
template<class I> void iterate(I &src) { for(; i < n; ++i, ++src) new( &array[i] ) T( *src ); }
~internal_loop_guide() {
if(i < n) // if exception raised, do zeroing on the rest of items
diff --git a/include/tbb/critical_section.h b/include/tbb/critical_section.h
index f48db40..0522c4c 100644
--- a/include/tbb/critical_section.h
+++ b/include/tbb/critical_section.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -58,7 +58,7 @@ public:
critical_section_v4() {
#if _WIN32||_WIN64
- InitializeCriticalSection(&my_impl);
+ InitializeCriticalSectionEx( &my_impl, 4000, 0 );
#else
pthread_mutex_init(&my_impl, NULL);
#endif
diff --git a/include/tbb/enumerable_thread_specific.h b/include/tbb/enumerable_thread_specific.h
index eb989b5..92f306f 100644
--- a/include/tbb/enumerable_thread_specific.h
+++ b/include/tbb/enumerable_thread_specific.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -32,6 +32,7 @@
#include "concurrent_vector.h"
#include "tbb_thread.h"
#include "tbb_allocator.h"
+#include "tbb_profiling.h"
#include "cache_aligned_allocator.h"
#include "aligned_space.h"
#include <string.h> // for memcpy
@@ -48,9 +49,11 @@ namespace tbb {
enum ets_key_usage_type { ets_key_per_instance, ets_no_key };
namespace interface6 {
-
+
//! @cond
- namespace internal {
+ namespace internal {
+
+ using namespace tbb::internal;
template<ets_key_usage_type ETS_key_type>
class ets_base: tbb::internal::no_copy {
@@ -90,7 +93,7 @@ namespace interface6 {
#if __TBB_PROTECTED_NESTED_CLASS_BROKEN
protected:
#endif
-
+
static key_type key_of_current_thread() {
tbb::tbb_thread::id id = tbb::this_tbb_thread::get_id();
key_type k;
@@ -99,7 +102,7 @@ namespace interface6 {
}
//! Root of linked list of arrays of decreasing size.
- /** NULL if and only if my_count==0.
+ /** NULL if and only if my_count==0.
Each array in the list is half the size of its predecessor. */
atomic<array*> my_root;
atomic<size_t> my_count;
@@ -107,26 +110,28 @@ namespace interface6 {
virtual void* create_array(size_t _size) = 0; // _size in bytes
virtual void free_array(void* ptr, size_t _size) = 0; // _size in bytes
array* allocate( size_t lg_size ) {
- size_t n = 1<<lg_size;
+ size_t n = 1<<lg_size;
array* a = static_cast<array*>(create_array( sizeof(array)+n*sizeof(slot) ));
a->lg_size = lg_size;
std::memset( a+1, 0, n*sizeof(slot) );
return a;
}
void free(array* a) {
- size_t n = 1<<(a->lg_size);
+ size_t n = 1<<(a->lg_size);
free_array( (void *)a, size_t(sizeof(array)+n*sizeof(slot)) );
}
static size_t hash( key_type k ) {
// Multiplicative hashing. Client should use *upper* bits.
// casts required for Mac gcc4.* compiler
- return uintptr_t(k)*tbb::internal::size_t_select(0x9E3779B9,0x9E3779B97F4A7C15ULL);
- }
-
+ return uintptr_t(k)*tbb::internal::select_size_t_constant<0x9E3779B9,0x9E3779B97F4A7C15ULL>::value;
+ }
+
ets_base() {my_root=NULL; my_count=0;}
virtual ~ets_base(); // g++ complains if this is not virtual...
void* table_lookup( bool& exists );
void table_clear();
+ // table_find is used in copying ETS, so is not used in concurrent context. So
+ // we don't need itt annotations for it.
slot& table_find( key_type k ) {
size_t h = hash(k);
array* r = my_root;
@@ -162,15 +167,16 @@ namespace interface6 {
}
my_count = 0;
}
-
+
template<ets_key_usage_type ETS_key_type>
void* ets_base<ETS_key_type>::table_lookup( bool& exists ) {
- const key_type k = key_of_current_thread();
+ const key_type k = key_of_current_thread();
__TBB_ASSERT(k!=0,NULL);
void* found;
size_t h = hash(k);
for( array* r=my_root; r; r=r->next ) {
+ call_itt_notify(acquired,r);
size_t mask=r->mask();
for(size_t i = r->start(h); ;i=(i+1)&mask) {
slot& s = r->at(i);
@@ -189,20 +195,25 @@ namespace interface6 {
}
}
}
- // Key does not yet exist
+ // Key does not yet exist. The density of slots in the table does not exceed 0.5,
+ // for if this will occur a new table is allocated with double the current table
+ // size, which is swapped in as the new root table. So an empty slot is guaranteed.
exists = false;
found = create_local();
{
size_t c = ++my_count;
array* r = my_root;
+ call_itt_notify(acquired,r);
if( !r || c>r->size()/2 ) {
size_t s = r ? r->lg_size : 2;
while( c>size_t(1)<<(s-1) ) ++s;
array* a = allocate(s);
for(;;) {
- a->next = my_root;
+ a->next = r;
+ call_itt_notify(releasing,a);
array* new_r = my_root.compare_and_swap(a,r);
if( new_r==r ) break;
+ call_itt_notify(acquired, new_r);
if( new_r->lg_size>=s ) {
// Another thread inserted an equal or bigger array, so our array is superfluous.
free(a);
@@ -213,8 +224,11 @@ namespace interface6 {
}
}
insert:
- // Guaranteed to be room for it, and it is not present, so search for empty slot and grab it.
+ // Whether a slot has been found in an older table, or if it has been inserted at this level,
+ // it has already been accounted for in the total. Guaranteed to be room for it, and it is
+ // not present, so search for empty slot and use it.
array* ir = my_root;
+ call_itt_notify(acquired, ir);
size_t mask = ir->mask();
for(size_t i = ir->start(h);;i=(i+1)&mask) {
slot& s = ir->at(i);
@@ -227,16 +241,24 @@ namespace interface6 {
}
}
- //! Specialization that exploits native TLS
+ //! Specialization that exploits native TLS
template <>
class ets_base<ets_key_per_instance>: protected ets_base<ets_no_key> {
typedef ets_base<ets_no_key> super;
#if _WIN32||_WIN64
+#if __TBB_WIN8UI_SUPPORT
+ typedef DWORD tls_key_t;
+ void create_key() { my_key = FlsAlloc(NULL); }
+ void destroy_key() { FlsFree(my_key); }
+ void set_tls(void * value) { FlsSetValue(my_key, (LPVOID)value); }
+ void* get_tls() { return (void *)FlsGetValue(my_key); }
+#else
typedef DWORD tls_key_t;
void create_key() { my_key = TlsAlloc(); }
void destroy_key() { TlsFree(my_key); }
void set_tls(void * value) { TlsSetValue(my_key, (LPVOID)value); }
void* get_tls() { return (void *)TlsGetValue(my_key); }
+#endif
#else
typedef pthread_key_t tls_key_t;
void create_key() { pthread_key_create(&my_key, NULL); }
@@ -259,79 +281,79 @@ namespace interface6 {
found = super::table_lookup(exists);
set_tls(found);
}
- return found;
+ return found;
}
void table_clear() {
destroy_key();
- create_key();
+ create_key();
super::table_clear();
}
};
//! Random access iterator for traversing the thread local copies.
template< typename Container, typename Value >
- class enumerable_thread_specific_iterator
-#if defined(_WIN64) && defined(_MSC_VER)
+ class enumerable_thread_specific_iterator
+#if defined(_WIN64) && defined(_MSC_VER)
// Ensure that Microsoft's internal template function _Val_type works correctly.
: public std::iterator<std::random_access_iterator_tag,Value>
#endif /* defined(_WIN64) && defined(_MSC_VER) */
{
- //! current position in the concurrent_vector
-
+ //! current position in the concurrent_vector
+
Container *my_container;
typename Container::size_type my_index;
mutable Value *my_value;
-
+
template<typename C, typename T>
- friend enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,
+ friend enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,
const enumerable_thread_specific_iterator<C,T>& v );
-
+
template<typename C, typename T, typename U>
- friend bool operator==( const enumerable_thread_specific_iterator<C,T>& i,
+ friend bool operator==( const enumerable_thread_specific_iterator<C,T>& i,
const enumerable_thread_specific_iterator<C,U>& j );
-
+
template<typename C, typename T, typename U>
- friend bool operator<( const enumerable_thread_specific_iterator<C,T>& i,
+ friend bool operator<( const enumerable_thread_specific_iterator<C,T>& i,
const enumerable_thread_specific_iterator<C,U>& j );
-
+
template<typename C, typename T, typename U>
friend ptrdiff_t operator-( const enumerable_thread_specific_iterator<C,T>& i, const enumerable_thread_specific_iterator<C,U>& j );
-
- template<typename C, typename U>
+
+ template<typename C, typename U>
friend class enumerable_thread_specific_iterator;
-
+
public:
-
- enumerable_thread_specific_iterator( const Container &container, typename Container::size_type index ) :
+
+ enumerable_thread_specific_iterator( const Container &container, typename Container::size_type index ) :
my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
-
+
//! Default constructor
enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
-
+
template<typename U>
enumerable_thread_specific_iterator( const enumerable_thread_specific_iterator<Container, U>& other ) :
my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
-
+
enumerable_thread_specific_iterator operator+( ptrdiff_t offset ) const {
return enumerable_thread_specific_iterator(*my_container, my_index + offset);
}
-
+
enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
my_index += offset;
my_value = NULL;
return *this;
}
-
+
enumerable_thread_specific_iterator operator-( ptrdiff_t offset ) const {
return enumerable_thread_specific_iterator( *my_container, my_index-offset );
}
-
+
enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
my_index -= offset;
my_value = NULL;
return *this;
}
-
+
Value& operator*() const {
Value* value = my_value;
if( !value ) {
@@ -340,25 +362,25 @@ namespace interface6 {
__TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), "corrupt cache" );
return *value;
}
-
+
Value& operator[]( ptrdiff_t k ) const {
return (*my_container)[my_index + k].value;
}
-
+
Value* operator->() const {return &operator*();}
-
+
enumerable_thread_specific_iterator& operator++() {
++my_index;
my_value = NULL;
return *this;
}
-
+
enumerable_thread_specific_iterator& operator--() {
--my_index;
my_value = NULL;
return *this;
}
-
+
//! Post increment
enumerable_thread_specific_iterator operator++(int) {
enumerable_thread_specific_iterator result = *this;
@@ -366,7 +388,7 @@ namespace interface6 {
my_value = NULL;
return result;
}
-
+
//! Post decrement
enumerable_thread_specific_iterator operator--(int) {
enumerable_thread_specific_iterator result = *this;
@@ -374,7 +396,7 @@ namespace interface6 {
my_value = NULL;
return result;
}
-
+
// STL support
typedef ptrdiff_t difference_type;
typedef Value value_type;
@@ -382,51 +404,51 @@ namespace interface6 {
typedef Value& reference;
typedef std::random_access_iterator_tag iterator_category;
};
-
+
template<typename Container, typename T>
- enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,
+ enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,
const enumerable_thread_specific_iterator<Container,T>& v ) {
return enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
}
-
+
template<typename Container, typename T, typename U>
- bool operator==( const enumerable_thread_specific_iterator<Container,T>& i,
+ bool operator==( const enumerable_thread_specific_iterator<Container,T>& i,
const enumerable_thread_specific_iterator<Container,U>& j ) {
return i.my_index==j.my_index && i.my_container == j.my_container;
}
-
+
template<typename Container, typename T, typename U>
- bool operator!=( const enumerable_thread_specific_iterator<Container,T>& i,
+ bool operator!=( const enumerable_thread_specific_iterator<Container,T>& i,
const enumerable_thread_specific_iterator<Container,U>& j ) {
return !(i==j);
}
-
+
template<typename Container, typename T, typename U>
- bool operator<( const enumerable_thread_specific_iterator<Container,T>& i,
+ bool operator<( const enumerable_thread_specific_iterator<Container,T>& i,
const enumerable_thread_specific_iterator<Container,U>& j ) {
return i.my_index<j.my_index;
}
-
+
template<typename Container, typename T, typename U>
- bool operator>( const enumerable_thread_specific_iterator<Container,T>& i,
+ bool operator>( const enumerable_thread_specific_iterator<Container,T>& i,
const enumerable_thread_specific_iterator<Container,U>& j ) {
return j<i;
}
-
+
template<typename Container, typename T, typename U>
- bool operator>=( const enumerable_thread_specific_iterator<Container,T>& i,
+ bool operator>=( const enumerable_thread_specific_iterator<Container,T>& i,
const enumerable_thread_specific_iterator<Container,U>& j ) {
return !(i<j);
}
-
+
template<typename Container, typename T, typename U>
- bool operator<=( const enumerable_thread_specific_iterator<Container,T>& i,
+ bool operator<=( const enumerable_thread_specific_iterator<Container,T>& i,
const enumerable_thread_specific_iterator<Container,U>& j ) {
return !(j<i);
}
-
+
template<typename Container, typename T, typename U>
- ptrdiff_t operator-( const enumerable_thread_specific_iterator<Container,T>& i,
+ ptrdiff_t operator-( const enumerable_thread_specific_iterator<Container,T>& i,
const enumerable_thread_specific_iterator<Container,U>& j ) {
return i.my_index-j.my_index;
}
@@ -442,15 +464,15 @@ namespace interface6 {
template<typename C, typename T, typename U>
friend bool operator!=(const segmented_iterator<C,T>& i, const segmented_iterator<C,U>& j);
-
- template<typename C, typename U>
+
+ template<typename C, typename U>
friend class segmented_iterator;
public:
segmented_iterator() {my_segcont = NULL;}
- segmented_iterator( const SegmentedContainer& _segmented_container ) :
+ segmented_iterator( const SegmentedContainer& _segmented_container ) :
my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
outer_iter(my_segcont->end()) { }
@@ -555,7 +577,7 @@ namespace interface6 {
}; // segmented_iterator
template<typename SegmentedContainer, typename T, typename U>
- bool operator==( const segmented_iterator<SegmentedContainer,T>& i,
+ bool operator==( const segmented_iterator<SegmentedContainer,T>& i,
const segmented_iterator<SegmentedContainer,U>& j ) {
if(i.my_segcont != j.my_segcont) return false;
if(i.my_segcont == NULL) return true;
@@ -566,7 +588,7 @@ namespace interface6 {
// !=
template<typename SegmentedContainer, typename T, typename U>
- bool operator!=( const segmented_iterator<SegmentedContainer,T>& i,
+ bool operator!=( const segmented_iterator<SegmentedContainer,T>& i,
const segmented_iterator<SegmentedContainer,U>& j ) {
return !(i==j);
}
@@ -629,7 +651,7 @@ namespace interface6 {
/*override*/ void construct(void* where) {
Constructor::construct(where);
- }
+ }
public:
template<typename X>
static callback_base<T>* make( const X& x ) {
@@ -663,25 +685,25 @@ namespace interface6 {
- enumerable_thread_specific containers may be copy-constructed or assigned.
- thread-local copies can be managed by hash-table, or can be accessed via TLS storage for speed.
- outside of parallel contexts, the contents of all thread-local copies are accessible by iterator or using combine or combine_each methods
-
+
@par Segmented iterator
When the thread-local objects are containers with input_iterators defined, a segmented iterator may
be used to iterate over all the elements of all thread-local copies.
@par combine and combine_each
- - Both methods are defined for enumerable_thread_specific.
- - combine() requires the the type T have operator=() defined.
- - neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)
+ - Both methods are defined for enumerable_thread_specific.
+ - combine() requires the the type T have operator=() defined.
+ - neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)
- Both are evaluated in serial context (the methods are assumed to be non-benign.)
-
+
@ingroup containers */
- template <typename T,
- typename Allocator=cache_aligned_allocator<T>,
- ets_key_usage_type ETS_key_type=ets_no_key >
- class enumerable_thread_specific: internal::ets_base<ETS_key_type> {
+ template <typename T,
+ typename Allocator=cache_aligned_allocator<T>,
+ ets_key_usage_type ETS_key_type=ets_no_key >
+ class enumerable_thread_specific: internal::ets_base<ETS_key_type> {
template<typename U, typename A, ets_key_usage_type C> friend class enumerable_thread_specific;
-
+
typedef internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
//! A generic range, used to create range objects from the iterators
@@ -693,19 +715,19 @@ namespace interface6 {
typedef const T& const_reference;
typedef I iterator;
typedef ptrdiff_t difference_type;
- generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : blocked_range<I>(begin_,end_,grainsize_) {}
+ generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : blocked_range<I>(begin_,end_,grainsize_) {}
template<typename U>
- generic_range_type( const generic_range_type<U>& r) : blocked_range<I>(r.begin(),r.end(),r.grainsize()) {}
+ generic_range_type( const generic_range_type<U>& r) : blocked_range<I>(r.begin(),r.end(),r.grainsize()) {}
generic_range_type( generic_range_type& r, split ) : blocked_range<I>(r,split()) {}
};
-
+
typedef typename Allocator::template rebind< padded_element >::other padded_allocator_type;
typedef tbb::concurrent_vector< padded_element, padded_allocator_type > internal_collection_type;
-
+
internal::callback_base<T> *my_construct_callback;
internal_collection_type my_locals;
-
+
/*override*/ void* create_local() {
#if TBB_DEPRECATED
void* lref = &my_locals[my_locals.push_back(padded_element())];
@@ -714,7 +736,7 @@ namespace interface6 {
#endif
my_construct_callback->construct(lref);
return lref;
- }
+ }
void unconstruct_locals() {
for(typename internal_collection_type::iterator cvi = my_locals.begin(); cvi != my_locals.end(); ++cvi) {
@@ -734,9 +756,9 @@ namespace interface6 {
size_t nelements = (_size + sizeof(uintptr_t) -1) / sizeof(uintptr_t);
array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
}
-
+
public:
-
+
//! Basic types
typedef Allocator allocator_type;
typedef T value_type;
@@ -746,7 +768,7 @@ namespace interface6 {
typedef const T* const_pointer;
typedef typename internal_collection_type::size_type size_type;
typedef typename internal_collection_type::difference_type difference_type;
-
+
// Iterator types
typedef typename internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
typedef typename internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type > const_iterator;
@@ -754,30 +776,30 @@ namespace interface6 {
// Parallel range types
typedef generic_range_type< iterator > range_type;
typedef generic_range_type< const_iterator > const_range_type;
-
+
//! Default constructor. Each local instance of T is default constructed.
- enumerable_thread_specific() :
- my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(/*dummy argument*/0) )
+ enumerable_thread_specific() :
+ my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(/*dummy argument*/0) )
{}
//! Constructor with initializer functor. Each local instance of T is constructed by T(finit()).
template <typename Finit>
- enumerable_thread_specific( Finit finit ) :
- my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) )
+ enumerable_thread_specific( Finit finit ) :
+ my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) )
{}
-
- //! Constuctor with exemplar. Each local instance of T is copied-constructed from the exemplar.
- enumerable_thread_specific(const T& exemplar) :
+
+ //! Constructor with exemplar. Each local instance of T is copied-constructed from the exemplar.
+ enumerable_thread_specific(const T& exemplar) :
my_construct_callback( internal::callback_leaf<T,internal::construct_by_exemplar<T> >::make( exemplar ) )
{}
-
+
//! Destructor
- ~enumerable_thread_specific() {
+ ~enumerable_thread_specific() {
my_construct_callback->destroy();
this->clear(); // deallocation before the derived class is finished destructing
// So free(array *) is still accessible
}
-
+
//! returns reference to local, discarding exists
reference local() {
bool exists;
@@ -792,24 +814,24 @@ namespace interface6 {
//! Get the number of local copies
size_type size() const { return my_locals.size(); }
-
+
//! true if there have been no local copies created
bool empty() const { return my_locals.empty(); }
-
+
//! begin iterator
iterator begin() { return iterator( my_locals, 0 ); }
//! end iterator
iterator end() { return iterator(my_locals, my_locals.size() ); }
-
+
//! begin const iterator
const_iterator begin() const { return const_iterator(my_locals, 0); }
-
+
//! end const iterator
const_iterator end() const { return const_iterator(my_locals, my_locals.size()); }
//! Get range for parallel algorithms
- range_type range( size_t grainsize=1 ) { return range_type( begin(), end(), grainsize ); }
-
+ range_type range( size_t grainsize=1 ) { return range_type( begin(), end(), grainsize ); }
+
//! Get const range for parallel algorithms
const_range_type range( size_t grainsize=1 ) const { return const_range_type( begin(), end(), grainsize ); }
@@ -846,7 +868,7 @@ namespace interface6 {
enumerable_thread_specific &
internal_assign(const enumerable_thread_specific<U, A2, C2>& other) {
if(static_cast<void *>( this ) != static_cast<const void *>( &other )) {
- this->clear();
+ this->clear();
my_construct_callback->destroy();
my_construct_callback = 0;
internal_copy( other );
@@ -877,7 +899,7 @@ namespace interface6 {
}
const_iterator ci = begin();
T my_result = *ci;
- while(++ci != end())
+ while(++ci != end())
my_result = f_combine( my_result, *ci );
return my_result;
}
@@ -892,7 +914,7 @@ namespace interface6 {
}; // enumerable_thread_specific
- template <typename T, typename Allocator, ets_key_usage_type ETS_key_type>
+ template <typename T, typename Allocator, ets_key_usage_type ETS_key_type>
template<typename U, typename A2, ets_key_usage_type C2>
void enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( const enumerable_thread_specific<U, A2, C2>& other) {
// Initialize my_construct_callback first, so that it is valid even if rest of this routine throws an exception.
@@ -906,7 +928,7 @@ namespace interface6 {
base::slot& s1 = r->at(i);
if( !s1.empty() ) {
base::slot& s2 = this->table_find(s1.key);
- if( s2.empty() ) {
+ if( s2.empty() ) {
#if TBB_DEPRECATED
void* lref = &my_locals[my_locals.push_back(padded_element())];
#else
@@ -916,7 +938,7 @@ namespace interface6 {
s2.key = s1.key;
} else {
// Skip the duplicate
- }
+ }
}
}
}
@@ -943,10 +965,10 @@ namespace interface6 {
typedef typename internal::segmented_iterator<Container, value_type> iterator;
typedef typename internal::segmented_iterator<Container, const value_type> const_iterator;
- flattened2d( const Container &c, typename Container::const_iterator b, typename Container::const_iterator e ) :
+ flattened2d( const Container &c, typename Container::const_iterator b, typename Container::const_iterator e ) :
my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
- flattened2d( const Container &c ) :
+ flattened2d( const Container &c ) :
my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
iterator begin() { return iterator(*my_container) = my_begin; }
diff --git a/include/tbb/flow_graph.h b/include/tbb/flow_graph.h
index 0b725a3..4a68e24 100644
--- a/include/tbb/flow_graph.h
+++ b/include/tbb/flow_graph.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -40,11 +40,18 @@
#include "internal/_aggregator_impl.h"
// use the VC10 or gcc version of tuple if it is available.
-#if TBB_IMPLEMENT_CPP0X && (!defined(_MSC_VER) || _MSC_VER < 1600)
-#define TBB_PREVIEW_TUPLE 1
-#include "compat/tuple"
+#if __TBB_CPP11_TUPLE_PRESENT
+ #include <tuple>
+namespace tbb {
+ namespace flow {
+ using std::tuple;
+ using std::tuple_size;
+ using std::tuple_element;
+ using std::get;
+ }
+}
#else
-#include <tuple>
+ #include "compat/tuple"
#endif
#include<list>
@@ -68,6 +75,12 @@ enum concurrency { unlimited = 0, serial = 1 };
namespace interface6 {
+namespace internal {
+ template<typename T, typename M> class successor_cache;
+ template<typename T, typename M> class broadcast_cache;
+ template<typename T, typename M> class round_robin_cache;
+}
+
//! An empty class used for messages that mean "I'm done"
class continue_msg {};
@@ -106,6 +119,27 @@ public:
virtual bool try_consume( ) { return false; }
};
+template< typename T > class limiter_node; // needed for resetting decrementer
+template< typename R, typename B > class run_and_put_task;
+
+static tbb::task * const SUCCESSFULLY_ENQUEUED = (task *)-1;
+
+// enqueue left task if necessary. Returns the non-enqueued task if there is one.
+static inline tbb::task *combine_tasks( tbb::task * left, tbb::task * right) {
+ // if no RHS task, don't change left.
+ if(right == NULL) return left;
+ // right != NULL
+ if(left == NULL) return right;
+ if(left == SUCCESSFULLY_ENQUEUED) return right;
+ // left contains a task
+ if(right != SUCCESSFULLY_ENQUEUED) {
+ // both are valid tasks
+ tbb::task::enqueue(*left);
+ return right;
+ }
+ return left;
+}
+
//! Pure virtual template class that defines a receiver of messages of type T
template< typename T >
class receiver {
@@ -120,13 +154,35 @@ public:
virtual ~receiver() {}
//! Put an item to the receiver
- virtual bool try_put( const T& t ) = 0;
+ bool try_put( const T& t ) {
+ task *res = try_put_task(t);
+ if(!res) return false;
+ if (res != SUCCESSFULLY_ENQUEUED) task::enqueue(*res);
+ return true;
+ }
+
+ //! put item to successor; return task to run the successor if possible.
+protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ virtual task *try_put_task(const T& t) = 0;
+public:
//! Add a predecessor to the node
virtual bool register_predecessor( predecessor_type & ) { return false; }
//! Remove a predecessor from the node
virtual bool remove_predecessor( predecessor_type & ) { return false; }
+
+protected:
+ //! put receiver back in initial state
+ template<typename U> friend class limiter_node;
+ virtual void reset_receiver() = 0;
+
+ template<typename TT, typename M>
+ friend class internal::successor_cache;
+ virtual bool is_continue_receiver() { return false; }
};
//! Base class for receivers of completion messages
@@ -172,31 +228,42 @@ public:
return true;
}
- //! Puts a continue_msg to the receiver
- /** If the message causes the message count to reach the predecessor count, execute() is called and
- the message count is reset to 0. Otherwise the message count is incremented. */
- /* override */ bool try_put( const input_type & ) {
+protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ // execute body is supposed to be too small to create a task for.
+ /* override */ task *try_put_task( const input_type & ) {
{
spin_mutex::scoped_lock l(my_mutex);
if ( ++my_current_count < my_predecessor_count )
- return true;
+ return SUCCESSFULLY_ENQUEUED;
else
my_current_count = 0;
}
- execute();
- return true;
+ task * res = execute();
+ if(!res) return SUCCESSFULLY_ENQUEUED;
+ return res;
}
-protected:
spin_mutex my_mutex;
int my_predecessor_count;
int my_current_count;
int my_initial_predecessor_count;
+ // the friend declaration in the base class did not eliminate the "protected class"
+ // error in gcc 4.1.2
+ template<typename U> friend class limiter_node;
+ /*override*/void reset_receiver() {
+ my_current_count = 0;
+ }
//! Does whatever should happen when the threshold is reached
/** This should be very fast or else spawn a task. This is
called while the sender is blocked in the try_put(). */
- virtual void execute() = 0;
+ virtual task * execute() = 0;
+ template<typename TT, typename M>
+ friend class internal::successor_cache;
+ /*override*/ bool is_continue_receiver() { return true; }
};
#include "internal/_flow_graph_impl.h"
@@ -294,8 +361,9 @@ class graph : tbb::internal::no_copy {
public:
run_and_put_task( Receiver &r, Body& body ) : my_receiver(r), my_body(body) {}
task *execute() {
- my_receiver.try_put( my_body() );
- return NULL;
+ task *res = my_receiver.try_put_task( my_body() );
+ if(res == SUCCESSFULLY_ENQUEUED) res = NULL;
+ return res;
}
private:
Receiver &my_receiver;
@@ -387,6 +455,7 @@ public:
throw;
}
#endif
+ my_context->reset(); // consistent with behavior in catch()
my_root_task->set_ref_count(1);
}
}
@@ -422,6 +491,9 @@ public:
bool is_cancelled() { return cancelled; }
bool exception_thrown() { return caught_exception; }
+ // un-thread-safe state reset.
+ void reset();
+
private:
task *my_root_task;
task_group_context *my_context;
@@ -476,6 +548,9 @@ public:
virtual ~graph_node() {
my_graph.remove_node(this);
}
+
+protected:
+ virtual void reset() = 0;
};
inline void graph::register_node(graph_node *n) {
@@ -501,11 +576,25 @@ inline void graph::remove_node(graph_node *n) {
n->prev = n->next = NULL;
}
+inline void graph::reset() {
+ // reset context
+ if(my_context) my_context->reset();
+ cancelled = false;
+ caught_exception = false;
+ // reset all the nodes comprising the graph
+ for(iterator ii = begin(); ii != end(); ++ii) {
+ graph_node *my_p = &(*ii);
+ my_p->reset();
+ }
+}
+
+
#include "internal/_flow_graph_node_impl.h"
//! An executable node that acts as a source, i.e. it has no predecessors
template < typename Output >
class source_node : public graph_node, public sender< Output > {
+protected:
using graph_node::my_graph;
public:
//! The type of the output message, which is complete
@@ -562,10 +651,12 @@ public:
if ( my_has_cached_item ) {
v = my_cached_item;
my_has_cached_item = false;
- } else if ( (*my_body)(v) == false ) {
- return false;
+ return true;
}
- return true;
+ // we've been asked to provide an item, but we have none. enqueue a task to
+ // provide one.
+ spawn_put();
+ return false;
}
//! Reserves an item.
@@ -575,9 +666,6 @@ public:
return false;
}
- if ( !my_has_cached_item && (*my_body)(my_cached_item) )
- my_has_cached_item = true;
-
if ( my_has_cached_item ) {
v = my_cached_item;
my_reserved = true;
@@ -618,6 +706,23 @@ public:
spawn_put();
}
+ template<typename Body>
+ Body copy_function_object() {
+ internal::source_body<output_type> &body_ref = *this->my_body;
+ return dynamic_cast< internal::source_body_leaf<output_type, Body> & >(body_ref).get_body();
+ }
+
+protected:
+
+ //! resets the node to its initial state
+ void reset() {
+ my_active = init_my_active;
+ my_reserved =false;
+ if(my_has_cached_item) {
+ my_has_cached_item = false;
+ }
+ }
+
private:
task *my_root_task;
spin_mutex my_mutex;
@@ -629,30 +734,49 @@ private:
bool my_has_cached_item;
output_type my_cached_item;
- friend class internal::source_task< source_node< output_type > >;
+ // used by apply_body, can invoke body of node.
+ bool try_reserve_apply_body(output_type &v) {
+ spin_mutex::scoped_lock lock(my_mutex);
+ if ( my_reserved ) {
+ return false;
+ }
+ if ( !my_has_cached_item && (*my_body)(my_cached_item) )
+ my_has_cached_item = true;
+ if ( my_has_cached_item ) {
+ v = my_cached_item;
+ my_reserved = true;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ //! Spawns a task that applies the body
+ /* override */ void spawn_put( ) {
+ task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
+ internal:: source_task_bypass < source_node< output_type > >( *this ) );
+ }
- //! Applies the body
- /* override */ void apply_body( ) {
+ friend class internal::source_task_bypass< source_node< output_type > >;
+ //! Applies the body. Returning SUCCESSFULLY_ENQUEUED okay; forward_task_bypass will handle it.
+ /* override */ task * apply_body_bypass( ) {
output_type v;
- if ( try_reserve(v) == false )
- return;
+ if ( !try_reserve_apply_body(v) )
+ return NULL;
- if ( my_successors.try_put( v ) )
+ task *last_task = my_successors.try_put_task(v);
+ if ( last_task )
try_consume();
else
try_release();
+ return last_task;
}
-
- //! Spawns a task that applies the body
- /* override */ void spawn_put( ) {
- task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
- internal::source_task< source_node< output_type > >( *this ) );
- }
-};
+}; // source_node
//! Implements a function node that supports Input -> Output
template < typename Input, typename Output = continue_msg, graph_buffer_policy = queueing, typename Allocator=cache_aligned_allocator<Input> >
class function_node : public graph_node, public internal::function_input<Input,Output,Allocator>, public internal::function_output<Output> {
+protected:
using graph_node::my_graph;
public:
typedef Input input_type;
@@ -674,15 +798,22 @@ public:
fOutput_type()
{}
- bool try_put(const input_type &i) { return fInput_type::try_put(i); }
-
protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ using fInput_type::try_put_task;
+
+ // override of graph_node's reset.
+ /*override*/void reset() {fInput_type::reset_function_input(); }
+
/* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }
};
//! Implements a function node that supports Input -> Output
template < typename Input, typename Output, typename Allocator >
class function_node<Input,Output,queueing,Allocator> : public graph_node, public internal::function_input<Input,Output,Allocator>, public internal::function_output<Output> {
+protected:
using graph_node::my_graph;
public:
typedef Input input_type;
@@ -704,9 +835,14 @@ public:
graph_node(src.my_graph), fInput_type( src, new queue_type() ), fOutput_type()
{}
- bool try_put(const input_type &i) { return fInput_type::try_put(i); }
-
protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ using fInput_type::try_put_task;
+
+ /*override*/void reset() { fInput_type::reset_function_input(); }
+
/* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }
};
@@ -721,18 +857,19 @@ class multifunction_node :
<
Input,
typename internal::wrap_tuple_elements<
- std::tuple_size<Output>::value, // #elements in tuple
- internal::function_output, // wrap this around each element
+ tbb::flow::tuple_size<Output>::value, // #elements in tuple
+ internal::multifunction_output, // wrap this around each element
Output // the tuple providing the types
>::type,
Allocator
> {
+protected:
using graph_node::my_graph;
private:
- static const int N = std::tuple_size<Output>::value;
+ static const int N = tbb::flow::tuple_size<Output>::value;
public:
typedef Input input_type;
- typedef typename internal::wrap_tuple_elements<N,internal::function_output, Output>::type output_ports_type;
+ typedef typename internal::wrap_tuple_elements<N,internal::multifunction_output, Output>::type output_ports_type;
private:
typedef typename internal::multifunction_input<input_type, output_ports_type, Allocator> base_type;
typedef typename internal::function_input_queue<input_type,Allocator> queue_type;
@@ -745,16 +882,19 @@ public:
graph_node(other.my_graph), base_type(other)
{}
// all the guts are in multifunction_input...
+protected:
+ /*override*/void reset() { base_type::reset(); }
}; // multifunction_node
template < typename Input, typename Output, typename Allocator >
class multifunction_node<Input,Output,queueing,Allocator> : public graph_node, public internal::multifunction_input<Input,
- typename internal::wrap_tuple_elements<std::tuple_size<Output>::value, internal::function_output, Output>::type, Allocator> {
+ typename internal::wrap_tuple_elements<tbb::flow::tuple_size<Output>::value, internal::multifunction_output, Output>::type, Allocator> {
+protected:
using graph_node::my_graph;
- static const int N = std::tuple_size<Output>::value;
+ static const int N = tbb::flow::tuple_size<Output>::value;
public:
typedef Input input_type;
- typedef typename internal::wrap_tuple_elements<N, internal::function_output, Output>::type output_ports_type;
+ typedef typename internal::wrap_tuple_elements<N, internal::multifunction_output, Output>::type output_ports_type;
private:
typedef typename internal::multifunction_input<input_type, output_ports_type, Allocator> base_type;
typedef typename internal::function_input_queue<input_type,Allocator> queue_type;
@@ -766,6 +906,9 @@ public:
multifunction_node( const multifunction_node &other) :
graph_node(other.my_graph), base_type(other, new queue_type())
{}
+ // all the guts are in multifunction_input...
+protected:
+ /*override*/void reset() { base_type::reset(); }
}; // multifunction_node
//! split_node: accepts a tuple as input, forwards each element of the tuple to its
@@ -773,7 +916,7 @@ public:
// "rejecting" it does not reject inputs.
template<typename TupleType, typename Allocator=cache_aligned_allocator<TupleType> >
class split_node : public multifunction_node<TupleType, TupleType, rejecting, Allocator> {
- static const int N = std::tuple_size<TupleType>::value;
+ static const int N = tbb::flow::tuple_size<TupleType>::value;
typedef multifunction_node<TupleType,TupleType,rejecting,Allocator> base_type;
public:
typedef typename base_type::output_ports_type output_ports_type;
@@ -793,12 +936,14 @@ public:
//! Implements an executable node that supports continue_msg -> Output
template <typename Output>
class continue_node : public graph_node, public internal::continue_input<Output>, public internal::function_output<Output> {
+protected:
using graph_node::my_graph;
public:
typedef continue_msg input_type;
typedef Output output_type;
typedef sender< input_type > predecessor_type;
typedef receiver< output_type > successor_type;
+ typedef internal::continue_input<Output> fInput_type;
typedef internal::function_output<output_type> fOutput_type;
//! Constructor for executable node with continue_msg -> Output
@@ -819,14 +964,20 @@ public:
internal::function_output<Output>()
{}
- bool try_put(const input_type &i) { return internal::continue_input<Output>::try_put(i); }
-
protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ using fInput_type::try_put_task;
+
+ /*override*/void reset() { internal::continue_input<Output>::reset_receiver(); }
+
/* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }
};
template< typename T >
class overwrite_node : public graph_node, public receiver<T>, public sender<T> {
+protected:
using graph_node::my_graph;
public:
typedef T input_type;
@@ -852,7 +1003,7 @@ public:
if ( my_buffer_is_valid ) {
// We have a valid value that must be forwarded immediately.
if ( s.try_put( my_buffer ) || !s.register_predecessor( *this ) ) {
- // We add the successor: it accepted our put or it rejected it but won't let use become a predecessor
+ // We add the successor: it accepted our put or it rejected it but won't let us become a predecessor
my_successors.register_successor( s );
return true;
} else {
@@ -872,14 +1023,6 @@ public:
return true;
}
- /* override */ bool try_put( const T &v ) {
- spin_mutex::scoped_lock l( my_mutex );
- my_buffer = v;
- my_buffer_is_valid = true;
- my_successors.try_put(v);
- return true;
- }
-
/* override */ bool try_get( T &v ) {
spin_mutex::scoped_lock l( my_mutex );
if ( my_buffer_is_valid ) {
@@ -901,10 +1044,25 @@ public:
}
protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ /* override */ task * try_put_task( const T &v ) {
+ spin_mutex::scoped_lock l( my_mutex );
+ my_buffer = v;
+ my_buffer_is_valid = true;
+ task * rtask = my_successors.try_put_task(v);
+ if(!rtask) rtask = SUCCESSFULLY_ENQUEUED;
+ return rtask;
+ }
+
+ /*override*/void reset() { my_buffer_is_valid = false; }
+
spin_mutex my_mutex;
internal::broadcast_cache< T, null_rw_mutex > my_successors;
T my_buffer;
bool my_buffer_is_valid;
+ /*override*/void reset_receiver() {}
};
template< typename T >
@@ -921,15 +1079,20 @@ public:
//! Copy constructor: call base class copy constructor
write_once_node( const write_once_node& src ) : overwrite_node<T>(src) {}
- /* override */ bool try_put( const T &v ) {
+protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ /* override */ task *try_put_task( const T &v ) {
spin_mutex::scoped_lock l( this->my_mutex );
if ( this->my_buffer_is_valid ) {
- return false;
+ return NULL;
} else {
this->my_buffer = v;
this->my_buffer_is_valid = true;
- this->my_successors.try_put(v);
- return true;
+ task *res = this->my_successors.try_put_task(v);
+ if(!res) res = SUCCESSFULLY_ENQUEUED;
+ return res;
}
}
};
@@ -937,7 +1100,9 @@ public:
//! Forwards messages of type T to all successors
template <typename T>
class broadcast_node : public graph_node, public receiver<T>, public sender<T> {
+protected:
using graph_node::my_graph;
+private:
internal::broadcast_cache<T> my_successors;
public:
typedef T input_type;
@@ -968,17 +1133,27 @@ public:
return true;
}
- /* override */ bool try_put( const T &t ) {
- my_successors.try_put(t);
- return true;
+protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ //! build a task to run the successor if possible. Default is old behavior.
+ /*override*/ task *try_put_task(const T& t) {
+ task *new_task = my_successors.try_put_task(t);
+ if(!new_task) new_task = SUCCESSFULLY_ENQUEUED;
+ return new_task;
}
-};
+
+ /*override*/void reset() {}
+ /*override*/void reset_receiver() {}
+}; // broadcast_node
#include "internal/_flow_graph_item_buffer_impl.h"
//! Forwards messages in arbitrary order
template <typename T, typename A=cache_aligned_allocator<T> >
class buffer_node : public graph_node, public reservable_item_buffer<T, A>, public receiver<T>, public sender<T> {
+protected:
using graph_node::my_graph;
public:
typedef T input_type;
@@ -992,9 +1167,9 @@ protected:
task *my_parent;
- friend class internal::forward_task< buffer_node< T, A > >;
+ friend class internal::forward_task_bypass< buffer_node< T, A > >;
- enum op_type {reg_succ, rem_succ, req_item, res_item, rel_res, con_res, put_item, try_fwd};
+ enum op_type {reg_succ, rem_succ, req_item, res_item, rel_res, con_res, put_item, try_fwd_task };
enum op_stat {WAIT=0, SUCCEEDED, FAILED};
// implements the aggregator_operation concept
@@ -1002,10 +1177,10 @@ protected:
public:
char type;
T *elem;
+ task * ltask;
successor_type *r;
- buffer_operation(const T& e, op_type t) :
- type(char(t)), elem(const_cast<T*>(&e)), r(NULL) {}
- buffer_operation(op_type t) : type(char(t)), r(NULL) {}
+ buffer_operation(const T& e, op_type t) : type(char(t)), elem(const_cast<T*>(&e)) , ltask(NULL) , r(NULL) {}
+ buffer_operation(op_type t) : type(char(t)) , ltask(NULL) , r(NULL) {}
};
bool forwarder_busy;
@@ -1014,7 +1189,7 @@ protected:
internal::aggregator< my_handler, buffer_operation> my_aggregator;
virtual void handle_operations(buffer_operation *op_list) {
- buffer_operation *tmp;
+ buffer_operation *tmp = NULL;
bool try_forwarding=false;
while (op_list) {
tmp = op_list;
@@ -1027,22 +1202,46 @@ protected:
case rel_res: internal_release(tmp); try_forwarding = true; break;
case con_res: internal_consume(tmp); try_forwarding = true; break;
case put_item: internal_push(tmp); try_forwarding = true; break;
- case try_fwd: internal_forward(tmp); break;
+ case try_fwd_task: internal_forward_task(tmp); break;
}
}
if (try_forwarding && !forwarder_busy) {
forwarder_busy = true;
- task::enqueue(*new(task::allocate_additional_child_of(*my_parent)) internal::forward_task< buffer_node<input_type, A> >(*this));
+ task *new_task = new(task::allocate_additional_child_of(*my_parent)) internal::
+ forward_task_bypass
+ < buffer_node<input_type, A> >(*this);
+ // tmp should point to the last item handled by the aggregator. This is the operation
+ // the handling thread enqueued. So modifying that record will be okay.
+ tbb::task *z = tmp->ltask;
+ tmp->ltask = combine_tasks(z, new_task); // in case the op generated a task
+ }
+ }
+
+ inline task *grab_forwarding_task( buffer_operation &op_data) {
+ return op_data.ltask;
+ }
+
+ inline bool enqueue_forwarding_task(buffer_operation &op_data) {
+ task *ft = grab_forwarding_task(op_data);
+ if(ft) {
+ task::enqueue(*ft);
+ return true;
}
+ return false;
}
//! This is executed by an enqueued task, the "forwarder"
- virtual void forward() {
- buffer_operation op_data(try_fwd);
+ virtual task *forward_task() {
+ buffer_operation op_data(try_fwd_task);
+ task *last_task = NULL;
do {
op_data.status = WAIT;
+ op_data.ltask = NULL;
my_aggregator.execute(&op_data);
+ tbb::task *xtask = op_data.ltask;
+ last_task = combine_tasks(last_task, xtask);
} while (op_data.status == SUCCEEDED);
+ return last_task;
}
//! Register successor
@@ -1058,22 +1257,30 @@ protected:
}
//! Tries to forward valid items to successors
- virtual void internal_forward(buffer_operation *op) {
+ virtual void internal_forward_task(buffer_operation *op) {
+ if (this->my_reserved || !this->item_valid(this->my_tail-1)) {
+ __TBB_store_with_release(op->status, FAILED);
+ this->forwarder_busy = false;
+ return;
+ }
T i_copy;
- bool success = false; // flagged when a successor accepts
+ task * last_task = NULL;
size_type counter = my_successors.size();
// Try forwarding, giving each successor a chance
while (counter>0 && !this->buffer_empty() && this->item_valid(this->my_tail-1)) {
this->fetch_back(i_copy);
- if( my_successors.try_put(i_copy) ) {
+ task *new_task = my_successors.try_put_task(i_copy);
+ last_task = combine_tasks(last_task, new_task);
+ if(new_task) {
this->invalidate_back();
--(this->my_tail);
- success = true; // found an accepting successor
}
--counter;
}
- if (success && !counter)
+ op->ltask = last_task; // return task
+ if (last_task && !counter) {
__TBB_store_with_release(op->status, SUCCEEDED);
+ }
else {
__TBB_store_with_release(op->status, FAILED);
forwarder_busy = false;
@@ -1142,6 +1349,7 @@ public:
buffer_operation op_data(reg_succ);
op_data.r = &r;
my_aggregator.execute(&op_data);
+ (void)enqueue_forwarding_task(op_data);
return true;
}
@@ -1153,6 +1361,10 @@ public:
buffer_operation op_data(rem_succ);
op_data.r = &r;
my_aggregator.execute(&op_data);
+ // even though this operation does not cause a forward, if we are the handler, and
+ // a forward is scheduled, we may be the first to reach this point after the aggregator,
+ // and so should check for the task.
+ (void)enqueue_forwarding_task(op_data);
return true;
}
@@ -1163,6 +1375,7 @@ public:
buffer_operation op_data(req_item);
op_data.elem = &v;
my_aggregator.execute(&op_data);
+ (void)enqueue_forwarding_task(op_data);
return (op_data.status==SUCCEEDED);
}
@@ -1173,6 +1386,7 @@ public:
buffer_operation op_data(res_item);
op_data.elem = &v;
my_aggregator.execute(&op_data);
+ (void)enqueue_forwarding_task(op_data);
return (op_data.status==SUCCEEDED);
}
@@ -1181,6 +1395,7 @@ public:
/* override */ bool try_release() {
buffer_operation op_data(rel_res);
my_aggregator.execute(&op_data);
+ (void)enqueue_forwarding_task(op_data);
return true;
}
@@ -1189,17 +1404,36 @@ public:
/* override */ bool try_consume() {
buffer_operation op_data(con_res);
my_aggregator.execute(&op_data);
+ (void)enqueue_forwarding_task(op_data);
return true;
}
- //! Receive an item
- /** true is always returned */
- /* override */ bool try_put(const T &t) {
+protected:
+
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ //! receive an item, return a task *if possible
+ /* override */ task *try_put_task(const T &t) {
buffer_operation op_data(t, put_item);
my_aggregator.execute(&op_data);
- return true;
+ task *ft = grab_forwarding_task(op_data);
+ if(!ft) {
+ ft = SUCCESSFULLY_ENQUEUED;
+ }
+ return ft;
+ }
+
+ /*override*/void reset() {
+ reservable_item_buffer<T, A>::reset();
+ forwarder_busy = false;
}
-};
+
+ /*override*/void reset_receiver() {
+ // nothing to do; no predecesor_cache
+ }
+
+}; // buffer_node
//! Forwards messages in FIFO order
template <typename T, typename A=cache_aligned_allocator<T> >
@@ -1210,27 +1444,28 @@ protected:
enum op_stat {WAIT=0, SUCCEEDED, FAILED};
- //! Tries to forward valid items to successors
- /* override */ void internal_forward(queue_operation *op) {
- T i_copy;
- bool success = false; // flagged when a successor accepts
- size_type counter = this->my_successors.size();
+ /* override */ void internal_forward_task(queue_operation *op) {
if (this->my_reserved || !this->item_valid(this->my_head)) {
__TBB_store_with_release(op->status, FAILED);
this->forwarder_busy = false;
return;
}
+ T i_copy;
+ task *last_task = NULL;
+ size_type counter = this->my_successors.size();
// Keep trying to send items while there is at least one accepting successor
while (counter>0 && this->item_valid(this->my_head)) {
this->fetch_front(i_copy);
- if(this->my_successors.try_put(i_copy)) {
- this->invalidate_front();
- ++(this->my_head);
- success = true; // found an accepting successor
+ task *new_task = this->my_successors.try_put_task(i_copy);
+ if(new_task) {
+ this->invalidate_front();
+ ++(this->my_head);
+ last_task = combine_tasks(last_task, new_task);
}
--counter;
}
- if (success && !counter)
+ op->ltask = last_task;
+ if (last_task && !counter)
__TBB_store_with_release(op->status, SUCCEEDED);
else {
__TBB_store_with_release(op->status, FAILED);
@@ -1322,6 +1557,7 @@ class priority_queue_node : public buffer_node<T, A> {
public:
typedef T input_type;
typedef T output_type;
+ typedef buffer_node<T,A> base_type;
typedef sender< input_type > predecessor_type;
typedef receiver< output_type > successor_type;
@@ -1332,6 +1568,12 @@ public:
priority_queue_node( const priority_queue_node &src ) : buffer_node<T, A>(src), mark(0) {}
protected:
+
+ /*override*/void reset() {
+ mark = 0;
+ base_type::reset();
+ }
+
typedef typename buffer_node<T, A>::size_type size_type;
typedef typename buffer_node<T, A>::item_type item_type;
typedef typename buffer_node<T, A>::buffer_operation prio_operation;
@@ -1339,7 +1581,7 @@ protected:
enum op_stat {WAIT=0, SUCCEEDED, FAILED};
/* override */ void handle_operations(prio_operation *op_list) {
- prio_operation *tmp /*, *pop_list*/ ;
+ prio_operation *tmp = op_list /*, *pop_list*/ ;
bool try_forwarding=false;
while (op_list) {
tmp = op_list;
@@ -1348,7 +1590,7 @@ protected:
case buffer_node<T, A>::reg_succ: this->internal_reg_succ(tmp); try_forwarding = true; break;
case buffer_node<T, A>::rem_succ: this->internal_rem_succ(tmp); break;
case buffer_node<T, A>::put_item: internal_push(tmp); try_forwarding = true; break;
- case buffer_node<T, A>::try_fwd: internal_forward(tmp); break;
+ case buffer_node<T, A>::try_fwd_task: internal_forward_task(tmp); break;
case buffer_node<T, A>::rel_res: internal_release(tmp); try_forwarding = true; break;
case buffer_node<T, A>::con_res: internal_consume(tmp); try_forwarding = true; break;
case buffer_node<T, A>::req_item: internal_pop(tmp); break;
@@ -1359,14 +1601,20 @@ protected:
if (mark<this->my_tail) heapify();
if (try_forwarding && !this->forwarder_busy) {
this->forwarder_busy = true;
- task::enqueue(*new(task::allocate_additional_child_of(*(this->my_parent))) internal::forward_task< buffer_node<input_type, A> >(*this));
+ task *new_task = new(task::allocate_additional_child_of(*(this->my_parent))) internal::
+ forward_task_bypass
+ < buffer_node<input_type, A> >(*this);
+ // tmp should point to the last item handled by the aggregator. This is the operation
+ // the handling thread enqueued. So modifying that record will be okay.
+ tbb::task *tmp1 = tmp->ltask;
+ tmp->ltask = combine_tasks(tmp1, new_task);
}
}
//! Tries to forward valid items to successors
- /* override */ void internal_forward(prio_operation *op) {
+ /* override */ void internal_forward_task(prio_operation *op) {
T i_copy;
- bool success = false; // flagged when a successor accepts
+ task * last_task = NULL; // flagged when a successor accepts
size_type counter = this->my_successors.size();
if (this->my_reserved || this->my_tail == 0) {
@@ -1377,18 +1625,19 @@ protected:
// Keep trying to send while there exists an accepting successor
while (counter>0 && this->my_tail > 0) {
i_copy = this->my_array[0].first;
- bool msg = this->my_successors.try_put(i_copy);
- if ( msg == true ) {
+ task * new_task = this->my_successors.try_put_task(i_copy);
+ last_task = combine_tasks(last_task, new_task);
+ if ( new_task ) {
if (mark == this->my_tail) --mark;
--(this->my_tail);
this->my_array[0].first=this->my_array[this->my_tail].first;
if (this->my_tail > 1) // don't reheap for heap of size 1
reheap();
- success = true; // found an accepting successor
}
--counter;
}
- if (success && !counter)
+ op->ltask = last_task;
+ if (last_task && !counter)
__TBB_store_with_release(op->status, SUCCEEDED);
else {
__TBB_store_with_release(op->status, FAILED);
@@ -1403,6 +1652,7 @@ protected:
++(this->my_tail);
__TBB_store_with_release(op->status, SUCCEEDED);
}
+
/* override */ void internal_pop(prio_operation *op) {
if ( this->my_reserved == true || this->my_tail == 0 ) {
__TBB_store_with_release(op->status, FAILED);
@@ -1503,6 +1753,7 @@ private:
message is dropped. */
template< typename T >
class limiter_node : public graph_node, public receiver< T >, public sender< T > {
+protected:
using graph_node::my_graph;
public:
typedef T input_type;
@@ -1519,23 +1770,29 @@ private:
internal::broadcast_cache< T > my_successors;
int init_decrement_predecessors;
- friend class internal::forward_task< limiter_node<T> >;
+ friend class internal::forward_task_bypass< limiter_node<T> >;
// Let decrementer call decrement_counter()
friend class internal::decrementer< limiter_node<T> >;
- void decrement_counter() {
+ // only returns a valid task pointer or NULL, never SUCCESSFULLY_ENQUEUED
+ task * decrement_counter() {
input_type v;
+ task *rval = NULL;
// If we can't get / put an item immediately then drop the count
if ( my_predecessors.get_item( v ) == false
- || my_successors.try_put(v) == false ) {
+ || (rval = my_successors.try_put_task(v)) == NULL ) {
spin_mutex::scoped_lock lock(my_mutex);
--my_count;
- if ( !my_predecessors.empty() )
- task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
- internal::forward_task< limiter_node<T> >( *this ) );
+ if ( !my_predecessors.empty() ) {
+ task *rtask = new ( task::allocate_additional_child_of( *my_root_task ) )
+ internal::forward_task_bypass< limiter_node<T> >( *this );
+ __TBB_ASSERT(!rval, "Have two tasks to handle");
+ return rtask;
+ }
}
+ return rval;
}
void forward() {
@@ -1546,7 +1803,17 @@ private:
else
return;
}
- decrement_counter();
+ task * rtask = decrement_counter();
+ if(rtask) task::enqueue(*rtask);
+ }
+
+ task *forward_task() {
+ spin_mutex::scoped_lock lock(my_mutex);
+ if ( my_count >= my_threshold )
+ return NULL;
+ ++my_count;
+ task * rtask = decrement_counter();
+ return rtask;
}
public:
@@ -1590,45 +1857,61 @@ public:
return true;
}
+ //! Removes src from the list of cached predecessors.
+ /* override */ bool register_predecessor( predecessor_type &src ) {
+ spin_mutex::scoped_lock lock(my_mutex);
+ my_predecessors.add( src );
+ if ( my_count < my_threshold && !my_successors.empty() ) {
+ task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
+ internal::
+ forward_task_bypass
+ < limiter_node<T> >( *this ) );
+ }
+ return true;
+ }
+
+ //! Removes src from the list of cached predecessors.
+ /* override */ bool remove_predecessor( predecessor_type &src ) {
+ my_predecessors.remove( src );
+ return true;
+ }
+
+protected:
+
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
//! Puts an item to this receiver
- /* override */ bool try_put( const T &t ) {
+ /* override */ task *try_put_task( const T &t ) {
{
spin_mutex::scoped_lock lock(my_mutex);
if ( my_count >= my_threshold )
- return false;
+ return NULL;
else
++my_count;
}
- bool msg = my_successors.try_put(t);
+ task * rtask = my_successors.try_put_task(t);
- if ( msg != true ) {
+ if ( !rtask ) { // try_put_task failed.
spin_mutex::scoped_lock lock(my_mutex);
--my_count;
- if ( !my_predecessors.empty() )
- task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
- internal::forward_task< limiter_node<T> >( *this ) );
+ if ( !my_predecessors.empty() ) {
+ rtask = new ( task::allocate_additional_child_of( *my_root_task ) )
+ internal::forward_task_bypass< limiter_node<T> >( *this );
+ }
}
-
- return msg;
+ return rtask;
}
- //! Removes src from the list of cached predecessors.
- /* override */ bool register_predecessor( predecessor_type &src ) {
- spin_mutex::scoped_lock lock(my_mutex);
- my_predecessors.add( src );
- if ( my_count < my_threshold && !my_successors.empty() )
- task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
- internal::forward_task< limiter_node<T> >( *this ) );
- return true;
+ /*override*/void reset() {
+ my_count = 0;
+ my_predecessors.reset();
+ decrement.reset_receiver();
}
- //! Removes src from the list of cached predecessors.
- /* override */ bool remove_predecessor( predecessor_type &src ) {
- my_predecessors.remove( src );
- return true;
- }
-};
+ /*override*/void reset_receiver() { my_predecessors.reset(); }
+}; // limiter_node
#include "internal/_flow_graph_join_impl.h"
@@ -1642,9 +1925,9 @@ using internal::NO_TAG;
template<typename OutputTuple, graph_buffer_policy JP=queueing> class join_node;
template<typename OutputTuple>
-class join_node<OutputTuple,reserving>: public internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, reserving_port, OutputTuple, reserving> {
+class join_node<OutputTuple,reserving>: public internal::unfolded_join_node<tbb::flow::tuple_size<OutputTuple>::value, reserving_port, OutputTuple, reserving> {
private:
- static const int N = std::tuple_size<OutputTuple>::value;
+ static const int N = tbb::flow::tuple_size<OutputTuple>::value;
typedef typename internal::unfolded_join_node<N, reserving_port, OutputTuple, reserving> unfolded_type;
public:
typedef OutputTuple output_type;
@@ -1654,9 +1937,9 @@ public:
};
template<typename OutputTuple>
-class join_node<OutputTuple,queueing>: public internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, queueing_port, OutputTuple, queueing> {
+class join_node<OutputTuple,queueing>: public internal::unfolded_join_node<tbb::flow::tuple_size<OutputTuple>::value, queueing_port, OutputTuple, queueing> {
private:
- static const int N = std::tuple_size<OutputTuple>::value;
+ static const int N = tbb::flow::tuple_size<OutputTuple>::value;
typedef typename internal::unfolded_join_node<N, queueing_port, OutputTuple, queueing> unfolded_type;
public:
typedef OutputTuple output_type;
@@ -1667,10 +1950,10 @@ public:
// template for tag_matching join_node
template<typename OutputTuple>
-class join_node<OutputTuple, tag_matching> : public internal::unfolded_join_node<std::tuple_size<OutputTuple>::value,
+class join_node<OutputTuple, tag_matching> : public internal::unfolded_join_node<tbb::flow::tuple_size<OutputTuple>::value,
tag_matching_port, OutputTuple, tag_matching> {
private:
- static const int N = std::tuple_size<OutputTuple>::value;
+ static const int N = tbb::flow::tuple_size<OutputTuple>::value;
typedef typename internal::unfolded_join_node<N, tag_matching_port, OutputTuple, tag_matching> unfolded_type;
public:
typedef OutputTuple output_type;
@@ -1713,7 +1996,7 @@ public:
template<typename InputTuple>
class or_node : public internal::unfolded_or_node<InputTuple> {
private:
- static const int N = std::tuple_size<InputTuple>::value;
+ static const int N = tbb::flow::tuple_size<InputTuple>::value;
public:
typedef typename internal::or_output_type<InputTuple>::type output_type;
typedef typename internal::unfolded_or_node<InputTuple> unfolded_type;
diff --git a/include/tbb/index.html b/include/tbb/index.html
index b8af0cc..cc52c04 100644
--- a/include/tbb/index.html
+++ b/include/tbb/index.html
@@ -19,7 +19,7 @@ Include files for Intel® Threading Building Blocks classes and functions.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/include/tbb/internal/_aggregator_impl.h b/include/tbb/internal/_aggregator_impl.h
index 1c4a8b2..a0dcbad 100644
--- a/include/tbb/internal/_aggregator_impl.h
+++ b/include/tbb/internal/_aggregator_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/internal/_concurrent_queue_impl.h b/include/tbb/internal/_concurrent_queue_impl.h
index b9d56e6..8058102 100644
--- a/include/tbb/internal/_concurrent_queue_impl.h
+++ b/include/tbb/internal/_concurrent_queue_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -230,7 +230,7 @@ template<typename T>
void micro_queue<T>::push( const void* item, ticket k, concurrent_queue_base_v3<T>& base ) {
k &= -concurrent_queue_rep_base::n_queue;
page* p = NULL;
- size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+ size_t index = modulo_power_of_two( k/concurrent_queue_rep_base::n_queue, base.my_rep->items_per_page);
if( !index ) {
__TBB_TRY {
concurrent_queue_page_allocator& pa = base;
@@ -280,7 +280,7 @@ bool micro_queue<T>::pop( void* dst, ticket k, concurrent_queue_base_v3<T>& base
call_itt_notify(acquired, &tail_counter);
page& p = *head_page;
__TBB_ASSERT( &p, NULL );
- size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+ size_t index = modulo_power_of_two( k/concurrent_queue_rep_base::n_queue, base.my_rep->items_per_page );
bool success = false;
{
micro_queue_pop_finalizer<T> finalizer( *this, base, k+concurrent_queue_rep_base::n_queue, index==base.my_rep->items_per_page-1 ? &p : NULL );
@@ -305,7 +305,7 @@ micro_queue<T>& micro_queue<T>::assign( const micro_queue<T>& src, concurrent_qu
ticket g_index = head_counter;
__TBB_TRY {
size_t n_items = (tail_counter-head_counter)/concurrent_queue_rep_base::n_queue;
- size_t index = head_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+ size_t index = modulo_power_of_two( head_counter/concurrent_queue_rep_base::n_queue, base.my_rep->items_per_page );
size_t end_in_first_page = (index+n_items<base.my_rep->items_per_page)?(index+n_items):base.my_rep->items_per_page;
head_page = make_copy( base, srcp, index, end_in_first_page, g_index );
@@ -318,7 +318,7 @@ micro_queue<T>& micro_queue<T>::assign( const micro_queue<T>& src, concurrent_qu
}
__TBB_ASSERT( srcp==src.tail_page, NULL );
- size_t last_index = tail_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+ size_t last_index = modulo_power_of_two( tail_counter/concurrent_queue_rep_base::n_queue, base.my_rep->items_per_page );
if( last_index==0 ) last_index = base.my_rep->items_per_page;
cur_page->next = make_copy( base, srcp, 0, last_index, g_index );
@@ -631,7 +631,7 @@ bool concurrent_queue_iterator_rep<T>::get_item( T*& item, size_t k ) {
} else {
typename concurrent_queue_base_v3<T>::page* p = array[concurrent_queue_rep<T>::index(k)];
__TBB_ASSERT(p,NULL);
- size_t i = k/concurrent_queue_rep<T>::n_queue & (my_queue.my_rep->items_per_page-1);
+ size_t i = modulo_power_of_two( k/concurrent_queue_rep<T>::n_queue, my_queue.my_rep->items_per_page );
item = µ_queue<T>::get_ref(*p,i);
return (p->mask & uintptr_t(1)<<i)!=0;
}
@@ -716,7 +716,7 @@ void concurrent_queue_iterator_base_v3<Value>::advance() {
my_rep->get_item(tmp,k);
__TBB_ASSERT( my_item==tmp, NULL );
#endif /* TBB_USE_ASSERT */
- size_t i = k/concurrent_queue_rep<Value>::n_queue & (queue.my_rep->items_per_page-1);
+ size_t i = modulo_power_of_two( k/concurrent_queue_rep<Value>::n_queue, queue.my_rep->items_per_page );
if( i==queue.my_rep->items_per_page-1 ) {
typename concurrent_queue_base_v3<Value>::page*& root = my_rep->array[concurrent_queue_rep<Value>::index(k)];
root = root->next;
diff --git a/include/tbb/internal/_concurrent_unordered_impl.h b/include/tbb/internal/_concurrent_unordered_impl.h
index 460d5f6..b6aeb7d 100644
--- a/include/tbb/internal/_concurrent_unordered_impl.h
+++ b/include/tbb/internal/_concurrent_unordered_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -45,7 +45,7 @@
#include <iterator>
#include <utility> // Need std::pair
-#include <functional>
+#include <functional> // Need std::equal_to (in ../concurrent_unordered_*.h)
#include <string> // For tbb_hasher
#include <cstring> // Need std::memset
@@ -56,6 +56,7 @@
#include "../atomic.h"
#include "../tbb_exception.h"
#include "../tbb_allocator.h"
+#include "tbb/atomic.h"
namespace tbb {
namespace interface5 {
@@ -189,6 +190,7 @@ bool operator!=( const solist_iterator<Solist,T>& i, const solist_iterator<Solis
// Forward type and class definitions
typedef size_t sokey_t;
+
// Forward list in which elements are sorted in a split-order
template <typename T, typename Allocator>
class split_ordered_list
@@ -215,6 +217,10 @@ public:
// Node that holds the element in a split-ordered list
struct node : tbb::internal::no_assign
{
+ private:
+ // for compilers that try to generate default constructors though they are not needed.
+ node(); // VS 2008, 2010, 2012
+ public:
// Initialize the node with the given order key
void init(sokey_t order_key) {
my_order_key = order_key;
@@ -230,7 +236,7 @@ public:
nodeptr_t atomic_set_next(nodeptr_t new_node, nodeptr_t current_node)
{
// Try to change the next pointer on the current element to a new element, only if it still points to the cached next
- nodeptr_t exchange_node = (nodeptr_t) __TBB_CompareAndSwapW((void *) &my_next, (uintptr_t)new_node, (uintptr_t)current_node);
+ nodeptr_t exchange_node = tbb::internal::as_atomic(my_next).compare_and_swap(new_node, current_node);
if (exchange_node == current_node) // TODO: why this branch?
{
@@ -274,15 +280,7 @@ public:
// Allocate a new node with the given order key; used to allocate dummy nodes
nodeptr_t create_node(sokey_t order_key) {
nodeptr_t pnode = my_node_allocator.allocate(1);
-
- __TBB_TRY {
- new(static_cast<void*>(&pnode->my_element)) T();
- pnode->init(order_key);
- } __TBB_CATCH(...) {
- my_node_allocator.deallocate(pnode, 1);
- __TBB_RETHROW();
- }
-
+ pnode->init(order_key);
return (pnode);
}
@@ -383,8 +381,8 @@ public:
return;
}
- std::swap(my_element_count, other.my_element_count);
- std::swap(my_head, other.my_head);
+ std::swap(my_element_count, other.my_element_count);
+ std::swap(my_head, other.my_head);
}
// Split-order list functions
@@ -412,7 +410,7 @@ public:
}
static sokey_t get_safe_order_key(const raw_const_iterator& it) {
- if( !it.get_node_ptr() ) return sokey_t(~0U);
+ if( !it.get_node_ptr() ) return ~sokey_t(0);
return it.get_node_ptr()->get_order_key();
}
@@ -464,7 +462,7 @@ public:
// Erase an element using the allocator
void destroy_node(nodeptr_t pnode) {
- my_node_allocator.destroy(pnode);
+ if (!pnode->is_dummy()) my_node_allocator.destroy(pnode);
my_node_allocator.deallocate(pnode, 1);
}
@@ -821,11 +819,16 @@ public:
sokey_t end_key = solist_t::get_safe_order_key(my_end_node);
size_t mid_bucket = __TBB_ReverseBits( begin_key + (end_key-begin_key)/2 ) % my_table.my_number_of_buckets;
while ( !my_table.is_initialized(mid_bucket) ) mid_bucket = my_table.get_parent(mid_bucket);
- my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));
- if( my_midpoint_node == my_begin_node )
+ if(__TBB_ReverseBits(mid_bucket) > begin_key) {
+ // found a dummy_node between begin and end
+ my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));
+ }
+ else {
+ // didn't find a dummy node between begin and end.
my_midpoint_node = my_end_node;
+ }
#if TBB_USE_ASSERT
- else {
+ {
sokey_t mid_key = solist_t::get_safe_order_key(my_midpoint_node);
__TBB_ASSERT( begin_key < mid_key, "my_begin_node is after my_midpoint_node" );
__TBB_ASSERT( mid_key <= end_key, "my_midpoint_node is after my_end_node" );
@@ -1122,7 +1125,7 @@ private:
if (!is_initialized(bucket))
init_bucket(bucket);
- size_type new_count;
+ size_type new_count = 0;
order_key = split_order_key_regular(order_key);
raw_iterator it = get_bucket(bucket);
raw_iterator last = my_solist.raw_end();
@@ -1295,8 +1298,8 @@ private:
// Grow the table by a factor of 2 if possible and needed
if ( ((float) total_elements / (float) current_size) > my_maximum_bucket_size )
{
- // Double the size of the hash only if size has not changed inbetween loads
- __TBB_CompareAndSwapW((uintptr_t*)&my_number_of_buckets, uintptr_t(2u*current_size), uintptr_t(current_size) );
+ // Double the size of the hash only if size has not changed in between loads
+ my_number_of_buckets.compare_and_swap(2u*current_size, current_size);
//Simple "my_number_of_buckets.compare_and_swap( current_size<<1, current_size );" does not work for VC8
//due to overzealous compiler warnings in /Wp64 mode
}
@@ -1342,7 +1345,7 @@ private:
raw_iterator * new_segment = my_allocator.allocate(sz);
std::memset(new_segment, 0, sz*sizeof(raw_iterator));
- if (__TBB_CompareAndSwapW((void *) &my_buckets[segment], (uintptr_t)new_segment, 0) != 0)
+ if (my_buckets[segment].compare_and_swap( new_segment, NULL) != NULL)
my_allocator.deallocate(new_segment, sz);
}
@@ -1369,7 +1372,7 @@ private:
// A dummy order key has its original hash value reversed and the last bit unset
sokey_t split_order_key_dummy(sokey_t order_key) const {
- return __TBB_ReverseBits(order_key) & ~(0x1);
+ return __TBB_ReverseBits(order_key) & ~sokey_t(0x1);
}
// Shared variables
@@ -1384,7 +1387,7 @@ private:
#endif
//! Hash multiplier
-static const size_t hash_multiplier = tbb::internal::size_t_select(2654435769U, 11400714819323198485ULL);
+static const size_t hash_multiplier = tbb::internal::select_size_t_constant<2654435769U, 11400714819323198485ULL>::value;
} // namespace internal
//! @endcond
//! Hasher functions
diff --git a/include/tbb/internal/_flow_graph_impl.h b/include/tbb/internal/_flow_graph_impl.h
index fe932a6..c57ad0d 100644
--- a/include/tbb/internal/_flow_graph_impl.h
+++ b/include/tbb/internal/_flow_graph_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -39,6 +39,8 @@ namespace internal {
enum graph_buffer_policy { rejecting, reserving, queueing, tag_matching };
}
+// -------------- function_body containers ----------------------
+
//! A functor that takes no input and generates a value of type Output
template< typename Output >
class source_body : tbb::internal::no_assign {
@@ -57,6 +59,7 @@ namespace internal {
/*override*/ source_body_leaf* clone() {
return new source_body_leaf< Output, Body >(init_body);
}
+ Body get_body() { return body; }
private:
Body body;
Body init_body;
@@ -154,7 +157,7 @@ namespace internal {
public:
multifunction_body_leaf(const B &_body) : body(_body), init_body(_body) { }
void operator()(const Input &input, OutputSet &oset) {
- body(input, oset); // body should explicitly put() to one or more of oset.
+ body(input, oset); // body may explicitly put() to one or more of oset.
}
B get_body() { return body; }
/*override*/ multifunction_body_leaf* clone() {
@@ -164,56 +167,66 @@ namespace internal {
B body;
B init_body;
};
+
+// --------------------------- end of function_body containers ------------------------
+
+// --------------------------- node task bodies ---------------------------------------
- //! A task that calls a node's forward function
+ //! A task that calls a node's forward_task function
template< typename NodeType >
- class forward_task : public task {
+ class forward_task_bypass : public task {
NodeType &my_node;
public:
- forward_task( NodeType &n ) : my_node(n) {}
+ forward_task_bypass( NodeType &n ) : my_node(n) {}
task *execute() {
- my_node.forward();
- return NULL;
+ task * new_task = my_node.forward_task();
+ if (new_task == SUCCESSFULLY_ENQUEUED) new_task = NULL;
+ return new_task;
}
};
- //! A task that calls a node's apply_body function, passing in an input of type Input
+ //! A task that calls a node's apply_body_bypass function, passing in an input of type Input
+ // return the task* unless it is SUCCESSFULLY_ENQUEUED, in which case return NULL
template< typename NodeType, typename Input >
- class apply_body_task : public task {
+ class apply_body_task_bypass : public task {
NodeType &my_node;
Input my_input;
public:
- apply_body_task( NodeType &n, const Input &i ) : my_node(n), my_input(i) {}
+ apply_body_task_bypass( NodeType &n, const Input &i ) : my_node(n), my_input(i) {}
task *execute() {
- my_node.apply_body( my_input );
- return NULL;
+ task * next_task = my_node.apply_body_bypass( my_input );
+ if(next_task == SUCCESSFULLY_ENQUEUED) next_task = NULL;
+ return next_task;
}
};
-
+
//! A task that calls a node's apply_body function with no input
template< typename NodeType >
- class source_task : public task {
+ class source_task_bypass : public task {
NodeType &my_node;
public:
- source_task( NodeType &n ) : my_node(n) {}
+ source_task_bypass( NodeType &n ) : my_node(n) {}
task *execute() {
- my_node.apply_body( );
- return NULL;
+ task *new_task = my_node.apply_body_bypass( );
+ if(new_task == SUCCESSFULLY_ENQUEUED) return NULL;
+ return new_task;
}
};
-
+
+// ------------------------ end of node task bodies -----------------------------------
+
//! An empty functor that takes an Input and returns a default constructed Output
template< typename Input, typename Output >
struct empty_body {
@@ -280,7 +293,7 @@ namespace internal {
//! A cache of predecessors that only supports try_get
template< typename T, typename M=spin_mutex >
class predecessor_cache : public node_cache< sender<T>, M > {
- public:
+ public:
typedef M my_mutex_type;
typedef T output_type;
typedef sender<output_type> predecessor_type;
@@ -318,8 +331,24 @@ namespace internal {
} while ( msg == false );
return msg;
}
-
+
+ void reset() {
+ if(!my_owner) {
+ return; // retain ownership of edges
+ }
+ for(;;) {
+ predecessor_type *src;
+ {
+ typename my_mutex_type::scoped_lock lock(this->my_mutex);
+ if(this->internal_empty()) break;
+ src = &this->internal_pop();
+ }
+ src->register_successor( *my_owner);
+ }
+ }
+
protected:
+
successor_type *my_owner;
};
@@ -377,13 +406,18 @@ namespace internal {
reserved_src = NULL;
return true;
}
+
+ void reset() {
+ reserved_src = NULL;
+ predecessor_cache<T,M>::reset();
+ }
private:
predecessor_type *reserved_src;
};
- //! An abstract cache of succesors
+ //! An abstract cache of successors
template<typename T, typename M=spin_rw_mutex >
class successor_cache : tbb::internal::no_copy {
protected:
@@ -425,7 +459,7 @@ namespace internal {
return my_successors.empty();
}
- virtual bool try_put( const T &t ) = 0;
+ virtual task * try_put_task( const T &t ) = 0;
};
//! An abstract cache of succesors, specialized to continue_msg
@@ -452,10 +486,8 @@ namespace internal {
void register_successor( receiver<continue_msg> &r ) {
my_mutex_type::scoped_lock l(my_mutex, true);
my_successors.push_back( &r );
- if ( my_owner ) {
- continue_receiver *cr = dynamic_cast< continue_receiver * >(&r);
- if ( cr )
- cr->register_predecessor( *my_owner );
+ if ( my_owner && r.is_continue_receiver() ) {
+ r.register_predecessor( *my_owner );
}
}
@@ -477,7 +509,7 @@ namespace internal {
return my_successors.empty();
}
- virtual bool try_put( const continue_msg &t ) = 0;
+ virtual task * try_put_task( const continue_msg &t ) = 0;
};
@@ -491,29 +523,31 @@ namespace internal {
broadcast_cache( ) {}
- bool try_put( const T &t ) {
- bool msg = false;
+ // as above, but call try_put_task instead, and return the last task we received (if any)
+ /*override*/ task * try_put_task( const T &t ) {
+ task * last_task = NULL;
bool upgraded = false;
typename my_mutex_type::scoped_lock l(this->my_mutex, false);
typename my_successors_type::iterator i = this->my_successors.begin();
while ( i != this->my_successors.end() ) {
- if ( (*i)->try_put( t ) == true ) {
- ++i;
- msg = true;
- } else {
- if ( (*i)->register_predecessor(*this->my_owner) ) {
- if (!upgraded) {
- l.upgrade_to_writer();
- upgraded = true;
- }
- i = this->my_successors.erase(i);
- }
- else {
- ++i;
- }
- }
+ task *new_task = (*i)->try_put_task(t);
+ last_task = combine_tasks(last_task, new_task); // enqueue if necessary
+ if(new_task) {
+ ++i;
+ }
+ else { // failed
+ if ( (*i)->register_predecessor(*this->my_owner) ) {
+ if (!upgraded) {
+ l.upgrade_to_writer();
+ upgraded = true;
+ }
+ i = this->my_successors.erase(i);
+ } else {
+ ++i;
+ }
+ }
}
- return msg;
+ return last_task;
}
};
@@ -533,27 +567,28 @@ namespace internal {
return this->my_successors.size();
}
- bool try_put( const T &t ) {
+ /*override*/task *try_put_task( const T &t ) {
bool upgraded = false;
typename my_mutex_type::scoped_lock l(this->my_mutex, false);
typename my_successors_type::iterator i = this->my_successors.begin();
while ( i != this->my_successors.end() ) {
- if ( (*i)->try_put( t ) ) {
- return true;
- } else {
- if ( (*i)->register_predecessor(*this->my_owner) ) {
- if (!upgraded) {
- l.upgrade_to_writer();
- upgraded = true;
- }
- i = this->my_successors.erase(i);
- }
- else {
- ++i;
- }
- }
+ task *new_task = (*i)->try_put_task(t);
+ if ( new_task ) {
+ return new_task;
+ } else {
+ if ( (*i)->register_predecessor(*this->my_owner) ) {
+ if (!upgraded) {
+ l.upgrade_to_writer();
+ upgraded = true;
+ }
+ i = this->my_successors.erase(i);
+ }
+ else {
+ ++i;
+ }
+ }
}
- return false;
+ return NULL;
}
};
@@ -562,8 +597,8 @@ namespace internal {
T *my_node;
- void execute() {
- my_node->decrement_counter();
+ task *execute() {
+ return my_node->decrement_counter();
}
public:
diff --git a/include/tbb/internal/_flow_graph_item_buffer_impl.h b/include/tbb/internal/_flow_graph_item_buffer_impl.h
index d217005..216dfc9 100644
--- a/include/tbb/internal/_flow_graph_item_buffer_impl.h
+++ b/include/tbb/internal/_flow_graph_item_buffer_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -127,6 +127,17 @@
return true;
}
+ void clean_up_buffer() {
+ if (my_array) {
+ for( size_type i=0; i<my_array_size; ++i ) {
+ my_array[i].first.~input_type();
+ }
+ allocator_type().deallocate(my_array,my_array_size);
+ }
+ my_array = NULL;
+ my_head = my_tail = my_array_size = 0;
+ }
+
public:
//! Constructor
item_buffer( ) : my_array(NULL), my_array_size(0),
@@ -135,14 +146,11 @@
}
~item_buffer() {
- if (my_array) {
- for( size_type i=0; i<my_array_size; ++i ) {
- my_array[i].first.~input_type();
- }
- allocator_type().deallocate(my_array,my_array_size);
- }
+ clean_up_buffer();
}
+ void reset() { clean_up_buffer(); grow_my_array(initial_buffer_size); }
+
};
//! item_buffer with reservable front-end. NOTE: if reserving, do not
@@ -160,6 +168,7 @@
public:
reservable_item_buffer() : item_buffer<T, A>(), my_reserved(false) {}
+ void reset() {my_reserved = false; item_buffer<T,A>::reset(); }
protected:
bool reserve_front(T &v) {
diff --git a/include/tbb/internal/_flow_graph_join_impl.h b/include/tbb/internal/_flow_graph_join_impl.h
index 0555411..751620b 100644
--- a/include/tbb/internal/_flow_graph_join_impl.h
+++ b/include/tbb/internal/_flow_graph_join_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -43,9 +43,11 @@ namespace internal {
struct forwarding_base {
forwarding_base(task *rt) : my_root_task(rt), current_tag(NO_TAG) {}
virtual ~forwarding_base() {}
- virtual void decrement_port_count() = 0;
+ // decrement_port_count may create a forwarding task. If we cannot handle the task
+ // ourselves, ask decrement_port_count to deal with it.
+ virtual task * decrement_port_count(bool handle_task) = 0;
virtual void increment_port_count() = 0;
- virtual void increment_tag_count(tag_value /*t*/) {}
+ virtual task * increment_tag_count(tag_value /*t*/, bool /*handle_task*/) {return NULL;}
// moved here so input ports can queue tasks
task* my_root_task;
tag_value current_tag; // so ports can refer to FE's desired items
@@ -56,18 +58,18 @@ namespace internal {
template< typename TupleType, typename PortType >
static inline void set_join_node_pointer(TupleType &my_input, PortType *port) {
- std::get<N-1>( my_input ).set_join_node_pointer(port);
+ tbb::flow::get<N-1>( my_input ).set_join_node_pointer(port);
join_helper<N-1>::set_join_node_pointer( my_input, port );
}
template< typename TupleType >
static inline void consume_reservations( TupleType &my_input ) {
- std::get<N-1>( my_input ).consume();
+ tbb::flow::get<N-1>( my_input ).consume();
join_helper<N-1>::consume_reservations( my_input );
}
template< typename TupleType >
static inline void release_my_reservation( TupleType &my_input ) {
- std::get<N-1>( my_input ).release();
+ tbb::flow::get<N-1>( my_input ).release();
}
template <typename TupleType>
@@ -78,7 +80,7 @@ namespace internal {
template< typename InputTuple, typename OutputTuple >
static inline bool reserve( InputTuple &my_input, OutputTuple &out) {
- if ( !std::get<N-1>( my_input ).reserve( std::get<N-1>( out ) ) ) return false;
+ if ( !tbb::flow::get<N-1>( my_input ).reserve( tbb::flow::get<N-1>( out ) ) ) return false;
if ( !join_helper<N-1>::reserve( my_input, out ) ) {
release_my_reservation( my_input );
return false;
@@ -88,7 +90,7 @@ namespace internal {
template<typename InputTuple, typename OutputTuple>
static inline bool get_my_item( InputTuple &my_input, OutputTuple &out) {
- bool res = std::get<N-1>(my_input).get_item(std::get<N-1>(out) ); // may fail
+ bool res = tbb::flow::get<N-1>(my_input).get_item(tbb::flow::get<N-1>(out) ); // may fail
return join_helper<N-1>::get_my_item(my_input, out) && res; // do get on other inputs before returning
}
@@ -100,7 +102,7 @@ namespace internal {
template<typename InputTuple>
static inline void reset_my_port(InputTuple &my_input) {
join_helper<N-1>::reset_my_port(my_input);
- std::get<N-1>(my_input).reset_port();
+ tbb::flow::get<N-1>(my_input).reset_port();
}
template<typename InputTuple>
@@ -110,20 +112,26 @@ namespace internal {
template<typename InputTuple, typename TagFuncTuple>
static inline void set_tag_func(InputTuple &my_input, TagFuncTuple &my_tag_funcs) {
- std::get<N-1>(my_input).set_my_original_tag_func(std::get<N-1>(my_tag_funcs));
- std::get<N-1>(my_input).set_my_tag_func(std::get<N-1>(my_input).my_original_func()->clone());
- std::get<N-1>(my_tag_funcs) = NULL;
+ tbb::flow::get<N-1>(my_input).set_my_original_tag_func(tbb::flow::get<N-1>(my_tag_funcs));
+ tbb::flow::get<N-1>(my_input).set_my_tag_func(tbb::flow::get<N-1>(my_input).my_original_func()->clone());
+ tbb::flow::get<N-1>(my_tag_funcs) = NULL;
join_helper<N-1>::set_tag_func(my_input, my_tag_funcs);
}
template< typename TagFuncTuple1, typename TagFuncTuple2>
static inline void copy_tag_functors(TagFuncTuple1 &my_inputs, TagFuncTuple2 &other_inputs) {
- if(std::get<N-1>(other_inputs).my_original_func()) {
- std::get<N-1>(my_inputs).set_my_tag_func(std::get<N-1>(other_inputs).my_original_func()->clone());
- std::get<N-1>(my_inputs).set_my_original_tag_func(std::get<N-1>(other_inputs).my_original_func()->clone());
+ if(tbb::flow::get<N-1>(other_inputs).my_original_func()) {
+ tbb::flow::get<N-1>(my_inputs).set_my_tag_func(tbb::flow::get<N-1>(other_inputs).my_original_func()->clone());
+ tbb::flow::get<N-1>(my_inputs).set_my_original_tag_func(tbb::flow::get<N-1>(other_inputs).my_original_func()->clone());
}
join_helper<N-1>::copy_tag_functors(my_inputs, other_inputs);
}
+
+ template<typename InputTuple>
+ static inline void reset_inputs(InputTuple &my_input) {
+ join_helper<N-1>::reset_inputs(my_input);
+ tbb::flow::get<N-1>(my_input).reinitialize_port();
+ }
};
template< >
@@ -131,17 +139,17 @@ namespace internal {
template< typename TupleType, typename PortType >
static inline void set_join_node_pointer(TupleType &my_input, PortType *port) {
- std::get<0>( my_input ).set_join_node_pointer(port);
+ tbb::flow::get<0>( my_input ).set_join_node_pointer(port);
}
template< typename TupleType >
static inline void consume_reservations( TupleType &my_input ) {
- std::get<0>( my_input ).consume();
+ tbb::flow::get<0>( my_input ).consume();
}
template< typename TupleType >
static inline void release_my_reservation( TupleType &my_input ) {
- std::get<0>( my_input ).release();
+ tbb::flow::get<0>( my_input ).release();
}
template<typename TupleType>
@@ -151,12 +159,12 @@ namespace internal {
template< typename InputTuple, typename OutputTuple >
static inline bool reserve( InputTuple &my_input, OutputTuple &out) {
- return std::get<0>( my_input ).reserve( std::get<0>( out ) );
+ return tbb::flow::get<0>( my_input ).reserve( tbb::flow::get<0>( out ) );
}
template<typename InputTuple, typename OutputTuple>
static inline bool get_my_item( InputTuple &my_input, OutputTuple &out) {
- return std::get<0>(my_input).get_item(std::get<0>(out));
+ return tbb::flow::get<0>(my_input).get_item(tbb::flow::get<0>(out));
}
template<typename InputTuple, typename OutputTuple>
@@ -166,7 +174,7 @@ namespace internal {
template<typename InputTuple>
static inline void reset_my_port(InputTuple &my_input) {
- std::get<0>(my_input).reset_port();
+ tbb::flow::get<0>(my_input).reset_port();
}
template<typename InputTuple>
@@ -176,18 +184,22 @@ namespace internal {
template<typename InputTuple, typename TagFuncTuple>
static inline void set_tag_func(InputTuple &my_input, TagFuncTuple &my_tag_funcs) {
- std::get<0>(my_input).set_my_original_tag_func(std::get<0>(my_tag_funcs));
- std::get<0>(my_input).set_my_tag_func(std::get<0>(my_input).my_original_func()->clone());
- std::get<0>(my_tag_funcs) = NULL;
+ tbb::flow::get<0>(my_input).set_my_original_tag_func(tbb::flow::get<0>(my_tag_funcs));
+ tbb::flow::get<0>(my_input).set_my_tag_func(tbb::flow::get<0>(my_input).my_original_func()->clone());
+ tbb::flow::get<0>(my_tag_funcs) = NULL;
}
template< typename TagFuncTuple1, typename TagFuncTuple2>
static inline void copy_tag_functors(TagFuncTuple1 &my_inputs, TagFuncTuple2 &other_inputs) {
- if(std::get<0>(other_inputs).my_original_func()) {
- std::get<0>(my_inputs).set_my_tag_func(std::get<0>(other_inputs).my_original_func()->clone());
- std::get<0>(my_inputs).set_my_original_tag_func(std::get<0>(other_inputs).my_original_func()->clone());
+ if(tbb::flow::get<0>(other_inputs).my_original_func()) {
+ tbb::flow::get<0>(my_inputs).set_my_tag_func(tbb::flow::get<0>(other_inputs).my_original_func()->clone());
+ tbb::flow::get<0>(my_inputs).set_my_original_tag_func(tbb::flow::get<0>(other_inputs).my_original_func()->clone());
}
}
+ template<typename InputTuple>
+ static inline void reset_inputs(InputTuple &my_input) {
+ tbb::flow::get<0>(my_input).reinitialize_port();
+ }
};
//! The two-phase join port
@@ -231,7 +243,7 @@ namespace internal {
no_predecessors = my_predecessors.empty();
my_predecessors.add(*(current->my_pred));
if ( no_predecessors ) {
- my_join->decrement_port_count( ); // may try to forward
+ (void) my_join->decrement_port_count(true); // may try to forward
}
__TBB_store_with_release(current->status, SUCCEEDED);
break;
@@ -268,6 +280,14 @@ namespace internal {
}
}
+ protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ task *try_put_task( const T & ) {
+ return NULL;
+ }
+
public:
//! Constructor
@@ -289,11 +309,6 @@ namespace internal {
my_join = join;
}
- // always rejects, so arc is reversed (and reserves can be done.)
- bool try_put( const T & ) {
- return false;
- }
-
//! Add a predecessor
bool register_predecessor( sender<T> &src ) {
reserving_port_operation op_data(src, reg_pred);
@@ -327,6 +342,17 @@ namespace internal {
my_aggregator.execute(&op_data);
}
+ void reinitialize_port() {
+ my_predecessors.reset();
+ reserved = false;
+ }
+
+ protected:
+
+ /*override*/void reset_receiver() {
+ my_predecessors.reset();
+ }
+
private:
forwarding_base *my_join;
reservable_predecessor_cache< T, null_mutex > my_predecessors;
@@ -343,7 +369,7 @@ namespace internal {
// ----------- Aggregator ------------
private:
- enum op_type { try__put, get__item, res_port };
+ enum op_type { get__item, res_port, try__put_task };
enum op_stat {WAIT=0, SUCCEEDED, FAILED};
typedef queueing_port<T> my_class;
@@ -352,15 +378,21 @@ namespace internal {
char type;
T my_val;
T *my_arg;
+ task * bypass_t;
// constructor for value parameter
queueing_port_operation(const T& e, op_type t) :
- // type(char(t)), my_val(const_cast<T>(e)) {}
- type(char(t)), my_val(e) {}
+ type(char(t)), my_val(e)
+ , bypass_t(NULL)
+ {}
// constructor for pointer parameter
queueing_port_operation(const T* p, op_type t) :
- type(char(t)), my_arg(const_cast<T*>(p)) {}
+ type(char(t)), my_arg(const_cast<T*>(p))
+ , bypass_t(NULL)
+ {}
// constructor with no parameter
- queueing_port_operation(op_type t) : type(char(t)) {}
+ queueing_port_operation(op_type t) : type(char(t))
+ , bypass_t(NULL)
+ {}
};
typedef internal::aggregating_functor<my_class, queueing_port_operation> my_handler;
@@ -374,11 +406,16 @@ namespace internal {
current = op_list;
op_list = op_list->next;
switch(current->type) {
- case try__put:
- was_empty = this->buffer_empty();
- this->push_back(current->my_val);
- if (was_empty) my_join->decrement_port_count();
- __TBB_store_with_release(current->status, SUCCEEDED);
+ case try__put_task: {
+ task *rtask = NULL;
+ was_empty = this->buffer_empty();
+ this->push_back(current->my_val);
+ if (was_empty) rtask = my_join->decrement_port_count(false);
+ else
+ rtask = SUCCESSFULLY_ENQUEUED;
+ current->bypass_t = rtask;
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ }
break;
case get__item:
if(!this->buffer_empty()) {
@@ -393,7 +430,7 @@ namespace internal {
__TBB_ASSERT(this->item_valid(this->my_head), "No item to reset");
this->invalidate_front(); ++(this->my_head);
if(this->item_valid(this->my_head)) {
- my_join->decrement_port_count();
+ (void)my_join->decrement_port_count(true);
}
__TBB_store_with_release(current->status, SUCCEEDED);
break;
@@ -401,6 +438,19 @@ namespace internal {
}
}
// ------------ End Aggregator ---------------
+
+ protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ /*override*/task *try_put_task(const T &v) {
+ queueing_port_operation op_data(v, try__put_task);
+ my_aggregator.execute(&op_data);
+ __TBB_ASSERT(op_data.status == SUCCEEDED || !op_data.bypass_t, "inconsistent return from aggregator");
+ if(!op_data.bypass_t) return SUCCESSFULLY_ENQUEUED;
+ return op_data.bypass_t;
+ }
+
public:
//! Constructor
@@ -420,13 +470,6 @@ namespace internal {
my_join = join;
}
- /*override*/bool try_put(const T &v) {
- queueing_port_operation op_data(v, try__put);
- my_aggregator.execute(&op_data);
- return op_data.status == SUCCEEDED;
- }
-
-
bool get_item( T &v ) {
queueing_port_operation op_data(&v, get__item);
my_aggregator.execute(&op_data);
@@ -441,6 +484,16 @@ namespace internal {
return;
}
+ void reinitialize_port() {
+ item_buffer<T>::reset();
+ }
+
+ protected:
+
+ /*override*/void reset_receiver() {
+ // nothing to do. We queue, so no predecessor cache
+ }
+
private:
forwarding_base *my_join;
};
@@ -454,6 +507,7 @@ namespace internal {
typedef sender<T> predecessor_type;
typedef tag_matching_port<T> my_node_type; // for forwarding, if needed
typedef function_body<input_type, tag_value> my_tag_func_type;
+ typedef tagged_buffer<tag_value,T,NO_TAG> my_buffer_type;
private:
// ----------- Aggregator ------------
private:
@@ -469,7 +523,6 @@ namespace internal {
tag_value my_tag_value;
// constructor for value parameter
tag_matching_port_operation(const T& e, op_type t) :
- // type(char(t)), my_val(const_cast<T>(e)) {}
type(char(t)), my_val(e) {}
// constructor for pointer parameter
tag_matching_port_operation(const T* p, op_type t) :
@@ -510,6 +563,23 @@ namespace internal {
}
}
// ------------ End Aggregator ---------------
+ protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ /*override*/task *try_put_task(const T& v) {
+ tag_matching_port_operation op_data(v, try__put);
+ op_data.my_tag_value = (*my_tag_func)(v);
+ task *rtask = NULL;
+ my_aggregator.execute(&op_data);
+ if(op_data.status == SUCCEEDED) {
+ rtask = my_join->increment_tag_count(op_data.my_tag_value, false); // may spawn
+ // rtask has to reflect the return status of the try_put
+ if(!rtask) rtask = SUCCESSFULLY_ENQUEUED;
+ }
+ return rtask;
+ }
+
public:
tag_matching_port() : receiver<T>(), tagged_buffer<tag_value, T, NO_TAG>() {
@@ -545,24 +615,6 @@ namespace internal {
my_tag_func = f;
}
- /*override*/bool try_put(const T& v) {
- tag_matching_port_operation op_data(v, try__put);
- op_data.my_tag_value = (*my_tag_func)(v);
- my_aggregator.execute(&op_data);
- if(op_data.status == SUCCEEDED) {
- // the assertion in the aggregator above will ensure we do not call with the same
- // tag twice. We have to exit the aggregator to keep lock-ups from happening;
- // the increment of the tag hash table in the FE is under a separate aggregator,
- // so that is serialized.
- // is a race possible? I do not believe so; the increment may cause a build of
- // an output tuple, but its component is already in the hash table for the port.
- my_join->increment_tag_count(op_data.my_tag_value); // may spawn
-
- }
- return op_data.status == SUCCEEDED;
- }
-
-
bool get_item( T &v ) {
tag_matching_port_operation op_data(&v, get__item);
my_aggregator.execute(&op_data);
@@ -580,6 +632,16 @@ namespace internal {
my_tag_func_type *my_func() { return my_tag_func; }
my_tag_func_type *my_original_func() { return my_original_tag_func; }
+ void reinitialize_port() {
+ my_buffer_type::reset();
+ }
+
+ protected:
+
+ /*override*/void reset_receiver() {
+ // nothing to do. We queue, so no predecessor cache
+ }
+
private:
// need map of tags to values
forwarding_base *my_join;
@@ -599,7 +661,7 @@ namespace internal {
template<typename InputTuple, typename OutputTuple>
class join_node_FE<reserving, InputTuple, OutputTuple> : public forwarding_base {
public:
- static const int N = std::tuple_size<OutputTuple>::value;
+ static const int N = tbb::flow::tuple_size<OutputTuple>::value;
typedef OutputTuple output_type;
typedef InputTuple input_type;
typedef join_node_base<reserving, InputTuple, OutputTuple> my_node_type; // for forwarding
@@ -621,15 +683,27 @@ namespace internal {
}
// if all input_ports have predecessors, spawn forward to try and consume tuples
- void decrement_port_count() {
+ task * decrement_port_count(bool handle_task) {
if(ports_with_no_inputs.fetch_and_decrement() == 1) {
- task::enqueue( * new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
- forward_task<my_node_type>(*my_node) );
+ task *rtask = new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
+ forward_task_bypass
+ <my_node_type>(*my_node);
+ if(!handle_task) return rtask;
+ task::enqueue(*rtask);
}
+ return NULL;
}
input_type &input_ports() { return my_inputs; }
+
protected:
+
+ void reset() {
+ // called outside of parallel contexts
+ ports_with_no_inputs = N;
+ join_helper<N>::reset_inputs(my_inputs);
+ }
+
// all methods on input ports should be called under mutual exclusion from join_node_base.
bool tuple_build_may_succeed() {
@@ -656,7 +730,7 @@ namespace internal {
template<typename InputTuple, typename OutputTuple>
class join_node_FE<queueing, InputTuple, OutputTuple> : public forwarding_base {
public:
- static const int N = std::tuple_size<OutputTuple>::value;
+ static const int N = tbb::flow::tuple_size<OutputTuple>::value;
typedef OutputTuple output_type;
typedef InputTuple input_type;
typedef join_node_base<queueing, InputTuple, OutputTuple> my_node_type; // for forwarding
@@ -679,17 +753,29 @@ namespace internal {
}
// if all input_ports have items, spawn forward to try and consume tuples
- void decrement_port_count() {
+ task * decrement_port_count(bool handle_task)
+ {
if(ports_with_no_items.fetch_and_decrement() == 1) {
- task::enqueue( * new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
- forward_task<my_node_type>(*my_node) );
+ task *rtask = new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
+ forward_task_bypass
+ <my_node_type>(*my_node);
+ if(!handle_task) return rtask;
+ task::enqueue( *rtask);
}
+ return NULL;
}
void increment_port_count() { __TBB_ASSERT(false, NULL); } // should never be called
input_type &input_ports() { return my_inputs; }
+
protected:
+
+ void reset() {
+ reset_port_count();
+ join_helper<N>::reset_inputs(my_inputs);
+ }
+
// all methods on input ports should be called under mutual exclusion from join_node_base.
bool tuple_build_may_succeed() {
@@ -717,9 +803,10 @@ namespace internal {
// tag_matching join input port.
template<typename InputTuple, typename OutputTuple>
class join_node_FE<tag_matching, InputTuple, OutputTuple> : public forwarding_base,
+ // buffer of tag value counts buffer of output items
public tagged_buffer<tag_value, size_t, NO_TAG>, public item_buffer<OutputTuple> {
public:
- static const int N = std::tuple_size<OutputTuple>::value;
+ static const int N = tbb::flow::tuple_size<OutputTuple>::value;
typedef OutputTuple output_type;
typedef InputTuple input_type;
typedef tagged_buffer<tag_value, size_t, NO_TAG> my_tag_buffer;
@@ -741,14 +828,15 @@ namespace internal {
tag_value my_val;
output_type* my_output;
};
+ task *bypass_t;
+ bool enqueue_task;
// constructor for value parameter
- tag_matching_FE_operation(const tag_value& e, op_type t) :
- // type(char(t)), my_val(const_cast<T>(e)) {}
- type(char(t)), my_val(e) {}
- tag_matching_FE_operation(output_type *p, op_type t) :
- type(char(t)), my_output(p) {}
+ tag_matching_FE_operation(const tag_value& e , bool q_task , op_type t) : type(char(t)), my_val(e),
+ bypass_t(NULL), enqueue_task(q_task) {}
+ tag_matching_FE_operation(output_type *p, op_type t) : type(char(t)), my_output(p), bypass_t(NULL),
+ enqueue_task(true) {}
// constructor with no parameter
- tag_matching_FE_operation(op_type t) : type(char(t)) {}
+ tag_matching_FE_operation(op_type t) : type(char(t)), bypass_t(NULL), enqueue_task(true) {}
};
typedef internal::aggregating_functor<my_class, tag_matching_FE_operation> my_handler;
@@ -756,16 +844,24 @@ namespace internal {
aggregator<my_handler, tag_matching_FE_operation> my_aggregator;
// called from aggregator, so serialized
- void fill_output_buffer(bool should_enqueue) {
+ // construct as many output objects as possible.
+ // returns a task pointer if the a task would have been enqueued but we asked that
+ // it be returned. Otherwise returns NULL.
+ task * fill_output_buffer(bool should_enqueue, bool handle_task) {
output_type l_out;
+ task *rtask = NULL;
bool do_fwd = should_enqueue && this->buffer_empty();
- while(find_value_tag(this->current_tag,N)) {
- this->tagged_delete(this->current_tag);
+ while(find_value_tag(this->current_tag,N)) { // while there are completed items
+ this->tagged_delete(this->current_tag); // remove the tag
if(join_helper<N>::get_items(my_inputs, l_out)) { // <== call back
this->push_back(l_out);
- if(do_fwd) {
- task::enqueue( * new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
- forward_task<my_node_type>(*my_node) );
+ if(do_fwd) { // we enqueue if receiving an item from predecessor, not if successor asks for item
+ rtask = new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
+ forward_task_bypass<my_node_type>(*my_node);
+ if(handle_task) {
+ task::enqueue(*rtask);
+ rtask = NULL;
+ }
do_fwd = false;
}
// retire the input values
@@ -776,6 +872,7 @@ namespace internal {
__TBB_ASSERT(false, "should have had something to push");
}
}
+ return rtask;
}
void handle_operations(tag_matching_FE_operation* op_list) {
@@ -789,28 +886,30 @@ namespace internal {
output_type l_out;
this->pop_front(l_out); // don't care about returned value.
// buffer as many tuples as we can make
- fill_output_buffer(true);
+ (void)fill_output_buffer(true, true);
__TBB_store_with_release(current->status, SUCCEEDED);
}
break;
case inc_count: { // called from input ports
size_t *p = 0;
tag_value t = current->my_val;
+ bool do_enqueue = current->enqueue_task;
if(!(this->tagged_find_ref(t,p))) {
this->tagged_insert(t, 0);
if(!(this->tagged_find_ref(t,p))) {
- __TBB_ASSERT(false, NULL);
+ __TBB_ASSERT(false, "should find tag after inserting it");
}
}
if(++(*p) == size_t(N)) {
- task::enqueue( * new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
- forward_task<my_node_type>(*my_node) );
+ task *rtask = fill_output_buffer(true, do_enqueue);
+ __TBB_ASSERT(!rtask || !do_enqueue, "task should not be returned");
+ current->bypass_t = rtask;
}
}
__TBB_store_with_release(current->status, SUCCEEDED);
break;
case may_succeed: // called from BE
- fill_output_buffer(false);
+ (void)fill_output_buffer(false, /*handle_task*/true); // handle_task not used
__TBB_store_with_release(current->status, this->buffer_empty() ? FAILED : SUCCEEDED);
break;
case try_make: // called from BE
@@ -853,18 +952,30 @@ namespace internal {
}
// if all input_ports have items, spawn forward to try and consume tuples
- void increment_tag_count(tag_value t) { // called from input_ports
- tag_matching_FE_operation op_data(t, inc_count);
+ // return a task if we are asked and did create one.
+ task *increment_tag_count(tag_value t, bool handle_task) { // called from input_ports
+ tag_matching_FE_operation op_data(t, handle_task, inc_count);
my_aggregator.execute(&op_data);
- return;
+ return op_data.bypass_t;
}
- void decrement_port_count() { __TBB_ASSERT(false, NULL); }
+ /*override*/ task *decrement_port_count(bool /*handle_task*/) { __TBB_ASSERT(false, NULL); return NULL; }
void increment_port_count() { __TBB_ASSERT(false, NULL); } // should never be called
input_type &input_ports() { return my_inputs; }
+
protected:
+
+ void reset() {
+ // called outside of parallel contexts
+ join_helper<N>::reset_inputs(my_inputs);
+
+ my_tag_buffer::reset(); // have to reset the tag counts
+ output_buffer_type::reset(); // also the queue of outputs
+ my_node->current_tag = NO_TAG;
+ }
+
// all methods on input ports should be called under mutual exclusion from join_node_base.
bool tuple_build_may_succeed() { // called from back-end
@@ -897,6 +1008,7 @@ namespace internal {
template<graph_buffer_policy JP, typename InputTuple, typename OutputTuple>
class join_node_base : public graph_node, public join_node_FE<JP, InputTuple, OutputTuple>,
public sender<OutputTuple> {
+ protected:
using graph_node::my_graph;
public:
typedef OutputTuple output_type;
@@ -910,7 +1022,7 @@ namespace internal {
private:
// ----------- Aggregator ------------
- enum op_type { reg_succ, rem_succ, try__get, do_fwrd };
+ enum op_type { reg_succ, rem_succ, try__get, do_fwrd, do_fwrd_bypass };
enum op_stat {WAIT=0, SUCCEEDED, FAILED};
typedef join_node_base<JP,InputTuple,OutputTuple> my_class;
@@ -921,11 +1033,12 @@ namespace internal {
output_type *my_arg;
successor_type *my_succ;
};
- join_node_base_operation(const output_type& e, op_type t) :
- type(char(t)), my_arg(const_cast<output_type*>(&e)) {}
+ task *bypass_t;
+ join_node_base_operation(const output_type& e, op_type t) : type(char(t)),
+ my_arg(const_cast<output_type*>(&e)), bypass_t(NULL) {}
join_node_base_operation(const successor_type &s, op_type t) : type(char(t)),
- my_succ(const_cast<successor_type *>(&s)) {}
- join_node_base_operation(op_type t) : type(char(t)) {}
+ my_succ(const_cast<successor_type *>(&s)), bypass_t(NULL) {}
+ join_node_base_operation(op_type t) : type(char(t)), bypass_t(NULL) {}
};
typedef internal::aggregating_functor<my_class, join_node_base_operation> my_handler;
@@ -942,8 +1055,10 @@ namespace internal {
case reg_succ:
my_successors.register_successor(*(current->my_succ));
if(tuple_build_may_succeed() && !forwarder_busy) {
- task::enqueue( * new ( task::allocate_additional_child_of(*(this->my_root_task)) )
- forward_task<join_node_base<JP,InputTuple,OutputTuple> >(*this));
+ task *rtask = new ( task::allocate_additional_child_of(*(this->my_root_task)) )
+ forward_task_bypass
+ <join_node_base<JP,InputTuple,OutputTuple> >(*this);
+ task::enqueue(*rtask);
forwarder_busy = true;
}
__TBB_store_with_release(current->status, SUCCEEDED);
@@ -962,14 +1077,17 @@ namespace internal {
}
else __TBB_store_with_release(current->status, FAILED);
break;
- case do_fwrd: {
+ case do_fwrd_bypass: {
bool build_succeeded;
+ task *last_task = NULL;
output_type out;
if(tuple_build_may_succeed()) {
do {
build_succeeded = try_to_make_tuple(out);
if(build_succeeded) {
- if(my_successors.try_put(out)) {
+ task *new_task = my_successors.try_put_task(out);
+ last_task = combine_tasks(last_task, new_task);
+ if(new_task) {
tuple_accepted();
}
else {
@@ -979,6 +1097,7 @@ namespace internal {
}
} while(build_succeeded);
}
+ current->bypass_t = last_task;
__TBB_store_with_release(current->status, SUCCEEDED);
forwarder_busy = false;
}
@@ -1027,15 +1146,22 @@ namespace internal {
return op_data.status == SUCCEEDED;
}
+ protected:
+
+ /*override*/void reset() {
+ input_ports_type::reset();
+ }
+
private:
broadcast_cache<output_type, null_rw_mutex> my_successors;
- friend class forward_task< join_node_base<JP, InputTuple, OutputTuple> >;
-
- void forward() {
- join_node_base_operation op_data(do_fwrd);
+ friend class forward_task_bypass< join_node_base<JP, InputTuple, OutputTuple> >;
+ task *forward_task() {
+ join_node_base_operation op_data(do_fwrd_bypass);
my_aggregator.execute(&op_data);
+ return op_data.bypass_t;
}
+
};
// join base class type generator
@@ -1066,8 +1192,8 @@ namespace internal {
template<typename OutputTuple>
class unfolded_join_node<2,tag_matching_port,OutputTuple,tag_matching> : public
join_base<2,tag_matching_port,OutputTuple,tag_matching>::type {
- typedef typename std::tuple_element<0, OutputTuple>::type T0;
- typedef typename std::tuple_element<1, OutputTuple>::type T1;
+ typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;
+ typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;
public:
typedef typename wrap_tuple_elements<2,tag_matching_port,OutputTuple>::type input_ports_type;
typedef OutputTuple output_type;
@@ -1075,7 +1201,7 @@ namespace internal {
typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;
typedef typename internal::function_body<T0, tag_value> *f0_p;
typedef typename internal::function_body<T1, tag_value> *f1_p;
- typedef typename std::tuple< f0_p, f1_p > func_initializer_type;
+ typedef typename tbb::flow::tuple< f0_p, f1_p > func_initializer_type;
public:
template<typename B0, typename B1>
unfolded_join_node(graph &g, B0 b0, B1 b1) : base_type(g,
@@ -1089,9 +1215,9 @@ namespace internal {
template<typename OutputTuple>
class unfolded_join_node<3,tag_matching_port,OutputTuple,tag_matching> : public
join_base<3,tag_matching_port,OutputTuple,tag_matching>::type {
- typedef typename std::tuple_element<0, OutputTuple>::type T0;
- typedef typename std::tuple_element<1, OutputTuple>::type T1;
- typedef typename std::tuple_element<2, OutputTuple>::type T2;
+ typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;
+ typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;
+ typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;
public:
typedef typename wrap_tuple_elements<3, tag_matching_port, OutputTuple>::type input_ports_type;
typedef OutputTuple output_type;
@@ -1100,7 +1226,7 @@ namespace internal {
typedef typename internal::function_body<T0, tag_value> *f0_p;
typedef typename internal::function_body<T1, tag_value> *f1_p;
typedef typename internal::function_body<T2, tag_value> *f2_p;
- typedef typename std::tuple< f0_p, f1_p, f2_p > func_initializer_type;
+ typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p > func_initializer_type;
public:
template<typename B0, typename B1, typename B2>
unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2) : base_type(g,
@@ -1115,10 +1241,10 @@ namespace internal {
template<typename OutputTuple>
class unfolded_join_node<4,tag_matching_port,OutputTuple,tag_matching> : public
join_base<4,tag_matching_port,OutputTuple,tag_matching>::type {
- typedef typename std::tuple_element<0, OutputTuple>::type T0;
- typedef typename std::tuple_element<1, OutputTuple>::type T1;
- typedef typename std::tuple_element<2, OutputTuple>::type T2;
- typedef typename std::tuple_element<3, OutputTuple>::type T3;
+ typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;
+ typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;
+ typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;
+ typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;
public:
typedef typename wrap_tuple_elements<4, tag_matching_port, OutputTuple>::type input_ports_type;
typedef OutputTuple output_type;
@@ -1128,7 +1254,7 @@ namespace internal {
typedef typename internal::function_body<T1, tag_value> *f1_p;
typedef typename internal::function_body<T2, tag_value> *f2_p;
typedef typename internal::function_body<T3, tag_value> *f3_p;
- typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p > func_initializer_type;
+ typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p > func_initializer_type;
public:
template<typename B0, typename B1, typename B2, typename B3>
unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3) : base_type(g,
@@ -1144,11 +1270,11 @@ namespace internal {
template<typename OutputTuple>
class unfolded_join_node<5,tag_matching_port,OutputTuple,tag_matching> : public
join_base<5,tag_matching_port,OutputTuple,tag_matching>::type {
- typedef typename std::tuple_element<0, OutputTuple>::type T0;
- typedef typename std::tuple_element<1, OutputTuple>::type T1;
- typedef typename std::tuple_element<2, OutputTuple>::type T2;
- typedef typename std::tuple_element<3, OutputTuple>::type T3;
- typedef typename std::tuple_element<4, OutputTuple>::type T4;
+ typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;
+ typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;
+ typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;
+ typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;
+ typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;
public:
typedef typename wrap_tuple_elements<5, tag_matching_port, OutputTuple>::type input_ports_type;
typedef OutputTuple output_type;
@@ -1159,7 +1285,7 @@ namespace internal {
typedef typename internal::function_body<T2, tag_value> *f2_p;
typedef typename internal::function_body<T3, tag_value> *f3_p;
typedef typename internal::function_body<T4, tag_value> *f4_p;
- typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p > func_initializer_type;
+ typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p > func_initializer_type;
public:
template<typename B0, typename B1, typename B2, typename B3, typename B4>
unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) : base_type(g,
@@ -1177,12 +1303,12 @@ namespace internal {
template<typename OutputTuple>
class unfolded_join_node<6,tag_matching_port,OutputTuple,tag_matching> : public
join_base<6,tag_matching_port,OutputTuple,tag_matching>::type {
- typedef typename std::tuple_element<0, OutputTuple>::type T0;
- typedef typename std::tuple_element<1, OutputTuple>::type T1;
- typedef typename std::tuple_element<2, OutputTuple>::type T2;
- typedef typename std::tuple_element<3, OutputTuple>::type T3;
- typedef typename std::tuple_element<4, OutputTuple>::type T4;
- typedef typename std::tuple_element<5, OutputTuple>::type T5;
+ typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;
+ typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;
+ typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;
+ typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;
+ typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;
+ typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;
public:
typedef typename wrap_tuple_elements<6, tag_matching_port, OutputTuple>::type input_ports_type;
typedef OutputTuple output_type;
@@ -1194,7 +1320,7 @@ namespace internal {
typedef typename internal::function_body<T3, tag_value> *f3_p;
typedef typename internal::function_body<T4, tag_value> *f4_p;
typedef typename internal::function_body<T5, tag_value> *f5_p;
- typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p > func_initializer_type;
+ typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p > func_initializer_type;
public:
template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5>
unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5) : base_type(g,
@@ -1214,13 +1340,13 @@ namespace internal {
template<typename OutputTuple>
class unfolded_join_node<7,tag_matching_port,OutputTuple,tag_matching> : public
join_base<7,tag_matching_port,OutputTuple,tag_matching>::type {
- typedef typename std::tuple_element<0, OutputTuple>::type T0;
- typedef typename std::tuple_element<1, OutputTuple>::type T1;
- typedef typename std::tuple_element<2, OutputTuple>::type T2;
- typedef typename std::tuple_element<3, OutputTuple>::type T3;
- typedef typename std::tuple_element<4, OutputTuple>::type T4;
- typedef typename std::tuple_element<5, OutputTuple>::type T5;
- typedef typename std::tuple_element<6, OutputTuple>::type T6;
+ typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;
+ typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;
+ typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;
+ typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;
+ typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;
+ typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;
+ typedef typename tbb::flow::tuple_element<6, OutputTuple>::type T6;
public:
typedef typename wrap_tuple_elements<7, tag_matching_port, OutputTuple>::type input_ports_type;
typedef OutputTuple output_type;
@@ -1233,7 +1359,7 @@ namespace internal {
typedef typename internal::function_body<T4, tag_value> *f4_p;
typedef typename internal::function_body<T5, tag_value> *f5_p;
typedef typename internal::function_body<T6, tag_value> *f6_p;
- typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p > func_initializer_type;
+ typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p > func_initializer_type;
public:
template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6>
unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6) : base_type(g,
@@ -1254,14 +1380,14 @@ namespace internal {
template<typename OutputTuple>
class unfolded_join_node<8,tag_matching_port,OutputTuple,tag_matching> : public
join_base<8,tag_matching_port,OutputTuple,tag_matching>::type {
- typedef typename std::tuple_element<0, OutputTuple>::type T0;
- typedef typename std::tuple_element<1, OutputTuple>::type T1;
- typedef typename std::tuple_element<2, OutputTuple>::type T2;
- typedef typename std::tuple_element<3, OutputTuple>::type T3;
- typedef typename std::tuple_element<4, OutputTuple>::type T4;
- typedef typename std::tuple_element<5, OutputTuple>::type T5;
- typedef typename std::tuple_element<6, OutputTuple>::type T6;
- typedef typename std::tuple_element<7, OutputTuple>::type T7;
+ typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;
+ typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;
+ typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;
+ typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;
+ typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;
+ typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;
+ typedef typename tbb::flow::tuple_element<6, OutputTuple>::type T6;
+ typedef typename tbb::flow::tuple_element<7, OutputTuple>::type T7;
public:
typedef typename wrap_tuple_elements<8, tag_matching_port, OutputTuple>::type input_ports_type;
typedef OutputTuple output_type;
@@ -1275,7 +1401,7 @@ namespace internal {
typedef typename internal::function_body<T5, tag_value> *f5_p;
typedef typename internal::function_body<T6, tag_value> *f6_p;
typedef typename internal::function_body<T7, tag_value> *f7_p;
- typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p > func_initializer_type;
+ typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p > func_initializer_type;
public:
template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7>
unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7) : base_type(g,
@@ -1297,15 +1423,15 @@ namespace internal {
template<typename OutputTuple>
class unfolded_join_node<9,tag_matching_port,OutputTuple,tag_matching> : public
join_base<9,tag_matching_port,OutputTuple,tag_matching>::type {
- typedef typename std::tuple_element<0, OutputTuple>::type T0;
- typedef typename std::tuple_element<1, OutputTuple>::type T1;
- typedef typename std::tuple_element<2, OutputTuple>::type T2;
- typedef typename std::tuple_element<3, OutputTuple>::type T3;
- typedef typename std::tuple_element<4, OutputTuple>::type T4;
- typedef typename std::tuple_element<5, OutputTuple>::type T5;
- typedef typename std::tuple_element<6, OutputTuple>::type T6;
- typedef typename std::tuple_element<7, OutputTuple>::type T7;
- typedef typename std::tuple_element<8, OutputTuple>::type T8;
+ typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;
+ typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;
+ typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;
+ typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;
+ typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;
+ typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;
+ typedef typename tbb::flow::tuple_element<6, OutputTuple>::type T6;
+ typedef typename tbb::flow::tuple_element<7, OutputTuple>::type T7;
+ typedef typename tbb::flow::tuple_element<8, OutputTuple>::type T8;
public:
typedef typename wrap_tuple_elements<9, tag_matching_port, OutputTuple>::type input_ports_type;
typedef OutputTuple output_type;
@@ -1320,7 +1446,7 @@ namespace internal {
typedef typename internal::function_body<T6, tag_value> *f6_p;
typedef typename internal::function_body<T7, tag_value> *f7_p;
typedef typename internal::function_body<T8, tag_value> *f8_p;
- typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p > func_initializer_type;
+ typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p > func_initializer_type;
public:
template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8>
unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8) : base_type(g,
@@ -1343,16 +1469,16 @@ namespace internal {
template<typename OutputTuple>
class unfolded_join_node<10,tag_matching_port,OutputTuple,tag_matching> : public
join_base<10,tag_matching_port,OutputTuple,tag_matching>::type {
- typedef typename std::tuple_element<0, OutputTuple>::type T0;
- typedef typename std::tuple_element<1, OutputTuple>::type T1;
- typedef typename std::tuple_element<2, OutputTuple>::type T2;
- typedef typename std::tuple_element<3, OutputTuple>::type T3;
- typedef typename std::tuple_element<4, OutputTuple>::type T4;
- typedef typename std::tuple_element<5, OutputTuple>::type T5;
- typedef typename std::tuple_element<6, OutputTuple>::type T6;
- typedef typename std::tuple_element<7, OutputTuple>::type T7;
- typedef typename std::tuple_element<8, OutputTuple>::type T8;
- typedef typename std::tuple_element<9, OutputTuple>::type T9;
+ typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;
+ typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;
+ typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;
+ typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;
+ typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;
+ typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;
+ typedef typename tbb::flow::tuple_element<6, OutputTuple>::type T6;
+ typedef typename tbb::flow::tuple_element<7, OutputTuple>::type T7;
+ typedef typename tbb::flow::tuple_element<8, OutputTuple>::type T8;
+ typedef typename tbb::flow::tuple_element<9, OutputTuple>::type T9;
public:
typedef typename wrap_tuple_elements<10, tag_matching_port, OutputTuple>::type input_ports_type;
typedef OutputTuple output_type;
@@ -1368,7 +1494,7 @@ namespace internal {
typedef typename internal::function_body<T7, tag_value> *f7_p;
typedef typename internal::function_body<T8, tag_value> *f8_p;
typedef typename internal::function_body<T9, tag_value> *f9_p;
- typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p, f9_p > func_initializer_type;
+ typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p, f9_p > func_initializer_type;
public:
template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9>
unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8, B9 b9) : base_type(g,
@@ -1390,8 +1516,8 @@ namespace internal {
//! templated function to refer to input ports of the join node
template<size_t N, typename JNT>
- typename std::tuple_element<N, typename JNT::input_ports_type>::type &input_port(JNT &jn) {
- return std::get<N>(jn.input_ports());
+ typename tbb::flow::tuple_element<N, typename JNT::input_ports_type>::type &input_port(JNT &jn) {
+ return tbb::flow::get<N>(jn.input_ports());
}
}
diff --git a/include/tbb/internal/_flow_graph_node_impl.h b/include/tbb/internal/_flow_graph_node_impl.h
index 781454f..4a36fc9 100644
--- a/include/tbb/internal/_flow_graph_node_impl.h
+++ b/include/tbb/internal/_flow_graph_node_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -61,7 +61,7 @@ namespace internal {
class function_input_base : public receiver<Input>, tbb::internal::no_assign {
typedef sender<Input> predecessor_type;
enum op_stat {WAIT=0, SUCCEEDED, FAILED};
- enum op_type {reg_pred, rem_pred, app_body, tryput, try_fwd};
+ enum op_type {reg_pred, rem_pred, app_body, try_fwd, tryput_bypass, app_body_bypass };
typedef function_input_base<Input, A, ImplType> my_class;
public:
@@ -92,18 +92,20 @@ namespace internal {
if ( my_queue ) delete my_queue;
}
- //! Put to the node
- virtual bool try_put( const input_type &t ) {
+ //! Put to the node, returning a task if available
+ virtual task * try_put_task( const input_type &t ) {
if ( my_max_concurrency == 0 ) {
- spawn_body_task( t );
- return true;
+ return create_body_task( t );
} else {
- my_operation op_data(t, tryput);
+ my_operation op_data(t, tryput_bypass);
my_aggregator.execute(&op_data);
- return op_data.status == SUCCEEDED;
+ if(op_data.status == SUCCEEDED ) {
+ return op_data.bypass_t;
+ }
+ return NULL;
}
}
-
+
//! Adds src to the list of cached predecessors.
/* override */ bool register_predecessor( predecessor_type &src ) {
my_operation op_data(reg_pred);
@@ -122,16 +124,29 @@ namespace internal {
protected:
+ void reset_function_input_base() {
+ my_concurrency = 0;
+ if(my_queue) {
+ my_queue->reset();
+ }
+ my_predecessors.reset();
+ forwarder_busy = false;
+ }
+
task *my_root_task;
const size_t my_max_concurrency;
size_t my_concurrency;
function_input_queue<input_type, A> *my_queue;
predecessor_cache<input_type, null_mutex > my_predecessors;
+ /*override*/void reset_receiver() {
+ my_predecessors.reset();
+ }
+
private:
- friend class apply_body_task< my_class, input_type >;
- friend class forward_task< my_class >;
+ friend class apply_body_task_bypass< my_class, input_type >;
+ friend class forward_task_bypass< my_class >;
class my_operation : public aggregated_operation< my_operation > {
public:
@@ -140,6 +155,7 @@ namespace internal {
input_type *elem;
predecessor_type *r;
};
+ tbb::task *bypass_t;
my_operation(const input_type& e, op_type t) :
type(char(t)), elem(const_cast<input_type*>(&e)) {}
my_operation(op_type t) : type(char(t)), r(NULL) {}
@@ -185,28 +201,52 @@ namespace internal {
}
}
break;
- case tryput: internal_try_put(tmp); break;
+ case app_body_bypass: {
+ task * new_task = NULL;
+ __TBB_ASSERT(my_max_concurrency != 0, NULL);
+ --my_concurrency;
+ if (my_concurrency<my_max_concurrency) {
+ input_type i;
+ bool item_was_retrieved = false;
+ if ( my_queue )
+ item_was_retrieved = my_queue->pop(i);
+ else
+ item_was_retrieved = my_predecessors.get_item(i);
+ if (item_was_retrieved) {
+ ++my_concurrency;
+ new_task = create_body_task(i);
+ }
+ }
+ tmp->bypass_t = new_task;
+ __TBB_store_with_release(tmp->status, SUCCEEDED);
+ }
+ break;
+ case tryput_bypass: internal_try_put_task(tmp); break;
case try_fwd: internal_forward(tmp); break;
- }
+ }
}
}
- //! Put to the node
- void internal_try_put(my_operation *op) {
+ //! Put to the node, but return the task instead of enqueueing it
+ void internal_try_put_task(my_operation *op) {
__TBB_ASSERT(my_max_concurrency != 0, NULL);
if (my_concurrency < my_max_concurrency) {
++my_concurrency;
- spawn_body_task(*(op->elem));
+ task * new_task = create_body_task(*(op->elem));
+ op->bypass_t = new_task;
__TBB_store_with_release(op->status, SUCCEEDED);
} else if ( my_queue && my_queue->push(*(op->elem)) ) {
+ op->bypass_t = SUCCESSFULLY_ENQUEUED;
__TBB_store_with_release(op->status, SUCCEEDED);
} else {
+ op->bypass_t = NULL;
__TBB_store_with_release(op->status, FAILED);
}
}
//! Tries to spawn bodies if available and if concurrency allows
void internal_forward(my_operation *op) {
+ op->bypass_t = NULL;
if (my_concurrency<my_max_concurrency || !my_max_concurrency) {
input_type i;
bool item_was_retrieved = false;
@@ -216,8 +256,8 @@ namespace internal {
item_was_retrieved = my_predecessors.get_item(i);
if (item_was_retrieved) {
++my_concurrency;
+ op->bypass_t = create_body_task(i);
__TBB_store_with_release(op->status, SUCCEEDED);
- spawn_body_task(i);
return;
}
}
@@ -226,31 +266,62 @@ namespace internal {
}
//! Applies the body to the provided input
+ // then decides if more work is available
void apply_body( input_type &i ) {
- static_cast<ImplType *>(this)->apply_body_impl(i);
+ task *new_task = apply_body_bypass(i);
+ if(!new_task) return;
+ if(new_task == SUCCESSFULLY_ENQUEUED) return;
+ task::enqueue(*new_task);
+ return;
+ }
+
+ //! Applies the body to the provided input
+ // then decides if more work is available
+ task * apply_body_bypass( input_type &i ) {
+ task * new_task = static_cast<ImplType *>(this)->apply_body_impl_bypass(i);
if ( my_max_concurrency != 0 ) {
- my_operation op_data(app_body);
+ my_operation op_data(app_body_bypass); // tries to pop an item or get_item, enqueues another apply_body
my_aggregator.execute(&op_data);
+ tbb::task *ttask = op_data.bypass_t;
+ new_task = combine_tasks(new_task, ttask);
}
+ return new_task;
}
+ //! allocates a task to call apply_body( input )
+ inline task * create_body_task( const input_type &input ) {
+ return new(task::allocate_additional_child_of(*my_root_task))
+ apply_body_task_bypass < my_class, input_type >(*this, input);
+ }
+
//! Spawns a task that calls apply_body( input )
inline void spawn_body_task( const input_type &input ) {
- task::enqueue(*new(task::allocate_additional_child_of(*my_root_task)) apply_body_task< my_class, input_type >(*this, input));
+ task::enqueue(*create_body_task(input));
}
//! This is executed by an enqueued task, the "forwarder"
- void forward() {
+ task *forward_task() {
my_operation op_data(try_fwd);
+ task *rval = NULL;
do {
op_data.status = WAIT;
my_aggregator.execute(&op_data);
+ if(op_data.status == SUCCEEDED) {
+ tbb::task *ttask = op_data.bypass_t;
+ rval = combine_tasks(rval, ttask);
+ }
} while (op_data.status == SUCCEEDED);
+ return rval;
}
+ inline task *create_forward_task() {
+ task *rval = new(task::allocate_additional_child_of(*my_root_task)) forward_task_bypass< my_class >(*this);
+ return rval;
+ }
+
//! Spawns a task that calls forward()
inline void spawn_forward_task() {
- task::enqueue(*new(task::allocate_additional_child_of(*my_root_task)) forward_task< my_class >(*this));
+ task::enqueue(*create_forward_task());
}
}; // function_input_base
@@ -289,11 +360,17 @@ namespace internal {
return dynamic_cast< internal::function_body_leaf<input_type, output_type, Body> & >(body_ref).get_body();
}
- void apply_body_impl( const input_type &i) {
- successors().try_put( (*my_body)(i) );
+ task * apply_body_impl_bypass( const input_type &i) {
+ task * new_task = successors().try_put_task( (*my_body)(i) );
+ return new_task;
}
protected:
+
+ void reset_function_input() {
+ base_type::reset_function_input_base();
+ }
+
function_body<input_type, output_type> *my_body;
virtual broadcast_cache<output_type > &successors() = 0;
@@ -338,13 +415,22 @@ namespace internal {
return dynamic_cast< internal::multifunction_body_leaf<input_type, output_ports_type, Body> & >(body_ref).get_body();
}
- void apply_body_impl( const input_type &i) {
+ // for multifunction nodes we do not have a single successor as such. So we just tell
+ // the task we were successful.
+ task * apply_body_impl_bypass( const input_type &i) {
(*my_body)(i, my_output_ports);
+ task * new_task = SUCCESSFULLY_ENQUEUED;
+ return new_task;
}
output_ports_type &output_ports(){ return my_output_ports; }
protected:
+
+ void reset() {
+ base_type::reset_function_input_base();
+ }
+
multifunction_body<input_type, output_ports_type> *my_body;
output_ports_type my_output_ports;
@@ -352,8 +438,8 @@ namespace internal {
// template to refer to an output port of a multifunction_node
template<size_t N, typename MOP>
- typename std::tuple_element<N, typename MOP::output_ports_type>::type &output_port(MOP &op) {
- return std::get<N>(op.output_ports());
+ typename tbb::flow::tuple_element<N, typename MOP::output_ports_type>::type &output_port(MOP &op) {
+ return tbb::flow::get<N>(op.output_ports());
}
// helper structs for split_node
@@ -361,7 +447,7 @@ namespace internal {
struct emit_element {
template<typename T, typename P>
static void emit_this(const T &t, P &p) {
- (void)std::get<N-1>(p).try_put(std::get<N-1>(t));
+ (void)tbb::flow::get<N-1>(p).try_put(tbb::flow::get<N-1>(t));
emit_element<N-1>::emit_this(t,p);
}
};
@@ -370,7 +456,7 @@ namespace internal {
struct emit_element<1> {
template<typename T, typename P>
static void emit_this(const T &t, P &p) {
- (void)std::get<0>(p).try_put(std::get<0>(t));
+ (void)tbb::flow::get<0>(p).try_put(tbb::flow::get<0>(t));
}
};
@@ -411,17 +497,18 @@ namespace internal {
virtual broadcast_cache<output_type > &successors() = 0;
- friend class apply_body_task< continue_input< Output >, continue_msg >;
+ friend class apply_body_task_bypass< continue_input< Output >, continue_msg >;
//! Applies the body to the provided input
- /* override */ void apply_body( input_type ) {
- successors().try_put( (*my_body)( continue_msg() ) );
+ /* override */ task *apply_body_bypass( input_type ) {
+ return successors().try_put_task( (*my_body)( continue_msg() ) );
}
//! Spawns a task that applies the body
- /* override */ void execute( ) {
- task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
- apply_body_task< continue_input< Output >, continue_msg >( *this, continue_msg() ) );
+ /* override */ task *execute( ) {
+ task *res = new ( task::allocate_additional_child_of( *my_root_task ) )
+ apply_body_task_bypass< continue_input< Output >, continue_msg >( *this, continue_msg() );
+ return res;
}
};
@@ -457,7 +544,7 @@ namespace internal {
// get<I>(output_ports).try_put(output_value);
//
// return value will be bool returned from successors.try_put.
- bool try_put(const output_type &i) { return my_successors.try_put(i); }
+ task *try_put_task(const output_type &i) { return my_successors.try_put_task(i); }
protected:
broadcast_cache<output_type> my_successors;
@@ -465,6 +552,24 @@ namespace internal {
};
+ template< typename Output >
+ class multifunction_output : public function_output<Output> {
+ public:
+ typedef Output output_type;
+ typedef function_output<output_type> base_type;
+ using base_type::my_successors;
+
+ multifunction_output() : base_type() {my_successors.set_owner(this);}
+ multifunction_output( const multifunction_output &/*other*/) : base_type() { my_successors.set_owner(this); }
+
+ bool try_put(const output_type &i) {
+ task *res = my_successors.try_put_task(i);
+ if(!res) return false;
+ if(res != SUCCESSFULLY_ENQUEUED) task::enqueue(*res);
+ return true;
+ }
+ };
+
} // internal
#endif // __TBB__flow_graph_node_impl_H
diff --git a/include/tbb/internal/_flow_graph_or_impl.h b/include/tbb/internal/_flow_graph_or_impl.h
index 262c27e..37ee950 100644
--- a/include/tbb/internal/_flow_graph_or_impl.h
+++ b/include/tbb/internal/_flow_graph_or_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -38,7 +38,7 @@
namespace internal {
- // Output of the or_node is a struct containing a std::tuple, and will be of
+ // Output of the or_node is a struct containing a tbb::flow::tuple, and will be of
// the form
//
// struct {
@@ -48,7 +48,7 @@ namespace internal {
//
// where the value of indx will indicate which result was put to the
// successor. So if oval is the output to the successor, indx == 0
- // means std::get<0>(oval.result) is the output, and so on.
+ // means tbb::flow::get<0>(oval.result) is the output, and so on.
//
// tuple_types is the tuple that specified the possible outputs (and
// the corresponding inputs to the or_node.)
@@ -57,17 +57,31 @@ namespace internal {
// in the or_node. So the 2nd type in the union that is the
// output type for an or_node OrType is
//
- // std::tuple_element<1,OrType::tuple_types>::type
+ // tbb::flow::tuple_element<1,OrType::tuple_types>::type
// the struct has an OutputTuple default constructed, with element index assigned
// the actual output value.
template<typename OutputTuple>
struct or_output_type {
typedef OutputTuple tuple_types;
- typedef struct {
+ struct type {
size_t indx;
OutputTuple result;
- } type;
+
+// The LLVM libc++ that ships with OS X* 10.7 has a bug in tuple that disables
+// the copy assignment operator (LLVM bug #11921).
+//TODO: introduce according broken macro.
+//it can not be done right now, as tbb_config.h does not allowed to include other headers,
+//and without this it is not possible to detect libc++ version, as compiler version for clang
+//is vendor specific
+#ifdef _LIBCPP_TUPLE
+ type &operator=(type const &x) {
+ indx = x.indx;
+ result = const_cast<OutputTuple&>(x.result);
+ return *this;
+ }
+#endif
+ };
};
template<typename TupleTypes,int N>
@@ -75,7 +89,7 @@ namespace internal {
template<typename OutputType>
static inline void create_output_value(OutputType &o, void *v) {
o.indx = N;
- std::get<N>(o.result) = *(reinterpret_cast<typename std::tuple_element<N, TupleTypes>::type *>(v));
+ tbb::flow::get<N>(o.result) = *(reinterpret_cast<typename tbb::flow::tuple_element<N, TupleTypes>::type *>(v));
}
};
@@ -91,7 +105,7 @@ namespace internal {
}
template<typename PortTuple, typename PutBase>
static inline void set_or_node_pointer(PortTuple &my_input, PutBase *p) {
- std::get<N-1>(my_input).set_up(p, N-1);
+ tbb::flow::get<N-1>(my_input).set_up(p, N-1);
or_helper<TupleTypes,N-1>::set_or_node_pointer(my_input, p);
}
};
@@ -106,12 +120,13 @@ namespace internal {
}
template<typename PortTuple, typename PutBase>
static inline void set_or_node_pointer(PortTuple &my_input, PutBase *p) {
- std::get<0>(my_input).set_up(p, 0);
+ tbb::flow::get<0>(my_input).set_up(p, 0);
}
};
struct put_base {
- virtual bool try_put_with_index(size_t index, void *v) = 0;
+ // virtual bool try_put_with_index(size_t index, void *v) = 0;
+ virtual task * try_put_task_with_index(size_t index, void *v) = 0;
virtual ~put_base() { }
};
@@ -122,15 +137,20 @@ namespace internal {
put_base *my_or_node;
public:
void set_up(put_base *p, size_t i) { my_index = i; my_or_node = p; }
- bool try_put(const T &v) {
- return my_or_node->try_put_with_index(my_index, reinterpret_cast<void *>(const_cast<T*>(&v)));
+ protected:
+ template< typename R, typename B > friend class run_and_put_task;
+ template<typename X, typename Y> friend class internal::broadcast_cache;
+ template<typename X, typename Y> friend class internal::round_robin_cache;
+ task *try_put_task(const T &v) {
+ return my_or_node->try_put_task_with_index(my_index, reinterpret_cast<void *>(const_cast<T*>(&v)));
}
+ /*override*/void reset_receiver() {}
};
template<typename InputTuple, typename OutputType, typename StructTypes>
class or_node_FE : public put_base {
public:
- static const int N = std::tuple_size<InputTuple>::value;
+ static const int N = tbb::flow::tuple_size<InputTuple>::value;
typedef OutputType output_type;
typedef InputTuple input_type;
@@ -147,9 +167,10 @@ namespace internal {
template<typename InputTuple, typename OutputType, typename StructTypes>
class or_node_base : public graph_node, public or_node_FE<InputTuple, OutputType,StructTypes>,
public sender<OutputType> {
+ protected:
using graph_node::my_graph;
public:
- static const size_t N = std::tuple_size<InputTuple>::value;
+ static const size_t N = tbb::flow::tuple_size<InputTuple>::value;
typedef OutputType output_type;
typedef StructTypes tuple_types;
typedef receiver<output_type> successor_type;
@@ -157,7 +178,7 @@ namespace internal {
private:
// ----------- Aggregator ------------
- enum op_type { reg_succ, rem_succ, try__put };
+ enum op_type { reg_succ, rem_succ, try__put_task };
enum op_stat {WAIT=0, SUCCEEDED, FAILED};
typedef or_node_base<InputTuple,output_type,StructTypes> my_class;
@@ -168,6 +189,7 @@ namespace internal {
union {
void *my_arg;
successor_type *my_succ;
+ task *bypass_t;
};
or_node_base_operation(size_t i, const void* e, op_type t) :
type(char(t)), indx(i), my_arg(const_cast<void *>(e)) {}
@@ -196,12 +218,12 @@ namespace internal {
my_successors.remove_successor(*(current->my_succ));
__TBB_store_with_release(current->status, SUCCEEDED);
break;
-
- case try__put:
- output_type oval;
- or_helper<tuple_types,N>::create_output(oval,current->indx,current->my_arg);
- bool res = my_successors.try_put(oval);
- __TBB_store_with_release(current->status, res ? SUCCEEDED : FAILED);
+ case try__put_task: {
+ output_type oo;
+ or_helper<tuple_types,N>::create_output(oo, current->indx, current->my_arg);
+ current->bypass_t = my_successors.try_put_task(oo);
+ __TBB_store_with_release(current->status, SUCCEEDED); // return of try_put_task actual return value
+ }
break;
}
}
@@ -230,12 +252,15 @@ namespace internal {
return op_data.status == SUCCEEDED;
}
- bool try_put_with_index(size_t indx, void *v) {
- or_node_base_operation op_data(indx, v, try__put);
+ task * try_put_task_with_index(size_t indx, void *v) {
+ or_node_base_operation op_data(indx, v, try__put_task);
my_aggregator.execute(&op_data);
- return op_data.status == SUCCEEDED;
+ return op_data.bypass_t;
}
+ protected:
+ /*override*/void reset() {}
+
private:
broadcast_cache<output_type, null_rw_mutex> my_successors;
};
@@ -243,7 +268,7 @@ namespace internal {
// type generators
template<typename OutputTuple>
struct or_types {
- static const int N = std::tuple_size<OutputTuple>::value;
+ static const int N = tbb::flow::tuple_size<OutputTuple>::value;
typedef typename wrap_tuple_elements<N,or_input_port,OutputTuple>::type input_ports_type;
typedef typename or_output_type<OutputTuple>::type output_type;
typedef internal::or_node_FE<input_ports_type,output_type,OutputTuple> or_FE_type;
diff --git a/include/tbb/internal/_flow_graph_tagged_buffer_impl.h b/include/tbb/internal/_flow_graph_tagged_buffer_impl.h
index b9d7acd..bed28f0 100644
--- a/include/tbb/internal/_flow_graph_tagged_buffer_impl.h
+++ b/include/tbb/internal/_flow_graph_tagged_buffer_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -74,7 +74,7 @@ private:
size_t mask() { return my_size - 1; }
static size_t hash(TagType t) {
- return uintptr_t(t)*tbb::internal::size_t_select(0x9E3779B9,0x9E3779B97F4A7C15ULL);
+ return uintptr_t(t)*tbb::internal::select_size_t_constant<0x9E3779B9,0x9E3779B97F4A7C15ULL>::value;
}
void set_up_free_list( element_type **p_free_list, list_array_type *la, size_t sz) {
@@ -120,21 +120,38 @@ private:
ar[h] = my_elem;
}
-public:
- tagged_buffer() : my_size(INITIAL_SIZE), nelements(0) {
+ void internal_initialize_buffer() {
array = pointer_array_allocator_type().allocate(my_size);
for(size_t i = 0; i < my_size; ++i) array[i] = NULL;
lists = new list_array_type(INITIAL_SIZE/2, element_type(), Allocator());
set_up_free_list(&free_list, lists, INITIAL_SIZE/2);
}
- ~tagged_buffer() {
+ void internal_free_buffer() {
if(array) {
pointer_array_allocator_type().deallocate(array, my_size);
+ array = NULL;
}
if(lists) {
delete lists;
+ lists = NULL;
}
+ my_size = INITIAL_SIZE;
+ nelements = 0;
+ }
+
+public:
+ tagged_buffer() : my_size(INITIAL_SIZE), nelements(0) {
+ internal_initialize_buffer();
+ }
+
+ ~tagged_buffer() {
+ internal_free_buffer();
+ }
+
+ void reset() {
+ internal_free_buffer();
+ internal_initialize_buffer();
}
bool tagged_insert(TagType t, value_type v) {
diff --git a/include/tbb/internal/_flow_graph_types_impl.h b/include/tbb/internal/_flow_graph_types_impl.h
index cedda32..98611e3 100644
--- a/include/tbb/internal/_flow_graph_types_impl.h
+++ b/include/tbb/internal/_flow_graph_types_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -41,59 +41,59 @@ namespace internal {
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<1, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type> >
type;
};
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<2, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type>,
- PT<typename std::tuple_element<1,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<1,TypeTuple>::type> >
type;
};
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<3, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type>,
- PT<typename std::tuple_element<1,TypeTuple>::type>,
- PT<typename std::tuple_element<2,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<2,TypeTuple>::type> >
type;
};
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<4, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type>,
- PT<typename std::tuple_element<1,TypeTuple>::type>,
- PT<typename std::tuple_element<2,TypeTuple>::type>,
- PT<typename std::tuple_element<3,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<3,TypeTuple>::type> >
type;
};
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<5, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type>,
- PT<typename std::tuple_element<1,TypeTuple>::type>,
- PT<typename std::tuple_element<2,TypeTuple>::type>,
- PT<typename std::tuple_element<3,TypeTuple>::type>,
- PT<typename std::tuple_element<4,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<4,TypeTuple>::type> >
type;
};
#if __TBB_VARIADIC_MAX >= 6
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<6, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type>,
- PT<typename std::tuple_element<1,TypeTuple>::type>,
- PT<typename std::tuple_element<2,TypeTuple>::type>,
- PT<typename std::tuple_element<3,TypeTuple>::type>,
- PT<typename std::tuple_element<4,TypeTuple>::type>,
- PT<typename std::tuple_element<5,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<5,TypeTuple>::type> >
type;
};
#endif
@@ -101,14 +101,14 @@ namespace internal {
#if __TBB_VARIADIC_MAX >= 7
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<7, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type>,
- PT<typename std::tuple_element<1,TypeTuple>::type>,
- PT<typename std::tuple_element<2,TypeTuple>::type>,
- PT<typename std::tuple_element<3,TypeTuple>::type>,
- PT<typename std::tuple_element<4,TypeTuple>::type>,
- PT<typename std::tuple_element<5,TypeTuple>::type>,
- PT<typename std::tuple_element<6,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<5,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<6,TypeTuple>::type> >
type;
};
#endif
@@ -116,15 +116,15 @@ namespace internal {
#if __TBB_VARIADIC_MAX >= 8
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<8, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type>,
- PT<typename std::tuple_element<1,TypeTuple>::type>,
- PT<typename std::tuple_element<2,TypeTuple>::type>,
- PT<typename std::tuple_element<3,TypeTuple>::type>,
- PT<typename std::tuple_element<4,TypeTuple>::type>,
- PT<typename std::tuple_element<5,TypeTuple>::type>,
- PT<typename std::tuple_element<6,TypeTuple>::type>,
- PT<typename std::tuple_element<7,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<5,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<6,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<7,TypeTuple>::type> >
type;
};
#endif
@@ -132,16 +132,16 @@ namespace internal {
#if __TBB_VARIADIC_MAX >= 9
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<9, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type>,
- PT<typename std::tuple_element<1,TypeTuple>::type>,
- PT<typename std::tuple_element<2,TypeTuple>::type>,
- PT<typename std::tuple_element<3,TypeTuple>::type>,
- PT<typename std::tuple_element<4,TypeTuple>::type>,
- PT<typename std::tuple_element<5,TypeTuple>::type>,
- PT<typename std::tuple_element<6,TypeTuple>::type>,
- PT<typename std::tuple_element<7,TypeTuple>::type>,
- PT<typename std::tuple_element<8,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<5,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<6,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<7,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<8,TypeTuple>::type> >
type;
};
#endif
@@ -149,17 +149,17 @@ namespace internal {
#if __TBB_VARIADIC_MAX >= 10
template<template<class> class PT, typename TypeTuple>
struct wrap_tuple_elements<10, PT, TypeTuple> {
- typedef typename std::tuple<
- PT<typename std::tuple_element<0,TypeTuple>::type>,
- PT<typename std::tuple_element<1,TypeTuple>::type>,
- PT<typename std::tuple_element<2,TypeTuple>::type>,
- PT<typename std::tuple_element<3,TypeTuple>::type>,
- PT<typename std::tuple_element<4,TypeTuple>::type>,
- PT<typename std::tuple_element<5,TypeTuple>::type>,
- PT<typename std::tuple_element<6,TypeTuple>::type>,
- PT<typename std::tuple_element<7,TypeTuple>::type>,
- PT<typename std::tuple_element<8,TypeTuple>::type>,
- PT<typename std::tuple_element<9,TypeTuple>::type> >
+ typedef typename tbb::flow::tuple<
+ PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<5,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<6,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<7,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<8,TypeTuple>::type>,
+ PT<typename tbb::flow::tuple_element<9,TypeTuple>::type> >
type;
};
#endif
diff --git a/include/tbb/internal/_tbb_windef.h b/include/tbb/internal/_tbb_windef.h
index da0a587..4f11a13 100644
--- a/include/tbb/internal/_tbb_windef.h
+++ b/include/tbb/internal/_tbb_windef.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -32,8 +32,8 @@
// Check that the target Windows version has all API calls requried for TBB.
// Do not increase the version in condition beyond 0x0500 without prior discussion!
-#if defined(_WIN32_WINNT) && _WIN32_WINNT<0x0400
-#error TBB is unable to run on old Windows versions; _WIN32_WINNT must be 0x0400 or greater.
+#if defined(_WIN32_WINNT) && _WIN32_WINNT<0x0501
+#error TBB is unable to run on old Windows versions; _WIN32_WINNT must be 0x0501 or greater.
#endif
#if !defined(_MT)
diff --git a/include/tbb/machine/gcc_armv7.h b/include/tbb/machine/gcc_armv7.h
new file mode 100644
index 0000000..fde1f7a
--- /dev/null
+++ b/include/tbb/machine/gcc_armv7.h
@@ -0,0 +1,222 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+/*
+ Platform isolation layer for the ARMv7-a architecture.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+//TODO: is ARMv7 is the only version ever to support?
+#if !(__ARM_ARCH_7A__)
+#error compilation requires an ARMv7-a architecture.
+#endif
+
+#include <sys/param.h>
+#include <unistd.h>
+
+#define __TBB_WORDSIZE 4
+
+// Traditionally ARM is little-endian.
+// Note that, since only the layout of aligned 32-bit words is of interest,
+// any apparent PDP-endianness of 32-bit words at half-word alignment or
+// any little-endian ordering of big-endian 32-bit words in 64-bit quantities
+// may be disregarded for this setting.
+#if __BIG_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__)
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG
+#elif __LITTLE_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__)
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
+#elif defined(__BYTE_ORDER__)
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED
+#else
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT
+#endif
+
+
+#define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
+#define __TBB_full_memory_fence() __asm__ __volatile__("dmb ish": : :"memory")
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_full_memory_fence()
+#define __TBB_release_consistency_helper() __TBB_full_memory_fence()
+
+//--------------------------------------------------
+// Compare and swap
+//--------------------------------------------------
+
+/**
+ * Atomic CAS for 32 bit values, if *ptr==comparand, then *ptr=value, returns *ptr
+ * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand
+ * @param value value to assign *ptr to if *ptr==comparand
+ * @param comparand value to compare with *ptr
+ * @return value originally in memory at ptr, regardless of success
+*/
+static inline int32_t __TBB_machine_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand )
+{
+ int32_t oldval, res;
+
+ __TBB_full_memory_fence();
+
+ do {
+ __asm__ __volatile__(
+ "ldrex %1, [%3]\n"
+ "mov %0, #0\n"
+ "cmp %1, %4\n"
+ "strexeq %0, %5, [%3]\n"
+ : "=&r" (res), "=&r" (oldval), "+Qo" (*(volatile int32_t*)ptr)
+ : "r" ((int32_t *)ptr), "Ir" (comparand), "r" (value)
+ : "cc");
+ } while (res);
+
+ __TBB_full_memory_fence();
+
+ return oldval;
+}
+
+/**
+ * Atomic CAS for 64 bit values, if *ptr==comparand, then *ptr=value, returns *ptr
+ * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand
+ * @param value value to assign *ptr to if *ptr==comparand
+ * @param comparand value to compare with *ptr
+ * @return value originally in memory at ptr, regardless of success
+ */
+static inline int64_t __TBB_machine_cmpswp8(volatile void *ptr, int64_t value, int64_t comparand )
+{
+ int64_t oldval;
+ int32_t res;
+
+ __TBB_full_memory_fence();
+
+ do {
+ __asm__ __volatile__(
+ "mov %0, #0\n"
+ "ldrexd %1, %H1, [%3]\n"
+ "cmp %1, %4\n"
+ "cmpeq %H1, %H4\n"
+ "strexdeq %0, %5, %H5, [%3]"
+ : "=&r" (res), "=&r" (oldval), "+Qo" (*(volatile int64_t*)ptr)
+ : "r" ((int64_t *)ptr), "r" (comparand), "r" (value)
+ : "cc");
+ } while (res);
+
+ __TBB_full_memory_fence();
+
+ return oldval;
+}
+
+static inline int32_t __TBB_machine_fetchadd4(volatile void* ptr, int32_t addend)
+{
+ unsigned long tmp;
+ int32_t result, tmp2;
+
+ __TBB_full_memory_fence();
+
+ __asm__ __volatile__(
+"1: ldrex %0, [%4]\n"
+" add %3, %0, %5\n"
+" strex %1, %3, [%4]\n"
+" cmp %1, #0\n"
+" bne 1b\n"
+ : "=&r" (result), "=&r" (tmp), "+Qo" (*(volatile int32_t*)ptr), "=&r"(tmp2)
+ : "r" ((int32_t *)ptr), "Ir" (addend)
+ : "cc");
+
+ __TBB_full_memory_fence();
+
+ return result;
+}
+
+static inline int64_t __TBB_machine_fetchadd8(volatile void *ptr, int64_t addend)
+{
+ unsigned long tmp;
+ int64_t result, tmp2;
+
+ __TBB_full_memory_fence();
+
+ __asm__ __volatile__(
+"1: ldrexd %0, %H0, [%4]\n"
+" adds %3, %0, %5\n"
+" adc %H3, %H0, %H5\n"
+" strexd %1, %3, %H3, [%4]\n"
+" cmp %1, #0\n"
+" bne 1b"
+ : "=&r" (result), "=&r" (tmp), "+Qo" (*(volatile int64_t*)ptr), "=&r"(tmp2)
+ : "r" ((int64_t *)ptr), "r" (addend)
+ : "cc");
+
+
+ __TBB_full_memory_fence();
+
+ return result;
+}
+
+inline void __TBB_machine_pause (int32_t delay )
+{
+ while(delay>0)
+ {
+ __TBB_compiler_fence();
+ delay--;
+ }
+}
+
+namespace tbb {
+namespace internal {
+ template <typename T, size_t S>
+ struct machine_load_store_relaxed {
+ static inline T load ( const volatile T& location ) {
+ const T value = location;
+
+ /*
+ * An extra memory barrier is required for errata #761319
+ * Please see http://infocenter.arm.com/help/topic/com.arm.doc.uan0004a
+ */
+ __TBB_acquire_consistency_helper();
+ return value;
+ }
+
+ static inline void store ( volatile T& location, T value ) {
+ location = value;
+ }
+ };
+}} // namespaces internal, tbb
+
+// Machine specific atomic operations
+
+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+
+// Use generics for some things
+#define __TBB_USE_GENERIC_PART_WORD_CAS 1
+#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD 1
+#define __TBB_USE_GENERIC_PART_WORD_FETCH_STORE 1
+#define __TBB_USE_GENERIC_FETCH_STORE 1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
+#define __TBB_USE_GENERIC_DWORD_LOAD_STORE 1
+#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1
diff --git a/include/tbb/machine/gcc_generic.h b/include/tbb/machine/gcc_generic.h
index e424283..b1ffc57 100644
--- a/include/tbb/machine/gcc_generic.h
+++ b/include/tbb/machine/gcc_generic.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -37,14 +37,25 @@
#define __TBB_WORDSIZE __SIZEOF_POINTER__
-#ifdef __BYTE_ORDER__
- #if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__
- #define __TBB_BIG_ENDIAN 1
- #elif __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__
- #define __TBB_BIG_ENDIAN 0
- #elif __BYTE_ORDER__==__ORDER_PDP_ENDIAN__
- #define __TBB_BIG_ENDIAN -1 // not currently supported
- #endif
+#if __TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN
+ #define __TBB_64BIT_ATOMICS 0
+#endif
+
+/** FPU control setting not available for non-Intel architectures on Android **/
+#if __ANDROID__ && __TBB_generic_arch
+ #define __TBB_CPU_CTL_ENV_PRESENT 0
+#endif
+
+// __BYTE_ORDER__ is used in accordance with http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html,
+// but __BIG_ENDIAN__ or __LITTLE_ENDIAN__ may be more commonly found instead.
+#if __BIG_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__)
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG
+#elif __LITTLE_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__)
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
+#elif defined(__BYTE_ORDER__)
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED
+#else
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT
#endif
/** As this generic implementation has absolutely no information about underlying
@@ -100,7 +111,7 @@ inline bool __TBB_machine_try_lock_byte( __TBB_atomic_flag &flag ) {
return __sync_lock_test_and_set(&flag,1)==0;
}
-inline void __TBB_machine_unlock_byte( __TBB_atomic_flag &flag , __TBB_Flag) {
+inline void __TBB_machine_unlock_byte( __TBB_atomic_flag &flag ) {
__sync_lock_release(&flag);
}
diff --git a/include/tbb/machine/gcc_ia32_common.h b/include/tbb/machine/gcc_ia32_common.h
new file mode 100644
index 0000000..6127045
--- /dev/null
+++ b/include/tbb/machine/gcc_ia32_common.h
@@ -0,0 +1,97 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_gcc_ia32_common_H
+#define __TBB_machine_gcc_ia32_common_H
+
+//TODO: Add a higher-level function, e.g. tbb::interal::log2(), into tbb_stddef.h, which
+//uses __TBB_Log2 and contains the assert and remove the assert from here and all other
+//platform-specific headers.
+//TODO: Check if use of gcc intrinsic gives a better chance for cross call optimizations
+static inline intptr_t __TBB_machine_lg( uintptr_t x ) {
+ __TBB_ASSERT(x, "__TBB_Log2(0) undefined");
+ uintptr_t j;
+ __asm__ ("bsr %1,%0" : "=r"(j) : "r"(x));
+ return j;
+}
+#define __TBB_Log2(V) __TBB_machine_lg(V)
+
+#ifndef __TBB_Pause
+//TODO: check if raising a ratio of pause instructions to loop control instructions
+//(via e.g. loop unrolling) gives any benefit for HT. E.g, the current implementation
+//does about 2 CPU-consuming instructions for every pause instruction. Perhaps for
+//high pause counts it should use an unrolled loop to raise the ratio, and thus free
+//up more integer cycles for the other hyperthread. On the other hand, if the loop is
+//unrolled too far, it won't fit in the core's loop cache, and thus take away
+//instruction decode slots from the other hyperthread.
+
+//TODO: check if use of gcc __builtin_ia32_pause intrinsic gives a "some how" better performing code
+static inline void __TBB_machine_pause( int32_t delay ) {
+ for (int32_t i = 0; i < delay; i++) {
+ __asm__ __volatile__("pause;");
+ }
+ return;
+}
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+#endif /* !__TBB_Pause */
+
+// API to retrieve/update FPU control setting
+#ifndef __TBB_CPU_CTL_ENV_PRESENT
+#define __TBB_CPU_CTL_ENV_PRESENT 1
+
+struct __TBB_cpu_ctl_env_t {
+ int mxcsr;
+ short x87cw;
+};
+inline void __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* ctl ) {
+#if __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN
+ __TBB_cpu_ctl_env_t loc_ctl;
+ __asm__ __volatile__ (
+ "stmxcsr %0\n\t"
+ "fstcw %1"
+ : "=m"(loc_ctl.mxcsr), "=m"(loc_ctl.x87cw)
+ );
+ *ctl = loc_ctl;
+#else
+ __asm__ __volatile__ (
+ "stmxcsr %0\n\t"
+ "fstcw %1"
+ : "=m"(ctl->mxcsr), "=m"(ctl->x87cw)
+ );
+#endif
+}
+inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
+ __asm__ __volatile__ (
+ "ldmxcsr %0\n\t"
+ "fldcw %1"
+ : : "m"(ctl->mxcsr), "m"(ctl->x87cw)
+ );
+}
+#endif /* !__TBB_CPU_CTL_ENV_PRESENT */
+
+#endif /* __TBB_machine_gcc_ia32_common_H */
diff --git a/include/tbb/machine/ibm_aix51.h b/include/tbb/machine/ibm_aix51.h
index 4d880db..ec50cfb 100644
--- a/include/tbb/machine/ibm_aix51.h
+++ b/include/tbb/machine/ibm_aix51.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -35,7 +35,7 @@
#define __TBB_machine_ibm_aix51_H
#define __TBB_WORDSIZE 8
-#define __TBB_BIG_ENDIAN 1 // assumption based on operating system
+#define __TBB_ENDIANNESS __TBB_ENDIAN_BIG // assumption based on operating system
#include <stdint.h>
#include <unistd.h>
diff --git a/include/tbb/machine/icc_generic.h b/include/tbb/machine/icc_generic.h
new file mode 100644
index 0000000..a0ae2c1
--- /dev/null
+++ b/include/tbb/machine/icc_generic.h
@@ -0,0 +1,258 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_icc_generic_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#if ! __TBB_ICC_BUILTIN_ATOMICS_PRESENT
+ #error "Intel C++ Compiler of at least 12.1 version is needed to use ICC intrinsics port"
+#endif
+
+#define __TBB_machine_icc_generic_H
+
+//ICC mimics the "native" target compiler
+#if _MSC_VER
+ #include "msvc_ia32_common.h"
+#else
+ #include "gcc_ia32_common.h"
+#endif
+
+//TODO: Make __TBB_WORDSIZE macro optional for ICC intrinsics port.
+//As compiler intrinsics are used for all the operations it is possible to do.
+
+#if __TBB_x86_32
+ #define __TBB_WORDSIZE 4
+#else
+ #define __TBB_WORDSIZE 8
+#endif
+#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
+
+//__TBB_compiler_fence() defined just in case, as it seems not to be used on its own anywhere else
+#if _MSC_VER
+ //TODO: any way to use same intrinsics on windows and linux?
+ #pragma intrinsic(_ReadWriteBarrier)
+ #pragma intrinsic(_mm_mfence)
+ #define __TBB_compiler_fence() _ReadWriteBarrier()
+ #define __TBB_full_memory_fence() _mm_mfence()
+#else
+ #define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
+ #define __TBB_full_memory_fence() __asm__ __volatile__("mfence": : :"memory")
+#endif
+
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+
+namespace tbb { namespace internal {
+//TODO: is there any way to reuse definition of memory_order enum from ICC instead of copy paste.
+//however it seems unlikely that ICC will silently change exact enum values, as they are defined
+//in the ISO exactly like this.
+//TODO: add test that exact values of the enum are same as in the ISO C++11
+typedef enum memory_order {
+ memory_order_relaxed, memory_order_consume, memory_order_acquire,
+ memory_order_release, memory_order_acq_rel, memory_order_seq_cst
+} memory_order;
+
+namespace icc_intrinsics_port {
+ template <typename T>
+ T convert_argument(T value){
+ return value;
+ }
+ //The overload below is needed to have explicit conversion of pointer to void* in argument list.
+ //compiler bug?
+ //TODO: add according broken macro and recheck with ICC 13.0 if the overload is still needed
+ template <typename T>
+ void* convert_argument(T* value){
+ return (void*)value;
+ }
+}
+//TODO: code below is a bit repetitive, consider simplifying it
+template <typename T, size_t S>
+struct machine_load_store {
+ static T load_with_acquire ( const volatile T& location ) {
+ return __atomic_load_explicit(&location, memory_order_acquire);
+ }
+ static void store_with_release ( volatile T &location, T value ) {
+ __atomic_store_explicit(&location, icc_intrinsics_port::convert_argument(value), memory_order_release);
+ }
+};
+
+template <typename T, size_t S>
+struct machine_load_store_relaxed {
+ static inline T load ( const T& location ) {
+ return __atomic_load_explicit(&location, memory_order_relaxed);
+ }
+ static inline void store ( T& location, T value ) {
+ __atomic_store_explicit(&location, icc_intrinsics_port::convert_argument(value), memory_order_relaxed);
+ }
+};
+
+template <typename T, size_t S>
+struct machine_load_store_seq_cst {
+ static T load ( const volatile T& location ) {
+ return __atomic_load_explicit(&location, memory_order_seq_cst);
+ }
+
+ static void store ( volatile T &location, T value ) {
+ __atomic_store_explicit(&location, value, memory_order_seq_cst);
+ }
+};
+
+}} // namespace tbb::internal
+
+namespace tbb{ namespace internal { namespace icc_intrinsics_port{
+ typedef enum memory_order_map {
+ relaxed = memory_order_relaxed,
+ acquire = memory_order_acquire,
+ release = memory_order_release,
+ full_fence= memory_order_seq_cst
+ } memory_order_map;
+}}}// namespace tbb::internal
+
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,M) \
+inline T __TBB_machine_cmpswp##S##M( volatile void *ptr, T value, T comparand ) { \
+ __atomic_compare_exchange_strong_explicit( \
+ (T*)ptr \
+ ,&comparand \
+ ,value \
+ , tbb::internal::icc_intrinsics_port::M \
+ , tbb::internal::icc_intrinsics_port::M); \
+ return comparand; \
+} \
+ \
+inline T __TBB_machine_fetchstore##S##M(volatile void *ptr, T value) { \
+ return __atomic_exchange_explicit((T*)ptr, value, tbb::internal::icc_intrinsics_port::M); \
+} \
+ \
+inline T __TBB_machine_fetchadd##S##M(volatile void *ptr, T value) { \
+ return __atomic_fetch_add_explicit((T*)ptr, value, tbb::internal::icc_intrinsics_port::M); \
+} \
+
+__TBB_MACHINE_DEFINE_ATOMICS(1,tbb::internal::int8_t, full_fence)
+__TBB_MACHINE_DEFINE_ATOMICS(1,tbb::internal::int8_t, acquire)
+__TBB_MACHINE_DEFINE_ATOMICS(1,tbb::internal::int8_t, release)
+__TBB_MACHINE_DEFINE_ATOMICS(1,tbb::internal::int8_t, relaxed)
+
+__TBB_MACHINE_DEFINE_ATOMICS(2,tbb::internal::int16_t, full_fence)
+__TBB_MACHINE_DEFINE_ATOMICS(2,tbb::internal::int16_t, acquire)
+__TBB_MACHINE_DEFINE_ATOMICS(2,tbb::internal::int16_t, release)
+__TBB_MACHINE_DEFINE_ATOMICS(2,tbb::internal::int16_t, relaxed)
+
+__TBB_MACHINE_DEFINE_ATOMICS(4,tbb::internal::int32_t, full_fence)
+__TBB_MACHINE_DEFINE_ATOMICS(4,tbb::internal::int32_t, acquire)
+__TBB_MACHINE_DEFINE_ATOMICS(4,tbb::internal::int32_t, release)
+__TBB_MACHINE_DEFINE_ATOMICS(4,tbb::internal::int32_t, relaxed)
+
+__TBB_MACHINE_DEFINE_ATOMICS(8,tbb::internal::int64_t, full_fence)
+__TBB_MACHINE_DEFINE_ATOMICS(8,tbb::internal::int64_t, acquire)
+__TBB_MACHINE_DEFINE_ATOMICS(8,tbb::internal::int64_t, release)
+__TBB_MACHINE_DEFINE_ATOMICS(8,tbb::internal::int64_t, relaxed)
+
+
+#undef __TBB_MACHINE_DEFINE_ATOMICS
+
+#define __TBB_USE_FENCED_ATOMICS 1
+
+namespace tbb { namespace internal {
+#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN
+__TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(full_fence)
+__TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(full_fence)
+
+__TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(acquire)
+__TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(release)
+
+__TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(relaxed)
+__TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(relaxed)
+
+template <typename T>
+struct machine_load_store<T,8> {
+ static T load_with_acquire ( const volatile T& location ) {
+ if( tbb::internal::is_aligned(&location,8)) {
+ return __atomic_load_explicit(&location, memory_order_acquire);
+ } else {
+ return __TBB_machine_generic_load8acquire(&location);
+ }
+ }
+ static void store_with_release ( volatile T &location, T value ) {
+ if( tbb::internal::is_aligned(&location,8)) {
+ __atomic_store_explicit(&location, icc_intrinsics_port::convert_argument(value), memory_order_release);
+ } else {
+ return __TBB_machine_generic_store8release(&location,value);
+ }
+ }
+};
+
+template <typename T>
+struct machine_load_store_relaxed<T,8> {
+ static T load( const volatile T& location ) {
+ if( tbb::internal::is_aligned(&location,8)) {
+ return __atomic_load_explicit(&location, memory_order_relaxed);
+ } else {
+ return __TBB_machine_generic_load8relaxed(&location);
+ }
+ }
+ static void store( volatile T &location, T value ) {
+ if( tbb::internal::is_aligned(&location,8)) {
+ __atomic_store_explicit(&location, icc_intrinsics_port::convert_argument(value), memory_order_relaxed);
+ } else {
+ return __TBB_machine_generic_store8relaxed(&location,value);
+ }
+ }
+};
+
+template <typename T >
+struct machine_load_store_seq_cst<T,8> {
+ static T load ( const volatile T& location ) {
+ if( tbb::internal::is_aligned(&location,8)) {
+ return __atomic_load_explicit(&location, memory_order_seq_cst);
+ } else {
+ return __TBB_machine_generic_load8full_fence(&location);
+ }
+
+ }
+
+ static void store ( volatile T &location, T value ) {
+ if( tbb::internal::is_aligned(&location,8)) {
+ __atomic_store_explicit(&location, value, memory_order_seq_cst);
+ } else {
+ return __TBB_machine_generic_store8full_fence(&location,value);
+ }
+
+ }
+};
+
+#endif
+}} // namespace tbb::internal
+template <typename T>
+inline void __TBB_machine_OR( T *operand, T addend ) {
+ __atomic_fetch_or_explicit(operand, addend, tbb::internal::memory_order_seq_cst);
+}
+
+template <typename T>
+inline void __TBB_machine_AND( T *operand, T addend ) {
+ __atomic_fetch_and_explicit(operand, addend, tbb::internal::memory_order_seq_cst);
+}
diff --git a/include/tbb/machine/linux_common.h b/include/tbb/machine/linux_common.h
index 2eeffb9..c412807 100644
--- a/include/tbb/machine/linux_common.h
+++ b/include/tbb/machine/linux_common.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -33,6 +33,7 @@
#include <sched.h>
#define __TBB_Yield() sched_yield()
+#include <unistd.h>
/* Futex definitions */
#include <sys/syscall.h>
@@ -64,7 +65,7 @@ namespace tbb {
namespace internal {
inline int futex_wait( void *futex, int comparand ) {
- int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAIT,comparand,NULL,NULL,0 );
+ int r = syscall( SYS_futex,futex,__TBB_FUTEX_WAIT,comparand,NULL,NULL,0 );
#if TBB_USE_ASSERT
int e = errno;
__TBB_ASSERT( r==0||r==EWOULDBLOCK||(r==-1&&(e==EAGAIN||e==EINTR)), "futex_wait failed." );
diff --git a/include/tbb/machine/linux_ia32.h b/include/tbb/machine/linux_ia32.h
index d243a74..ff2f5b4 100644
--- a/include/tbb/machine/linux_ia32.h
+++ b/include/tbb/machine/linux_ia32.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -33,10 +33,10 @@
#define __TBB_machine_linux_ia32_H
#include <stdint.h>
-#include <unistd.h>
+#include "gcc_ia32_common.h"
#define __TBB_WORDSIZE 4
-#define __TBB_BIG_ENDIAN 0
+#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
#define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
#define __TBB_control_consistency_helper() __TBB_compiler_fence()
@@ -93,9 +93,11 @@ __TBB_MACHINE_DEFINE_ATOMICS(4,int32_t,"l","=r")
#endif
static inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand ) {
-#if __TBB_GCC_BUILTIN_ATOMICS_PRESENT
+//TODO: remove the extra part of condition once __TBB_GCC_BUILTIN_ATOMICS_PRESENT is lowered to gcc version 4.1.2
+#if __TBB_GCC_BUILTIN_ATOMICS_PRESENT || __TBB_GCC_VERSION >= 40304
return __sync_val_compare_and_swap( reinterpret_cast<volatile int64_t*>(ptr), comparand, value );
#else /* !__TBB_GCC_BUILTIN_ATOMICS_PRESENT */
+ //TODO: look like ICC 13.0 has some issues with this code, investigate it more deeply
int64_t result;
union {
int64_t i64;
@@ -148,12 +150,6 @@ static inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value,
#pragma warning( pop )
#endif // warning 998 is back
-static inline int32_t __TBB_machine_lg( uint32_t x ) {
- int32_t j;
- __asm__ ("bsr %1,%0" : "=r"(j) : "r"(x));
- return j;
-}
-
static inline void __TBB_machine_or( volatile void *ptr, uint32_t addend ) {
__asm__ __volatile__("lock\norl %1,%0" : "=m"(*(__TBB_VOLATILE uint32_t *)ptr) : "r"(addend), "m"(*(__TBB_VOLATILE uint32_t *)ptr) : "memory");
}
@@ -162,13 +158,6 @@ static inline void __TBB_machine_and( volatile void *ptr, uint32_t addend ) {
__asm__ __volatile__("lock\nandl %1,%0" : "=m"(*(__TBB_VOLATILE uint32_t *)ptr) : "r"(addend), "m"(*(__TBB_VOLATILE uint32_t *)ptr) : "memory");
}
-static inline void __TBB_machine_pause( int32_t delay ) {
- for (int32_t i = 0; i < delay; i++) {
- __asm__ __volatile__("pause;");
- }
- return;
-}
-
//TODO: Check if it possible and profitable for IA-32 on (Linux and Windows)
//to use of 64-bit load/store via floating point registers together with full fence
//for sequentially consistent load/store, instead of CAS.
@@ -181,17 +170,32 @@ static inline void __TBB_machine_pause( int32_t delay ) {
#define __TBB_fistpq "fistpq"
#endif
-static inline int64_t __TBB_machine_load8 (const volatile void *ptr) {
+static inline int64_t __TBB_machine_aligned_load8 (const volatile void *ptr) {
+ __TBB_ASSERT(tbb::internal::is_aligned(ptr,8),"__TBB_machine_aligned_load8 should be used with 8 byte aligned locations only \n");
int64_t result;
- if( ((uint32_t)ptr&7u)==0 ) {
- // Aligned load
- __asm__ __volatile__ ( __TBB_fildq " %1\n\t"
- __TBB_fistpq " %0" : "=m"(result) : "m"(*(const __TBB_VOLATILE uint64_t*)ptr) : "memory" );
+ __asm__ __volatile__ ( __TBB_fildq " %1\n\t"
+ __TBB_fistpq " %0" : "=m"(result) : "m"(*(const __TBB_VOLATILE uint64_t*)ptr) : "memory" );
+ return result;
+}
+
+static inline void __TBB_machine_aligned_store8 (volatile void *ptr, int64_t value ) {
+ __TBB_ASSERT(tbb::internal::is_aligned(ptr,8),"__TBB_machine_aligned_store8 should be used with 8 byte aligned locations only \n");
+ // Aligned store
+ __asm__ __volatile__ ( __TBB_fildq " %1\n\t"
+ __TBB_fistpq " %0" : "=m"(*(__TBB_VOLATILE int64_t*)ptr) : "m"(value) : "memory" );
+}
+
+static inline int64_t __TBB_machine_load8 (const volatile void *ptr) {
+#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN
+ if( tbb::internal::is_aligned(ptr,8)) {
+#endif
+ return __TBB_machine_aligned_load8(ptr);
+#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN
} else {
// Unaligned load
- result = __TBB_machine_cmpswp8(const_cast<void*>(ptr),0,0);
+ return __TBB_machine_cmpswp8(const_cast<void*>(ptr),0,0);
}
- return result;
+#endif
}
//! Handles misaligned 8-byte store
@@ -200,10 +204,11 @@ extern "C" void __TBB_machine_store8_slow( volatile void *ptr, int64_t value );
extern "C" void __TBB_machine_store8_slow_perf_warning( volatile void *ptr );
static inline void __TBB_machine_store8(volatile void *ptr, int64_t value) {
- if( ((uint32_t)ptr&7u)==0 ) {
- // Aligned store
- __asm__ __volatile__ ( __TBB_fildq " %1\n\t"
- __TBB_fistpq " %0" : "=m"(*(__TBB_VOLATILE int64_t*)ptr) : "m"(value) : "memory" );
+#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN
+ if( tbb::internal::is_aligned(ptr,8)) {
+#endif
+ __TBB_machine_aligned_store8(ptr,value);
+#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN
} else {
// Unaligned store
#if TBB_USE_PERFORMANCE_WARNINGS
@@ -211,16 +216,13 @@ static inline void __TBB_machine_store8(volatile void *ptr, int64_t value) {
#endif /* TBB_USE_PERFORMANCE_WARNINGS */
__TBB_machine_store8_slow(ptr,value);
}
+#endif
}
// Machine specific atomic operations
#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
-// Definition of other functions
-#define __TBB_Pause(V) __TBB_machine_pause(V)
-#define __TBB_Log2(V) __TBB_machine_lg(V)
-
#define __TBB_USE_GENERIC_DWORD_FETCH_ADD 1
#define __TBB_USE_GENERIC_DWORD_FETCH_STORE 1
#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE 1
@@ -228,25 +230,3 @@ static inline void __TBB_machine_store8(volatile void *ptr, int64_t value) {
#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1
-// API to retrieve/update FPU control setting
-#define __TBB_CPU_CTL_ENV_PRESENT 1
-
-struct __TBB_cpu_ctl_env_t {
- int mxcsr;
- short x87cw;
-};
-
-inline void __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* ctl ) {
- __asm__ __volatile__ (
- "stmxcsr %0\n\t"
- "fstcw %1"
- : "=m"(ctl->mxcsr), "=m"(ctl->x87cw)
- );
-}
-inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
- __asm__ __volatile__ (
- "ldmxcsr %0\n\t"
- "fldcw %1"
- : : "m"(ctl->mxcsr), "m"(ctl->x87cw)
- );
-}
diff --git a/include/tbb/machine/linux_ia64.h b/include/tbb/machine/linux_ia64.h
index b687239..d0d0d6a 100644
--- a/include/tbb/machine/linux_ia64.h
+++ b/include/tbb/machine/linux_ia64.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -33,11 +33,10 @@
#define __TBB_machine_linux_ia64_H
#include <stdint.h>
-#include <unistd.h>
#include <ia64intrin.h>
#define __TBB_WORDSIZE 8
-#define __TBB_BIG_ENDIAN 0
+#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
#if __INTEL_COMPILER
#define __TBB_compiler_fence()
@@ -56,6 +55,7 @@
#endif /* !__INTEL_COMPILER */
// Most of the functions will be in a .s file
+// TODO: revise dynamic_link, memory pools and etc. if the library dependency is removed.
extern "C" {
int8_t __TBB_machine_fetchadd1__TBB_full_fence (volatile void *ptr, int8_t addend);
diff --git a/include/tbb/machine/linux_intel64.h b/include/tbb/machine/linux_intel64.h
index 4803344..85c948b 100644
--- a/include/tbb/machine/linux_intel64.h
+++ b/include/tbb/machine/linux_intel64.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -33,10 +33,10 @@
#define __TBB_machine_linux_intel64_H
#include <stdint.h>
-#include <unistd.h>
+#include "gcc_ia32_common.h"
#define __TBB_WORDSIZE 8
-#define __TBB_BIG_ENDIAN 0
+#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
#define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
#define __TBB_control_consistency_helper() __TBB_compiler_fence()
@@ -86,13 +86,6 @@ __TBB_MACHINE_DEFINE_ATOMICS(8,int64_t,"q")
#undef __TBB_MACHINE_DEFINE_ATOMICS
-static inline int64_t __TBB_machine_lg( uint64_t x ) {
- __TBB_ASSERT(x, "__TBB_Log2(0) undefined");
- int64_t j;
- __asm__ ("bsr %1,%0" : "=r"(j) : "r"(x));
- return j;
-}
-
static inline void __TBB_machine_or( volatile void *ptr, uint64_t value ) {
__asm__ __volatile__("lock\norq %1,%0" : "=m"(*(volatile uint64_t*)ptr) : "r"(value), "m"(*(volatile uint64_t*)ptr) : "memory");
}
@@ -104,55 +97,7 @@ static inline void __TBB_machine_and( volatile void *ptr, uint64_t value ) {
#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
-// Definition of other functions
-#ifndef __TBB_Pause
-static inline void __TBB_machine_pause( int32_t delay ) {
- for (int32_t i = 0; i < delay; i++) {
- __asm__ __volatile__("pause;");
- }
- return;
-}
-#define __TBB_Pause(V) __TBB_machine_pause(V)
-#endif /* !__TBB_Pause */
-
-#define __TBB_Log2(V) __TBB_machine_lg(V)
-
#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE 1
#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1
-
-// API to retrieve/update FPU control setting
-#ifndef __TBB_CPU_CTL_ENV_PRESENT
-#define __TBB_CPU_CTL_ENV_PRESENT 1
-
-struct __TBB_cpu_ctl_env_t {
- int mxcsr;
- short x87cw;
-};
-
-inline void __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* ctl ) {
-#if __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN
- __TBB_cpu_ctl_env_t loc_ctl;
- __asm__ __volatile__ (
- "stmxcsr %0\n\t"
- "fstcw %1"
- : "=m"(loc_ctl.mxcsr), "=m"(loc_ctl.x87cw)
- );
- *ctl = loc_ctl;
-#else
- __asm__ __volatile__ (
- "stmxcsr %0\n\t"
- "fstcw %1"
- : "=m"(ctl->mxcsr), "=m"(ctl->x87cw)
- );
-#endif
-}
-inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
- __asm__ __volatile__ (
- "ldmxcsr %0\n\t"
- "fldcw %1"
- : : "m"(ctl->mxcsr), "m"(ctl->x87cw)
- );
-}
-#endif /* !__TBB_CPU_CTL_ENV_PRESENT */
diff --git a/include/tbb/machine/mac_ppc.h b/include/tbb/machine/mac_ppc.h
index 26c7b38..40ce185 100644
--- a/include/tbb/machine/mac_ppc.h
+++ b/include/tbb/machine/mac_ppc.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -47,15 +47,18 @@
#define __TBB_WORDSIZE 4
#endif
-#ifndef __BYTE_ORDER__
- // Hopefully endianness can be validly determined at runtime.
- // This may silently fail in some embedded systems with page-specific endianness.
-#elif __BYTE_ORDER__==__ORDER_BIG_ENDIAN__
- #define __TBB_BIG_ENDIAN 1
-#elif __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__
- #define __TBB_BIG_ENDIAN 0
+// Traditionally Power Architecture is big-endian.
+// Little-endian could be just an address manipulation (compatibility with TBB not verified),
+// or normal little-endian (on more recent systems). Embedded PowerPC systems may support
+// page-specific endianness, but then one endianness must be hidden from TBB so that it still sees only one.
+#if __BIG_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__)
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG
+#elif __LITTLE_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__)
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
+#elif defined(__BYTE_ORDER__)
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED
#else
- #define __TBB_BIG_ENDIAN -1 // not currently supported
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT
#endif
// On Power Architecture, (lock-free) 64-bit atomics require 64-bit hardware:
diff --git a/include/tbb/machine/macos_common.h b/include/tbb/machine/macos_common.h
index 570032c..b66b213 100644
--- a/include/tbb/machine/macos_common.h
+++ b/include/tbb/machine/macos_common.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -56,17 +56,13 @@ static inline int __TBB_macos_available_cpu() {
#define __TBB_UnknownArchitecture 1
#endif
-#if __TBB_UnknownArchitecture || __TBB_WORDSIZE==4
-// In case of IA32 this is a workaround for compiler bugs triggered by inline
-// assembly implementation of __TBB_machine_cmpswp8 in linux_ia32.h, which may
-// lead to incorrect codegen (gcc) or compilation failures (any icc including 12.0.4).
-
+#if __TBB_UnknownArchitecture
// Implementation of atomic operations based on OS provided primitives
#include <libkern/OSAtomic.h>
static inline int64_t __TBB_machine_cmpswp8_OsX(volatile void *ptr, int64_t value, int64_t comparand)
{
- __TBB_ASSERT( !((uintptr_t)ptr&0x7), "address not properly aligned for Mac OS atomics");
+ __TBB_ASSERT( tbb::internal::is_aligned(ptr,8), "address not properly aligned for Mac OS atomics");
int64_t* address = (int64_t*)ptr;
while( !OSAtomicCompareAndSwap64Barrier(comparand, value, address) ){
#if __TBB_WORDSIZE==8
@@ -81,7 +77,7 @@ static inline int64_t __TBB_machine_cmpswp8_OsX(volatile void *ptr, int64_t valu
#define __TBB_machine_cmpswp8 __TBB_machine_cmpswp8_OsX
-#endif /* __TBB_UnknownArchitecture || __TBB_WORDSIZE==4 */
+#endif /* __TBB_UnknownArchitecture */
#if __TBB_UnknownArchitecture
@@ -89,14 +85,14 @@ static inline int64_t __TBB_machine_cmpswp8_OsX(volatile void *ptr, int64_t valu
#define __TBB_WORDSIZE 4
#endif
-#ifdef __TBB_BIG_ENDIAN
+#ifdef __TBB_ENDIANNESS
// Already determined based on hardware architecture.
#elif __BIG_ENDIAN__
- #define __TBB_BIG_ENDIAN 1
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG
#elif __LITTLE_ENDIAN__
- #define __TBB_BIG_ENDIAN 0
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
#else
- #define __TBB_BIG_ENDIAN -1 // not currently supported
+ #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED
#endif
/** As this generic implementation has absolutely no information about underlying
@@ -111,7 +107,7 @@ static inline int64_t __TBB_machine_cmpswp8_OsX(volatile void *ptr, int64_t valu
static inline int32_t __TBB_machine_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand)
{
- __TBB_ASSERT( !((uintptr_t)ptr&0x3), "address not properly aligned for Mac OS atomics");
+ __TBB_ASSERT( tbb::internal::is_aligned(ptr,4), "address not properly aligned for Mac OS atomics");
int32_t* address = (int32_t*)ptr;
while( !OSAtomicCompareAndSwap32Barrier(comparand, value, address) ){
int32_t snapshot = *address;
@@ -122,13 +118,13 @@ static inline int32_t __TBB_machine_cmpswp4(volatile void *ptr, int32_t value, i
static inline int32_t __TBB_machine_fetchadd4(volatile void *ptr, int32_t addend)
{
- __TBB_ASSERT( !((uintptr_t)ptr&0x3), "address not properly aligned for Mac OS atomics");
+ __TBB_ASSERT( tbb::internal::is_aligned(ptr,4), "address not properly aligned for Mac OS atomics");
return OSAtomicAdd32Barrier(addend, (int32_t*)ptr) - addend;
}
static inline int64_t __TBB_machine_fetchadd8(volatile void *ptr, int64_t addend)
{
- __TBB_ASSERT( !((uintptr_t)ptr&0x7), "address not properly aligned for Mac OS atomics");
+ __TBB_ASSERT( tbb::internal::is_aligned(ptr,8), "address not properly aligned for Mac OS atomics");
return OSAtomicAdd64Barrier(addend, (int64_t*)ptr) - addend;
}
diff --git a/include/tbb/machine/linux_common.h b/include/tbb/machine/mic_common.h
similarity index 50%
copy from include/tbb/machine/linux_common.h
copy to include/tbb/machine/mic_common.h
index 2eeffb9..ffc252e 100644
--- a/include/tbb/machine/linux_common.h
+++ b/include/tbb/machine/mic_common.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,66 +26,43 @@
the GNU General Public License.
*/
+#ifndef __TBB_mic_common_H
+#define __TBB_mic_common_H
+
#ifndef __TBB_machine_H
#error Do not #include this internal file directly; use public TBB headers instead.
#endif
-#include <sched.h>
-#define __TBB_Yield() sched_yield()
-
-/* Futex definitions */
-#include <sys/syscall.h>
-
-#if defined(SYS_futex)
-
-#define __TBB_USE_FUTEX 1
-#include <limits.h>
-#include <errno.h>
-// Unfortunately, some versions of Linux do not have a header that defines FUTEX_WAIT and FUTEX_WAKE.
-
-#ifdef FUTEX_WAIT
-#define __TBB_FUTEX_WAIT FUTEX_WAIT
-#else
-#define __TBB_FUTEX_WAIT 0
+#if ! __TBB_DEFINE_MIC
+ #error mic_common.h should be included only when building for Intel(R) Many Integrated Core Architecture
#endif
-#ifdef FUTEX_WAKE
-#define __TBB_FUTEX_WAKE FUTEX_WAKE
-#else
-#define __TBB_FUTEX_WAKE 1
+#ifndef __TBB_PREFETCHING
+#define __TBB_PREFETCHING 1
#endif
-
-#ifndef __TBB_ASSERT
-#error machine specific headers must be included after tbb_stddef.h
+#if __TBB_PREFETCHING
+#include <immintrin.h>
+#define __TBB_cl_prefetch(p) _mm_prefetch((const char*)p, _MM_HINT_T1)
+#define __TBB_cl_evict(p) _mm_clevict(p, _MM_HINT_T1)
#endif
-namespace tbb {
-
-namespace internal {
-
-inline int futex_wait( void *futex, int comparand ) {
- int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAIT,comparand,NULL,NULL,0 );
-#if TBB_USE_ASSERT
- int e = errno;
- __TBB_ASSERT( r==0||r==EWOULDBLOCK||(r==-1&&(e==EAGAIN||e==EINTR)), "futex_wait failed." );
-#endif /* TBB_USE_ASSERT */
- return r;
-}
-
-inline int futex_wakeup_one( void *futex ) {
- int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAKE,1,NULL,NULL,0 );
- __TBB_ASSERT( r==0||r==1, "futex_wakeup_one: more than one thread woken up?" );
- return r;
-}
+/** Early Intel(R) MIC Architecture does not support mfence and pause instructions **/
+#define __TBB_full_memory_fence __TBB_release_consistency_helper
+#define __TBB_Pause(x) _mm_delay_32(16*(x))
+#define __TBB_STEALING_PAUSE 1500/16
+#include <sched.h>
+#define __TBB_Yield() sched_yield()
-inline int futex_wakeup_all( void *futex ) {
- int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAKE,INT_MAX,NULL,NULL,0 );
- __TBB_ASSERT( r>=0, "futex_wakeup_all: error in waking up threads" );
- return r;
-}
+/** FPU control setting **/
+#define __TBB_CPU_CTL_ENV_PRESENT 0
-} /* namespace internal */
+/** Specifics **/
+#define __TBB_STEALING_ABORT_ON_CONTENTION 1
+#define __TBB_YIELD2P 1
+#define __TBB_HOARD_NONLOCAL_TASKS 1
-} /* namespace tbb */
+#if ! ( __FreeBSD__ || __linux__ )
+ #error Intel(R) Many Integrated Core Compiler does not define __FreeBSD__ or __linux__ anymore. Check for the __TBB_XXX_BROKEN defined under __FreeBSD__ or __linux__.
+#endif /* ! ( __FreeBSD__ || __linux__ ) */
-#endif /* SYS_futex */
+#endif /* __TBB_mic_common_H */
diff --git a/include/tbb/machine/msvc_armv7.h b/include/tbb/machine/msvc_armv7.h
new file mode 100644
index 0000000..dadd235
--- /dev/null
+++ b/include/tbb/machine/msvc_armv7.h
@@ -0,0 +1,176 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#if !defined(__TBB_machine_H) || defined(__TBB_msvc_armv7_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#define __TBB_msvc_armv7_H
+
+#include <intrin.h>
+#include <float.h>
+
+#define __TBB_WORDSIZE 4
+
+#define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED
+
+#if defined(TBB_WIN32_USE_CL_BUILTINS)
+// We can test this on _M_IX86
+#pragma intrinsic(_ReadWriteBarrier)
+#pragma intrinsic(_mm_mfence)
+#define __TBB_compiler_fence() _ReadWriteBarrier()
+#define __TBB_full_memory_fence() _mm_mfence()
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+#define __TBB_release_consistency_helper() __TBB_compiler_fence()
+#else
+//Now __dmb(_ARM_BARRIER_SY) is used for both compiler and memory fences
+//This might be changed later after testing
+#define __TBB_compiler_fence() __dmb(_ARM_BARRIER_SY)
+#define __TBB_full_memory_fence() __dmb(_ARM_BARRIER_SY)
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_full_memory_fence()
+#define __TBB_release_consistency_helper() __TBB_full_memory_fence()
+#endif
+
+//--------------------------------------------------
+// Compare and swap
+//--------------------------------------------------
+
+/**
+ * Atomic CAS for 32 bit values, if *ptr==comparand, then *ptr=value, returns *ptr
+ * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand
+ * @param value value to assign *ptr to if *ptr==comparand
+ * @param comparand value to compare with *ptr
+ * @return value originally in memory at ptr, regardless of success
+*/
+
+#define __TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(S,T,F) \
+inline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) { \
+ return _InterlockedCompareExchange##F(reinterpret_cast<volatile T *>(ptr),value,comparand); \
+} \
+
+#define __TBB_MACHINE_DEFINE_ATOMICS_FETCHADD(S,T,F) \
+inline T __TBB_machine_fetchadd##S( volatile void *ptr, T value ) { \
+ return _InterlockedExchangeAdd##F(reinterpret_cast<volatile T *>(ptr),value); \
+} \
+
+__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(1,char,8)
+__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(2,short,16)
+__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(4,long,)
+__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(8,__int64,64)
+__TBB_MACHINE_DEFINE_ATOMICS_FETCHADD(4,long,)
+#if defined(TBB_WIN32_USE_CL_BUILTINS)
+// No _InterlockedExchangeAdd64 intrinsic on _M_IX86
+#define __TBB_64BIT_ATOMICS 0
+#else
+__TBB_MACHINE_DEFINE_ATOMICS_FETCHADD(8,__int64,64)
+#endif
+
+inline void __TBB_machine_pause (int32_t delay )
+{
+ while(delay>0)
+ {
+ __TBB_compiler_fence();
+ delay--;
+ }
+}
+
+namespace tbb {
+ namespace internal {
+ template <typename T, size_t S>
+ struct machine_load_store_relaxed {
+ static inline T load ( const volatile T& location ) {
+ const T value = location;
+
+ /*
+ * An extra memory barrier is required for errata #761319
+ * Please see http://infocenter.arm.com/help/topic/com.arm.doc.uan0004a
+ */
+ __TBB_acquire_consistency_helper();
+ return value;
+ }
+
+ static inline void store ( volatile T& location, T value ) {
+ location = value;
+ }
+ };
+ }} // namespaces internal, tbb
+
+// Machine specific atomic operations
+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+
+// Use generics for some things
+#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE 1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
+#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD 1
+#define __TBB_USE_GENERIC_PART_WORD_FETCH_STORE 1
+#define __TBB_USE_GENERIC_FETCH_STORE 1
+#define __TBB_USE_GENERIC_DWORD_LOAD_STORE 1
+#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1
+
+#if defined(TBB_WIN32_USE_CL_BUILTINS)
+#if !__TBB_WIN8UI_SUPPORT
+extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
+#define __TBB_Yield() SwitchToThread()
+#else
+#include<thread>
+#define __TBB_Yield() std::this_thread::yield()
+#endif
+#else
+#define __TBB_Yield() __yield()
+#endif
+
+// API to retrieve/update FPU control setting
+#define __TBB_CPU_CTL_ENV_PRESENT 1
+
+typedef unsigned int __TBB_cpu_ctl_env_t;
+
+inline void __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* ctl ) {
+ *ctl = _control87(0, 0);
+}
+inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
+ _control87( *ctl, ~0U );
+}
+
+// Machine specific atomic operations
+#define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)
+#define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V)
+
+template <typename T1,typename T2>
+inline void __TBB_machine_OR( T1 *operand, T2 addend ) {
+ _InterlockedOr((long volatile *)operand, (long)addend);
+}
+
+template <typename T1,typename T2>
+inline void __TBB_machine_AND( T1 *operand, T2 addend ) {
+ _InterlockedAnd((long volatile *)operand, (long)addend);
+}
+
diff --git a/include/tbb/machine/msvc_ia32_common.h b/include/tbb/machine/msvc_ia32_common.h
new file mode 100644
index 0000000..b2e6cb5
--- /dev/null
+++ b/include/tbb/machine/msvc_ia32_common.h
@@ -0,0 +1,184 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_msvc_ia32_common_H
+#define __TBB_machine_msvc_ia32_common_H
+
+#include <intrin.h>
+
+//TODO: consider moving this macro to tbb_config.h and used there MSVC asm is used
+#if !_M_X64 || __INTEL_COMPILER
+ #define __TBB_X86_MSVC_INLINE_ASM_AVAILABLE 1
+
+ #if _M_X64
+ #define __TBB_r(reg_name) r##reg_name
+ #else
+ #define __TBB_r(reg_name) e##reg_name
+ #endif
+#else
+ //MSVC in x64 mode does not accept inline assembler
+ #define __TBB_X86_MSVC_INLINE_ASM_AVAILABLE 0
+#endif
+
+
+#define __TBB_NO_X86_MSVC_INLINE_ASM_MSG "The compiler being used is not supported (outdated?)"
+
+#if (_MSC_VER >= 1300) || (__INTEL_COMPILER) //Use compiler intrinsic when available
+ #define __TBB_PAUSE_USE_INTRINSIC 1
+ #pragma intrinsic(_mm_pause)
+ namespace tbb { namespace internal { namespace intrinsics { namespace msvc {
+ static inline void __TBB_machine_pause (uintptr_t delay ) {
+ for (;delay>0; --delay )
+ _mm_pause();
+ }
+ }}}}
+#else
+ #if !__TBB_X86_MSVC_INLINE_ASM_AVAILABLE
+ #error __TBB_NO_X86_MSVC_INLINE_ASM_MSG
+ #endif
+
+ namespace tbb { namespace internal { namespace inline_asm { namespace msvc {
+ static inline void __TBB_machine_pause (uintptr_t delay ) {
+ _asm
+ {
+ mov __TBB_r(ax), delay
+ __TBB_L1:
+ pause
+ add __TBB_r(ax), -1
+ jne __TBB_L1
+ }
+ return;
+ }
+ }}}}
+#endif
+
+static inline void __TBB_machine_pause (uintptr_t delay ){
+ #if __TBB_PAUSE_USE_INTRINSIC
+ tbb::internal::intrinsics::msvc::__TBB_machine_pause(delay);
+ #else
+ tbb::internal::inline_asm::msvc::__TBB_machine_pause(delay);
+ #endif
+}
+
+//TODO: move this function to windows_api.h or to place where it is used
+#if (_MSC_VER<1400) && (!_WIN64) && (__TBB_X86_MSVC_INLINE_ASM_AVAILABLE)
+ static inline void* __TBB_machine_get_current_teb () {
+ void* pteb;
+ __asm mov eax, fs:[0x18]
+ __asm mov pteb, eax
+ return pteb;
+ }
+#endif
+
+#if ( _MSC_VER>=1400 && !defined(__INTEL_COMPILER) ) || (__INTEL_COMPILER>=1200)
+// MSVC did not have this intrinsic prior to VC8.
+// ICL 11.1 fails to compile a TBB example if __TBB_Log2 uses the intrinsic.
+ #define __TBB_LOG2_USE_BSR_INTRINSIC 1
+ #if _M_X64
+ #define __TBB_BSR_INTRINSIC _BitScanReverse64
+ #else
+ #define __TBB_BSR_INTRINSIC _BitScanReverse
+ #endif
+ #pragma intrinsic(__TBB_BSR_INTRINSIC)
+
+ namespace tbb { namespace internal { namespace intrinsics { namespace msvc {
+ inline uintptr_t __TBB_machine_lg( uintptr_t i ){
+ unsigned long j;
+ __TBB_BSR_INTRINSIC( &j, i );
+ return j;
+ }
+ }}}}
+#else
+ #if !__TBB_X86_MSVC_INLINE_ASM_AVAILABLE
+ #error __TBB_NO_X86_MSVC_INLINE_ASM_MSG
+ #endif
+
+ namespace tbb { namespace internal { namespace inline_asm { namespace msvc {
+ inline uintptr_t __TBB_machine_lg( uintptr_t i ){
+ uintptr_t j;
+ __asm
+ {
+ bsr __TBB_r(ax), i
+ mov j, __TBB_r(ax)
+ }
+ return j;
+ }
+ }}}}
+#endif
+
+static inline intptr_t __TBB_machine_lg( uintptr_t i ) {
+#if __TBB_LOG2_USE_BSR_INTRINSIC
+ return tbb::internal::intrinsics::msvc::__TBB_machine_lg(i);
+#else
+ return tbb::internal::inline_asm::msvc::__TBB_machine_lg(i);
+#endif
+}
+
+// API to retrieve/update FPU control setting
+#define __TBB_CPU_CTL_ENV_PRESENT 1
+struct __TBB_cpu_ctl_env_t {
+ int mxcsr;
+ short x87cw;
+};
+#if __TBB_X86_MSVC_INLINE_ASM_AVAILABLE
+ inline void __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* ctl ) {
+ __asm {
+ __asm mov __TBB_r(ax), ctl
+ __asm stmxcsr [__TBB_r(ax)]
+ __asm fstcw [__TBB_r(ax)+4]
+ }
+ }
+ inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
+ __asm {
+ __asm mov __TBB_r(ax), ctl
+ __asm ldmxcsr [__TBB_r(ax)]
+ __asm fldcw [__TBB_r(ax)+4]
+ }
+ }
+#else
+ extern "C" {
+ void __TBB_EXPORTED_FUNC __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* );
+ void __TBB_EXPORTED_FUNC __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* );
+ }
+#endif
+
+
+#if !__TBB_WIN8UI_SUPPORT
+extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
+#define __TBB_Yield() SwitchToThread()
+#else
+#include<thread>
+#define __TBB_Yield() std::this_thread::yield()
+#endif
+
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+#define __TBB_Log2(V) __TBB_machine_lg(V)
+
+#undef __TBB_r
+
+#endif /* __TBB_machine_msvc_ia32_common_H */
diff --git a/include/tbb/machine/sunos_sparc.h b/include/tbb/machine/sunos_sparc.h
index 84ddbb3..321ef2d 100644
--- a/include/tbb/machine/sunos_sparc.h
+++ b/include/tbb/machine/sunos_sparc.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -37,7 +37,9 @@
#include <unistd.h>
#define __TBB_WORDSIZE 8
-#define __TBB_BIG_ENDIAN 1 // assumption (hardware may support page-specific bi-endianness)
+// Big endian is assumed for SPARC.
+// While hardware may support page-specific bi-endianness, only big endian pages may be exposed to TBB
+#define __TBB_ENDIANNESS __TBB_ENDIAN_BIG
/** To those working on SPARC hardware. Consider relaxing acquire and release
consistency helpers to no-op (as this port covers TSO mode only). **/
diff --git a/include/tbb/machine/windows_api.h b/include/tbb/machine/windows_api.h
index adb22e9..2b5d33b 100644
--- a/include/tbb/machine/windows_api.h
+++ b/include/tbb/machine/windows_api.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -43,10 +43,41 @@
#endif // _XBOX
-#if !defined(_WIN32_WINNT)
+#if _WIN32_WINNT < 0x0600
// The following Windows API function is declared explicitly;
-// otherwise any user would have to specify /D_WIN32_WINNT=0x0400
-extern "C" BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
+// otherwise it fails to compile by VS2005.
+#if !defined(WINBASEAPI) || (_WIN32_WINNT < 0x0501 && _MSC_VER == 1400)
+#define __TBB_WINBASEAPI extern "C"
+#else
+#define __TBB_WINBASEAPI WINBASEAPI
+#endif
+__TBB_WINBASEAPI BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
+__TBB_WINBASEAPI BOOL WINAPI InitializeCriticalSectionAndSpinCount( LPCRITICAL_SECTION, DWORD );
+// Overloading WINBASEAPI macro and using local functions missing in Windows XP/2003
+#define InitializeCriticalSectionEx inlineInitializeCriticalSectionEx
+#define CreateSemaphoreEx inlineCreateSemaphoreEx
+#define CreateEventEx inlineCreateEventEx
+inline BOOL WINAPI inlineInitializeCriticalSectionEx( LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD )
+{
+ return InitializeCriticalSectionAndSpinCount( lpCriticalSection, dwSpinCount );
+}
+inline HANDLE WINAPI inlineCreateSemaphoreEx( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName, DWORD, DWORD )
+{
+ return CreateSemaphore( lpSemaphoreAttributes, lInitialCount, lMaximumCount, lpName );
+}
+inline HANDLE WINAPI inlineCreateEventEx( LPSECURITY_ATTRIBUTES lpEventAttributes, LPCTSTR lpName, DWORD dwFlags, DWORD )
+{
+ BOOL manual_reset = dwFlags&0x00000001 ? TRUE : FALSE; // CREATE_EVENT_MANUAL_RESET
+ BOOL initial_set = dwFlags&0x00000002 ? TRUE : FALSE; // CREATE_EVENT_INITIAL_SET
+ return CreateEvent( lpEventAttributes, manual_reset, initial_set, lpName );
+}
+#endif
+
+#if defined(RTL_SRWLOCK_INIT)
+#ifndef __TBB_USE_SRWLOCK
+// TODO: turn it on when bug 1952 will be fixed
+#define __TBB_USE_SRWLOCK 0
+#endif
#endif
#else
diff --git a/include/tbb/machine/windows_ia32.h b/include/tbb/machine/windows_ia32.h
index d8e7092..491c392 100644
--- a/include/tbb/machine/windows_ia32.h
+++ b/include/tbb/machine/windows_ia32.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -32,15 +32,19 @@
#define __TBB_machine_windows_ia32_H
+#include "msvc_ia32_common.h"
+
#define __TBB_WORDSIZE 4
-#define __TBB_BIG_ENDIAN 0
+#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
-#if __INTEL_COMPILER
- #define __TBB_compiler_fence() __asm { __asm nop }
-#elif _MSC_VER >= 1300
- extern "C" void _ReadWriteBarrier();
+#if __INTEL_COMPILER && (__INTEL_COMPILER < 1100)
+ #define __TBB_compiler_fence() __asm { __asm nop }
+ #define __TBB_full_memory_fence() __asm { __asm mfence }
+#elif _MSC_VER >= 1300 || __INTEL_COMPILER
#pragma intrinsic(_ReadWriteBarrier)
- #define __TBB_compiler_fence() _ReadWriteBarrier()
+ #pragma intrinsic(_mm_mfence)
+ #define __TBB_compiler_fence() _ReadWriteBarrier()
+ #define __TBB_full_memory_fence() _mm_mfence()
#else
#error Unsupported compiler - need to define __TBB_{control,acquire,release}_consistency_helper to support it
#endif
@@ -48,7 +52,6 @@
#define __TBB_control_consistency_helper() __TBB_compiler_fence()
#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
#define __TBB_release_consistency_helper() __TBB_compiler_fence()
-#define __TBB_full_memory_fence() __asm { __asm mfence }
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
// Workaround for overzealous compiler warnings in /Wp64 mode
@@ -64,6 +67,7 @@ extern "C" {
__int64 __TBB_EXPORTED_FUNC __TBB_machine_load8 (const volatile void *ptr);
}
+//TODO: use _InterlockedXXX intrinsics as they available since VC 2005
#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,U,A,C) \
static inline T __TBB_machine_cmpswp##S ( volatile void * ptr, U value, U comparand ) { \
T result; \
@@ -112,28 +116,6 @@ __TBB_MACHINE_DEFINE_ATOMICS(4, ptrdiff_t, ptrdiff_t, eax, ecx)
#undef __TBB_MACHINE_DEFINE_ATOMICS
-#if ( _MSC_VER>=1400 && !defined(__INTEL_COMPILER) ) || (__INTEL_COMPILER>=1200)
-// MSVC did not have this intrinsic prior to VC8.
-// ICL 11.1 fails to compile a TBB example if __TBB_Log2 uses the intrinsic.
-#define __TBB_LOG2_USE_BSR_INTRINSIC 1
-extern "C" unsigned char _BitScanReverse( unsigned long* i, unsigned long w );
-#pragma intrinsic(_BitScanReverse)
-#endif
-
-static inline intptr_t __TBB_machine_lg( uintptr_t i ) {
- unsigned long j;
-#if __TBB_LOG2_USE_BSR_INTRINSIC
- _BitScanReverse( &j, i );
-#else
- __asm
- {
- bsr eax, i
- mov j, eax
- }
-#endif
- return j;
-}
-
static inline void __TBB_machine_OR( volatile void *operand, __int32 addend ) {
__asm
{
@@ -152,18 +134,6 @@ static inline void __TBB_machine_AND( volatile void *operand, __int32 addend ) {
}
}
-static inline void __TBB_machine_pause (__int32 delay ) {
- _asm
- {
- mov eax, delay
- __TBB_L1:
- pause
- add eax, -1
- jne __TBB_L1
- }
- return;
-}
-
#define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)
#define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V)
@@ -175,44 +145,8 @@ static inline void __TBB_machine_pause (__int32 delay ) {
#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1
-// Definition of other functions
-extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
-#define __TBB_Yield() SwitchToThread()
-#define __TBB_Pause(V) __TBB_machine_pause(V)
-#define __TBB_Log2(V) __TBB_machine_lg(V)
-
-#if defined(_MSC_VER)&&_MSC_VER<1400
- static inline void* __TBB_machine_get_current_teb () {
- void* pteb;
- __asm mov eax, fs:[0x18]
- __asm mov pteb, eax
- return pteb;
- }
-#endif
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
#pragma warning (pop)
#endif // warnings 4244, 4267 are back
-// API to retrieve/update FPU control setting
-#define __TBB_CPU_CTL_ENV_PRESENT 1
-
-struct __TBB_cpu_ctl_env_t {
- int mxcsr;
- short x87cw;
-};
-inline void __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* ctl ) {
- __asm {
- __asm mov eax, ctl
- __asm stmxcsr [eax]
- __asm fstcw [eax+4]
- }
-}
-inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
- __asm {
- __asm mov eax, ctl
- __asm ldmxcsr [eax]
- __asm fldcw [eax+4]
- }
-}
-
diff --git a/include/tbb/machine/windows_intel64.h b/include/tbb/machine/windows_intel64.h
index 4f17a0c..14fb2eb 100644
--- a/include/tbb/machine/windows_intel64.h
+++ b/include/tbb/machine/windows_intel64.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -33,10 +33,12 @@
#define __TBB_machine_windows_intel64_H
#define __TBB_WORDSIZE 8
-#define __TBB_BIG_ENDIAN 0
+#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE
#include <intrin.h>
+#include "msvc_ia32_common.h"
+//TODO: Use _InterlockedXXX16 intrinsics for 2 byte operations
#if !__INTEL_COMPILER
#pragma intrinsic(_InterlockedOr64)
#pragma intrinsic(_InterlockedAnd64)
@@ -46,16 +48,14 @@
#pragma intrinsic(_InterlockedExchangeAdd64)
#pragma intrinsic(_InterlockedExchange)
#pragma intrinsic(_InterlockedExchange64)
-#endif /* !defined(__INTEL_COMPILER) */
+#endif /* !(__INTEL_COMPILER) */
-#if __INTEL_COMPILER
+#if __INTEL_COMPILER && (__INTEL_COMPILER < 1100)
#define __TBB_compiler_fence() __asm { __asm nop }
#define __TBB_full_memory_fence() __asm { __asm mfence }
-#elif _MSC_VER >= 1300
- extern "C" void _ReadWriteBarrier();
+#elif _MSC_VER >= 1300 || __INTEL_COMPILER
#pragma intrinsic(_ReadWriteBarrier)
#pragma intrinsic(_mm_mfence)
- #pragma intrinsic(_mm_pause)
#define __TBB_compiler_fence() _ReadWriteBarrier()
#define __TBB_full_memory_fence() _mm_mfence()
#endif
@@ -95,26 +95,11 @@ inline __int64 __TBB_machine_fetchstore8 (volatile void *ptr, __int64 value ) {
return _InterlockedExchange64( (__int64*)ptr, value );
}
-inline void __TBB_machine_pause_v6 (__int32 delay ) {
- for (;delay>0; --delay )
- _mm_pause();
-}
-
#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE 1
#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1
-extern "C" unsigned char _BitScanReverse64( unsigned long* i, unsigned __int64 w );
-#pragma intrinsic(_BitScanReverse64)
-
-
-inline __int64 __TBB_machine_lg( unsigned __int64 i ) {
- unsigned long j;
- _BitScanReverse64( &j, i );
- return j;
-}
-
inline void __TBB_machine_OR( volatile void *operand, intptr_t addend ) {
_InterlockedOr64((__int64*)operand, addend);
}
@@ -126,20 +111,3 @@ inline void __TBB_machine_AND( volatile void *operand, intptr_t addend ) {
#define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)
#define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V)
-extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
-#define __TBB_Yield() SwitchToThread()
-#define __TBB_Pause(V) __TBB_machine_pause_v6(V)
-#define __TBB_Log2(V) __TBB_machine_lg(V)
-
-// API to retrieve/update FPU control setting
-#define __TBB_CPU_CTL_ENV_PRESENT 1
-
-struct __TBB_cpu_ctl_env_t {
- int mxcsr;
- short x87cw;
-};
-
-extern "C" {
- void __TBB_EXPORTED_FUNC __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* );
- void __TBB_EXPORTED_FUNC __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* );
-}
diff --git a/include/tbb/machine/xbox360_ppc.h b/include/tbb/machine/xbox360_ppc.h
index 25aa40e..883df9a 100644
--- a/include/tbb/machine/xbox360_ppc.h
+++ b/include/tbb/machine/xbox360_ppc.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -50,7 +50,7 @@ extern "C" void _MemoryBarrier();
#define __TBB_full_memory_fence() __sync()
#define __TBB_WORDSIZE 4
-#define __TBB_BIG_ENDIAN 1
+#define __TBB_ENDIANNESS __TBB_ENDIAN_BIG
//todo: define __TBB_USE_FENCED_ATOMICS and define acquire/release primitives to maximize performance
diff --git a/include/tbb/memory_pool.h b/include/tbb/memory_pool.h
index cf3ef91..da26d68 100644
--- a/include/tbb/memory_pool.h
+++ b/include/tbb/memory_pool.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -37,6 +37,7 @@
#include "scalable_allocator.h"
#include "tbb_stddef.h"
#include "tbb_machine.h" // TODO: avoid linkage with libtbb on IA-64
+#include "tbb/atomic.h" // for as_atomic
#include <new> // std::bad_alloc
#if __TBB_CPP11_RVALUE_REF_PRESENT && !__TBB_CPP11_STD_FORWARD_BROKEN
#include <utility> // std::forward
@@ -137,12 +138,12 @@ public:
}
//! Copy-construct value at location pointed to by p.
#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT
- template<typename... Args>
- void construct(pointer p, Args&&... args)
+ template<typename U, typename... Args>
+ void construct(U *p, Args&&... args)
#if __TBB_CPP11_STD_FORWARD_BROKEN
- { ::new((void *)p) T((args)...); }
+ { ::new((void *)p) U((args)...); }
#else
- { ::new((void *)p) T(std::forward<Args>(args)...); }
+ { ::new((void *)p) U(std::forward<Args>(args)...); }
#endif
#else // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT
void construct( pointer p, const value_type& value ) { ::new((void*)(p)) value_type(value); }
@@ -239,6 +240,12 @@ void *memory_pool<Alloc>::allocate_request(intptr_t pool_id, size_t & bytes) {
__TBB_CATCH(...) { return 0; }
return ptr;
}
+#if _MSC_VER==1700 && !defined(__INTEL_COMPILER)
+ // Workaround for erroneous "unreachable code" warning in the template below.
+ // Specific for VC++ 17 compiler
+ #pragma warning (push)
+ #pragma warning (disable: 4702)
+#endif
template <typename Alloc>
int memory_pool<Alloc>::deallocate_request(intptr_t pool_id, void* raw_ptr, size_t raw_bytes) {
memory_pool<Alloc> &self = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
@@ -247,6 +254,9 @@ int memory_pool<Alloc>::deallocate_request(intptr_t pool_id, void* raw_ptr, size
self.my_alloc.deallocate( static_cast<typename Alloc::value_type*>(raw_ptr), raw_bytes/unit_size );
return 0;
}
+#if _MSC_VER==1700 && !defined(__INTEL_COMPILER)
+ #pragma warning (pop)
+#endif
inline fixed_pool::fixed_pool(void *buf, size_t size) : my_buffer(buf), my_size(size) {
rml::MemPoolPolicy args(allocate_request, 0, size, /*fixedPool=*/true);
rml::MemPoolError res = rml::pool_create_v1(intptr_t(this), &args, &my_pool);
@@ -254,7 +264,7 @@ inline fixed_pool::fixed_pool(void *buf, size_t size) : my_buffer(buf), my_size(
}
inline void *fixed_pool::allocate_request(intptr_t pool_id, size_t & bytes) {
fixed_pool &self = *reinterpret_cast<fixed_pool*>(pool_id);
- if( !__TBB_CompareAndSwapW(&self.my_size, 0, (bytes=self.my_size)) )
+ if( !tbb::internal::as_atomic(self.my_size).compare_and_swap(0, (bytes=self.my_size)) )
return 0; // all the memory was given already
return self.my_buffer;
}
diff --git a/include/tbb/mutex.h b/include/tbb/mutex.h
index 3dc0a7c..f9fd845 100644
--- a/include/tbb/mutex.h
+++ b/include/tbb/mutex.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -53,7 +53,7 @@ public:
internal_construct();
#else
#if _WIN32||_WIN64
- InitializeCriticalSection(&impl);
+ InitializeCriticalSectionEx(&impl, 4000, 0);
#else
int error_code = pthread_mutex_init(&impl,NULL);
if( error_code )
diff --git a/include/tbb/null_mutex.h b/include/tbb/null_mutex.h
index ac73657..c945a1e 100644
--- a/include/tbb/null_mutex.h
+++ b/include/tbb/null_mutex.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/null_rw_mutex.h b/include/tbb/null_rw_mutex.h
index 4f08bbf..a3d0ecf 100644
--- a/include/tbb/null_rw_mutex.h
+++ b/include/tbb/null_rw_mutex.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/parallel_do.h b/include/tbb/parallel_do.h
index 0d33964..f7663d4 100644
--- a/include/tbb/parallel_do.h
+++ b/include/tbb/parallel_do.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/parallel_for.h b/include/tbb/parallel_for.h
index bc32778..17fe991 100644
--- a/include/tbb/parallel_for.h
+++ b/include/tbb/parallel_for.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -81,23 +81,23 @@ namespace internal {
/*override*/ void note_affinity( affinity_id id ) {
my_partition.note_affinity( id );
}
- static void run( const Range& range, const Body& body, const Partitioner& partitioner ) {
+ static void run( const Range& range, const Body& body, Partitioner& partitioner ) {
if( !range.empty() ) {
#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
- start_for& a = *new(task::allocate_root()) start_for(range,body,const_cast<Partitioner&>(partitioner));
+ start_for& a = *new(task::allocate_root()) start_for(range,body,partitioner);
#else
// Bound context prevents exceptions from body to affect nesting or sibling algorithms,
// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.
task_group_context context;
- start_for& a = *new(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
+ start_for& a = *new(task::allocate_root(context)) start_for(range,body,partitioner);
#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */
task::spawn_root_and_wait(a);
}
}
#if __TBB_TASK_GROUP_CONTEXT
- static void run( const Range& range, const Body& body, const Partitioner& partitioner, task_group_context& context ) {
+ static void run( const Range& range, const Body& body, Partitioner& partitioner, task_group_context& context ) {
if( !range.empty() ) {
- start_for& a = *new(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
+ start_for& a = *new(task::allocate_root(context)) start_for(range,body,partitioner);
task::spawn_root_and_wait(a);
}
}
@@ -135,6 +135,9 @@ namespace internal {
: my_func(_func), my_begin(_begin), my_step(_step) {}
void operator()( tbb::blocked_range<Index>& r ) const {
+#if __INTEL_COMPILER
+#pragma ivdep
+#endif
for( Index i = r.begin(), k = my_begin + i * my_step; i < r.end(); i++, k = k + my_step)
my_func( k );
}
@@ -159,21 +162,21 @@ namespace internal {
/** @ingroup algorithms **/
template<typename Range, typename Body>
void parallel_for( const Range& range, const Body& body ) {
- internal::start_for<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
+ internal::start_for<Range,Body,const __TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
}
//! Parallel iteration over range with simple partitioner.
/** @ingroup algorithms **/
template<typename Range, typename Body>
void parallel_for( const Range& range, const Body& body, const simple_partitioner& partitioner ) {
- internal::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);
+ internal::start_for<Range,Body,const simple_partitioner>::run(range,body,partitioner);
}
//! Parallel iteration over range with auto_partitioner.
/** @ingroup algorithms **/
template<typename Range, typename Body>
void parallel_for( const Range& range, const Body& body, const auto_partitioner& partitioner ) {
- internal::start_for<Range,Body,auto_partitioner>::run(range,body,partitioner);
+ internal::start_for<Range,Body,const auto_partitioner>::run(range,body,partitioner);
}
//! Parallel iteration over range with affinity_partitioner.
@@ -184,18 +187,25 @@ void parallel_for( const Range& range, const Body& body, affinity_partitioner& p
}
#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration over range with default partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, task_group_context& context ) {
+ internal::start_for<Range,Body,const __TBB_DEFAULT_PARTITIONER>::run(range, body, __TBB_DEFAULT_PARTITIONER(), context);
+}
+
//! Parallel iteration over range with simple partitioner and user-supplied context.
/** @ingroup algorithms **/
template<typename Range, typename Body>
void parallel_for( const Range& range, const Body& body, const simple_partitioner& partitioner, task_group_context& context ) {
- internal::start_for<Range,Body,simple_partitioner>::run(range, body, partitioner, context);
+ internal::start_for<Range,Body,const simple_partitioner>::run(range, body, partitioner, context);
}
//! Parallel iteration over range with auto_partitioner and user-supplied context.
/** @ingroup algorithms **/
template<typename Range, typename Body>
void parallel_for( const Range& range, const Body& body, const auto_partitioner& partitioner, task_group_context& context ) {
- internal::start_for<Range,Body,auto_partitioner>::run(range, body, partitioner, context);
+ internal::start_for<Range,Body,const auto_partitioner>::run(range, body, partitioner, context);
}
//! Parallel iteration over range with affinity_partitioner and user-supplied context.
@@ -210,9 +220,9 @@ void parallel_for( const Range& range, const Body& body, affinity_partitioner& p
namespace strict_ppl {
//@{
-//! Parallel iteration over a range of integers with a step provided
-template <typename Index, typename Function>
-void parallel_for(Index first, Index last, Index step, const Function& f) {
+//! Implementation of parallel iteration over stepped range of integers with explicit step and partitioner
+template <typename Index, typename Function, typename Partitioner>
+void parallel_for_impl(Index first, Index last, Index step, const Function& f, Partitioner& partitioner) {
if (step <= 0 )
internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument
else if (last > first) {
@@ -220,19 +230,56 @@ void parallel_for(Index first, Index last, Index step, const Function& f) {
Index end = (last - first - Index(1)) / step + Index(1);
tbb::blocked_range<Index> range(static_cast<Index>(0), end);
internal::parallel_for_body<Function, Index> body(f, first, step);
- tbb::parallel_for(range, body, tbb::auto_partitioner());
+ tbb::parallel_for(range, body, partitioner);
}
+}
+
+//! Parallel iteration over a range of integers with a step provided and default partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f) {
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, auto_partitioner());
}
-//! Parallel iteration over a range of integers with a default step value
+//! Parallel iteration over a range of integers with a step provided and simple partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, const simple_partitioner& partitioner) {
+ parallel_for_impl<Index,Function,const simple_partitioner>(first, last, step, f, partitioner);
+}
+//! Parallel iteration over a range of integers with a step provided and auto partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, const auto_partitioner& partitioner) {
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, partitioner);
+}
+//! Parallel iteration over a range of integers with a step provided and affinity partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, affinity_partitioner& partitioner) {
+ parallel_for_impl(first, last, step, f, partitioner);
+}
+
+//! Parallel iteration over a range of integers with a default step value and default partitioner
template <typename Index, typename Function>
void parallel_for(Index first, Index last, const Function& f) {
- parallel_for(first, last, static_cast<Index>(1), f);
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, auto_partitioner());
+}
+//! Parallel iteration over a range of integers with a default step value and simple partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, const Function& f, const simple_partitioner& partitioner) {
+ parallel_for_impl<Index,Function,const simple_partitioner>(first, last, static_cast<Index>(1), f, partitioner);
+}
+//! Parallel iteration over a range of integers with a default step value and auto partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, const Function& f, const auto_partitioner& partitioner) {
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, partitioner);
+}
+//! Parallel iteration over a range of integers with a default step value and affinity partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, const Function& f, affinity_partitioner& partitioner) {
+ parallel_for_impl(first, last, static_cast<Index>(1), f, partitioner);
}
#if __TBB_TASK_GROUP_CONTEXT
-//! Parallel iteration over a range of integers with explicit step and task group context
-template <typename Index, typename Function>
-void parallel_for(Index first, Index last, Index step, const Function& f, tbb::task_group_context &context) {
+//! Implementation of parallel iteration over stepped range of integers with explicit step, task group context, and partitioner
+template <typename Index, typename Function, typename Partitioner>
+void parallel_for_impl(Index first, Index last, Index step, const Function& f, Partitioner& partitioner, tbb::task_group_context &context) {
if (step <= 0 )
internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument
else if (last > first) {
@@ -240,14 +287,53 @@ void parallel_for(Index first, Index last, Index step, const Function& f, tbb::t
Index end = (last - first - Index(1)) / step + Index(1);
tbb::blocked_range<Index> range(static_cast<Index>(0), end);
internal::parallel_for_body<Function, Index> body(f, first, step);
- tbb::parallel_for(range, body, tbb::auto_partitioner(), context);
+ tbb::parallel_for(range, body, partitioner, context);
}
}
-//! Parallel iteration over a range of integers with a default step value and explicit task group context
+
+//! Parallel iteration over a range of integers with explicit step, task group context, and default partitioner
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, tbb::task_group_context &context) {
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, auto_partitioner(), context);
+}
+//! Parallel iteration over a range of integers with explicit step, task group context, and simple partitioner
+ template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, const simple_partitioner& partitioner, tbb::task_group_context &context) {
+ parallel_for_impl<Index,Function,const simple_partitioner>(first, last, step, f, partitioner, context);
+}
+//! Parallel iteration over a range of integers with explicit step, task group context, and auto partitioner
+ template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, const auto_partitioner& partitioner, tbb::task_group_context &context) {
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, partitioner, context);
+}
+//! Parallel iteration over a range of integers with explicit step, task group context, and affinity partitioner
+ template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, affinity_partitioner& partitioner, tbb::task_group_context &context) {
+ parallel_for_impl(first, last, step, f, partitioner, context);
+}
+
+
+//! Parallel iteration over a range of integers with a default step value, explicit task group context, and default partitioner
template <typename Index, typename Function>
void parallel_for(Index first, Index last, const Function& f, tbb::task_group_context &context) {
- parallel_for(first, last, static_cast<Index>(1), f, context);
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, auto_partitioner(), context);
}
+//! Parallel iteration over a range of integers with a default step value, explicit task group context, and simple partitioner
+ template <typename Index, typename Function, typename Partitioner>
+void parallel_for(Index first, Index last, const Function& f, const simple_partitioner& partitioner, tbb::task_group_context &context) {
+ parallel_for_impl<Index,Function,const simple_partitioner>(first, last, static_cast<Index>(1), f, partitioner, context);
+}
+//! Parallel iteration over a range of integers with a default step value, explicit task group context, and auto partitioner
+ template <typename Index, typename Function, typename Partitioner>
+void parallel_for(Index first, Index last, const Function& f, const auto_partitioner& partitioner, tbb::task_group_context &context) {
+ parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, partitioner, context);
+}
+//! Parallel iteration over a range of integers with a default step value, explicit task group context, and affinity_partitioner
+ template <typename Index, typename Function, typename Partitioner>
+void parallel_for(Index first, Index last, const Function& f, affinity_partitioner& partitioner, tbb::task_group_context &context) {
+ parallel_for_impl(first, last, static_cast<Index>(1), f, partitioner, context);
+}
+
#endif /* __TBB_TASK_GROUP_CONTEXT */
//@}
diff --git a/include/tbb/parallel_for_each.h b/include/tbb/parallel_for_each.h
index 3495a50..195f212 100644
--- a/include/tbb/parallel_for_each.h
+++ b/include/tbb/parallel_for_each.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/parallel_invoke.h b/include/tbb/parallel_invoke.h
index f56cc62..841c941 100644
--- a/include/tbb/parallel_invoke.h
+++ b/include/tbb/parallel_invoke.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/parallel_reduce.h b/include/tbb/parallel_reduce.h
index 44ca6a0..fbe1eef 100644
--- a/include/tbb/parallel_reduce.h
+++ b/include/tbb/parallel_reduce.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -174,7 +174,6 @@ public:
return NULL;
}
-#if TBB_PREVIEW_DETERMINISTIC_REDUCE
//! Task type used to combine the partial results of parallel_deterministic_reduce.
/** @ingroup algorithms */
template<typename Body>
@@ -253,7 +252,6 @@ public:
return this;
}
}
-#endif /* TBB_PREVIEW_DETERMINISTIC_REDUCE */
} // namespace internal
//! @endcond
} //namespace interfaceX
@@ -261,9 +259,7 @@ public:
//! @cond INTERNAL
namespace internal {
using interface6::internal::start_reduce;
-#if TBB_PREVIEW_DETERMINISTIC_REDUCE
using interface6::internal::start_deterministic_reduce;
-#endif
//! Auxiliary class for parallel_reduce; for internal use only.
/** The adaptor class that implements \ref parallel_reduce_body_req "parallel_reduce Body"
using given \ref parallel_reduce_lambda_req "anonymous function objects".
@@ -466,7 +462,6 @@ Value parallel_reduce( const Range& range, const Value& identity, const RealBody
}
#endif /* __TBB_TASK_GROUP_CONTEXT */
-#if TBB_PREVIEW_DETERMINISTIC_REDUCE
//! Parallel iteration with deterministic reduction and default partitioner.
/** @ingroup algorithms **/
template<typename Range, typename Body>
@@ -508,7 +503,6 @@ Value parallel_deterministic_reduce( const Range& range, const Value& identity,
return body.result();
}
#endif /* __TBB_TASK_GROUP_CONTEXT */
-#endif /* TBB_PREVIEW_DETERMINISTIC_REDUCE */
//@}
} // namespace tbb
diff --git a/include/tbb/parallel_scan.h b/include/tbb/parallel_scan.h
index 9cf8b5c..eb81ae8 100644
--- a/include/tbb/parallel_scan.h
+++ b/include/tbb/parallel_scan.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -56,29 +56,29 @@ namespace internal {
template<typename Range, typename Body>
class final_sum: public task {
public:
- Body body;
+ Body my_body;
private:
- aligned_space<Range,1> range;
+ aligned_space<Range,1> my_range;
//! Where to put result of last subrange, or NULL if not last subrange.
- Body* stuff_last;
+ Body* my_stuff_last;
public:
final_sum( Body& body_ ) :
- body(body_,split())
+ my_body(body_,split())
{
- poison_pointer(stuff_last);
+ poison_pointer(my_stuff_last);
}
~final_sum() {
- range.begin()->~Range();
+ my_range.begin()->~Range();
}
void finish_construction( const Range& range_, Body* stuff_last_ ) {
- new( range.begin() ) Range(range_);
- stuff_last = stuff_last_;
+ new( my_range.begin() ) Range(range_);
+ my_stuff_last = stuff_last_;
}
private:
/*override*/ task* execute() {
- body( *range.begin(), final_scan_tag() );
- if( stuff_last )
- stuff_last->assign(body);
+ my_body( *my_range.begin(), final_scan_tag() );
+ if( my_stuff_last )
+ my_stuff_last->assign(my_body);
return NULL;
}
};
@@ -89,25 +89,25 @@ namespace internal {
class sum_node: public task {
typedef final_sum<Range,Body> final_sum_type;
public:
- final_sum_type *incoming;
- final_sum_type *body;
- Body *stuff_last;
+ final_sum_type *my_incoming;
+ final_sum_type *my_body;
+ Body *my_stuff_last;
private:
- final_sum_type *left_sum;
- sum_node *left;
- sum_node *right;
- bool left_is_final;
- Range range;
+ final_sum_type *my_left_sum;
+ sum_node *my_left;
+ sum_node *my_right;
+ bool my_left_is_final;
+ Range my_range;
sum_node( const Range range_, bool left_is_final_ ) :
- left_sum(NULL),
- left(NULL),
- right(NULL),
- left_is_final(left_is_final_),
- range(range_)
+ my_left_sum(NULL),
+ my_left(NULL),
+ my_right(NULL),
+ my_left_is_final(left_is_final_),
+ my_range(range_)
{
// Poison fields that will be set by second pass.
- poison_pointer(body);
- poison_pointer(incoming);
+ poison_pointer(my_body);
+ poison_pointer(my_incoming);
}
task* create_child( const Range& range_, final_sum_type& f, sum_node* n, final_sum_type* incoming_, Body* stuff_last_ ) {
if( !n ) {
@@ -115,22 +115,22 @@ namespace internal {
f.finish_construction( range_, stuff_last_ );
return &f;
} else {
- n->body = &f;
- n->incoming = incoming_;
- n->stuff_last = stuff_last_;
+ n->my_body = &f;
+ n->my_incoming = incoming_;
+ n->my_stuff_last = stuff_last_;
return n;
}
}
/*override*/ task* execute() {
- if( body ) {
- if( incoming )
- left_sum->body.reverse_join( incoming->body );
+ if( my_body ) {
+ if( my_incoming )
+ my_left_sum->my_body.reverse_join( my_incoming->my_body );
recycle_as_continuation();
sum_node& c = *this;
- task* b = c.create_child(Range(range,split()),*left_sum,right,left_sum,stuff_last);
- task* a = left_is_final ? NULL : c.create_child(range,*body,left,incoming,NULL);
+ task* b = c.create_child(Range(my_range,split()),*my_left_sum,my_right,my_left_sum,my_stuff_last);
+ task* a = my_left_is_final ? NULL : c.create_child(my_range,*my_body,my_left,my_incoming,NULL);
set_ref_count( (a!=NULL)+(b!=NULL) );
- body = NULL;
+ my_body = NULL;
if( a ) spawn(*b);
else a = b;
return a;
@@ -151,35 +151,38 @@ namespace internal {
class finish_scan: public task {
typedef sum_node<Range,Body> sum_node_type;
typedef final_sum<Range,Body> final_sum_type;
- final_sum_type** const sum;
- sum_node_type*& return_slot;
+ final_sum_type** const my_sum;
+ sum_node_type*& my_return_slot;
public:
- final_sum_type* right_zombie;
- sum_node_type& result;
+ final_sum_type* my_right_zombie;
+ sum_node_type& my_result;
/*override*/ task* execute() {
- __TBB_ASSERT( result.ref_count()==(result.left!=NULL)+(result.right!=NULL), NULL );
- if( result.left )
- result.left_is_final = false;
- if( right_zombie && sum )
- ((*sum)->body).reverse_join(result.left_sum->body);
- __TBB_ASSERT( !return_slot, NULL );
- if( right_zombie || result.right ) {
- return_slot = &result;
+ __TBB_ASSERT( my_result.ref_count()==(my_result.my_left!=NULL)+(my_result.my_right!=NULL), NULL );
+ if( my_result.my_left )
+ my_result.my_left_is_final = false;
+ if( my_right_zombie && my_sum )
+ ((*my_sum)->my_body).reverse_join(my_result.my_left_sum->my_body);
+ __TBB_ASSERT( !my_return_slot, NULL );
+ if( my_right_zombie || my_result.my_right ) {
+ my_return_slot = &my_result;
} else {
- destroy( result );
+ destroy( my_result );
+ }
+ if( my_right_zombie && !my_sum && !my_result.my_right ) {
+ destroy(*my_right_zombie);
+ my_right_zombie = NULL;
}
- if( right_zombie && !sum && !result.right ) destroy(*right_zombie);
return NULL;
}
finish_scan( sum_node_type*& return_slot_, final_sum_type** sum_, sum_node_type& result_ ) :
- sum(sum_),
- return_slot(return_slot_),
- right_zombie(NULL),
- result(result_)
+ my_sum(sum_),
+ my_return_slot(return_slot_),
+ my_right_zombie(NULL),
+ my_result(result_)
{
- __TBB_ASSERT( !return_slot, NULL );
+ __TBB_ASSERT( !my_return_slot, NULL );
}
};
@@ -189,42 +192,42 @@ namespace internal {
class start_scan: public task {
typedef sum_node<Range,Body> sum_node_type;
typedef final_sum<Range,Body> final_sum_type;
- final_sum_type* body;
+ final_sum_type* my_body;
/** Non-null if caller is requesting total. */
- final_sum_type** sum;
- sum_node_type** return_slot;
+ final_sum_type** my_sum;
+ sum_node_type** my_return_slot;
/** Null if computing root. */
- sum_node_type* parent_sum;
- bool is_final;
- bool is_right_child;
- Range range;
- typename Partitioner::partition_type partition;
+ sum_node_type* my_parent_sum;
+ bool my_is_final;
+ bool my_is_right_child;
+ Range my_range;
+ typename Partitioner::partition_type my_partition;
/*override*/ task* execute();
public:
start_scan( sum_node_type*& return_slot_, start_scan& parent_, sum_node_type* parent_sum_ ) :
- body(parent_.body),
- sum(parent_.sum),
- return_slot(&return_slot_),
- parent_sum(parent_sum_),
- is_final(parent_.is_final),
- is_right_child(false),
- range(parent_.range,split()),
- partition(parent_.partition,split())
+ my_body(parent_.my_body),
+ my_sum(parent_.my_sum),
+ my_return_slot(&return_slot_),
+ my_parent_sum(parent_sum_),
+ my_is_final(parent_.my_is_final),
+ my_is_right_child(false),
+ my_range(parent_.my_range,split()),
+ my_partition(parent_.my_partition,split())
{
- __TBB_ASSERT( !*return_slot, NULL );
+ __TBB_ASSERT( !*my_return_slot, NULL );
}
start_scan( sum_node_type*& return_slot_, const Range& range_, final_sum_type& body_, const Partitioner& partitioner_) :
- body(&body_),
- sum(NULL),
- return_slot(&return_slot_),
- parent_sum(NULL),
- is_final(true),
- is_right_child(false),
- range(range_),
- partition(partitioner_)
+ my_body(&body_),
+ my_sum(NULL),
+ my_return_slot(&return_slot_),
+ my_parent_sum(NULL),
+ my_is_final(true),
+ my_is_right_child(false),
+ my_range(range_),
+ my_partition(partitioner_)
{
- __TBB_ASSERT( !*return_slot, NULL );
+ __TBB_ASSERT( !*my_return_slot, NULL );
}
static void run( const Range& range_, Body& body_, const Partitioner& partitioner_ ) {
@@ -234,18 +237,18 @@ namespace internal {
typedef internal::final_sum<Range,Body> final_sum_type;
final_sum_type* temp_body = new(task::allocate_root()) final_sum_type( body_ );
start_pass1_type& pass1 = *new(task::allocate_root()) start_pass1_type(
- /*return_slot=*/root,
+ /*my_return_slot=*/root,
range_,
*temp_body,
partitioner_ );
task::spawn_root_and_wait( pass1 );
if( root ) {
- root->body = temp_body;
- root->incoming = NULL;
- root->stuff_last = &body_;
+ root->my_body = temp_body;
+ root->my_incoming = NULL;
+ root->my_stuff_last = &body_;
task::spawn_root_and_wait( *root );
} else {
- body_.assign(temp_body->body);
+ body_.assign(temp_body->my_body);
temp_body->finish_construction( range_, NULL );
temp_body->destroy(*temp_body);
}
@@ -256,47 +259,47 @@ namespace internal {
template<typename Range, typename Body, typename Partitioner>
task* start_scan<Range,Body,Partitioner>::execute() {
typedef internal::finish_scan<Range,Body> finish_pass1_type;
- finish_pass1_type* p = parent_sum ? static_cast<finish_pass1_type*>( parent() ) : NULL;
+ finish_pass1_type* p = my_parent_sum ? static_cast<finish_pass1_type*>( parent() ) : NULL;
// Inspecting p->result.left_sum would ordinarily be a race condition.
// But we inspect it only if we are not a stolen task, in which case we
// know that task assigning to p->result.left_sum has completed.
- bool treat_as_stolen = is_right_child && (is_stolen_task() || body!=p->result.left_sum);
+ bool treat_as_stolen = my_is_right_child && (is_stolen_task() || my_body!=p->my_result.my_left_sum);
if( treat_as_stolen ) {
// Invocation is for right child that has been really stolen or needs to be virtually stolen
- p->right_zombie = body = new( allocate_root() ) final_sum_type(body->body);
- is_final = false;
+ p->my_right_zombie = my_body = new( allocate_root() ) final_sum_type(my_body->my_body);
+ my_is_final = false;
}
task* next_task = NULL;
- if( (is_right_child && !treat_as_stolen) || !range.is_divisible() || partition.should_execute_range(*this) ) {
- if( is_final )
- (body->body)( range, final_scan_tag() );
- else if( sum )
- (body->body)( range, pre_scan_tag() );
- if( sum )
- *sum = body;
- __TBB_ASSERT( !*return_slot, NULL );
+ if( (my_is_right_child && !treat_as_stolen) || !my_range.is_divisible() || my_partition.should_execute_range(*this) ) {
+ if( my_is_final )
+ (my_body->my_body)( my_range, final_scan_tag() );
+ else if( my_sum )
+ (my_body->my_body)( my_range, pre_scan_tag() );
+ if( my_sum )
+ *my_sum = my_body;
+ __TBB_ASSERT( !*my_return_slot, NULL );
} else {
sum_node_type* result;
- if( parent_sum )
- result = new(allocate_additional_child_of(*parent_sum)) sum_node_type(range,/*left_is_final=*/is_final);
+ if( my_parent_sum )
+ result = new(allocate_additional_child_of(*my_parent_sum)) sum_node_type(my_range,/*my_left_is_final=*/my_is_final);
else
- result = new(task::allocate_root()) sum_node_type(range,/*left_is_final=*/is_final);
- finish_pass1_type& c = *new( allocate_continuation()) finish_pass1_type(*return_slot,sum,*result);
+ result = new(task::allocate_root()) sum_node_type(my_range,/*my_left_is_final=*/my_is_final);
+ finish_pass1_type& c = *new( allocate_continuation()) finish_pass1_type(*my_return_slot,my_sum,*result);
// Split off right child
- start_scan& b = *new( c.allocate_child() ) start_scan( /*return_slot=*/result->right, *this, result );
- b.is_right_child = true;
+ start_scan& b = *new( c.allocate_child() ) start_scan( /*my_return_slot=*/result->my_right, *this, result );
+ b.my_is_right_child = true;
// Left child is recycling of *this. Must recycle this before spawning b,
// otherwise b might complete and decrement c.ref_count() to zero, which
// would cause c.execute() to run prematurely.
recycle_as_child_of(c);
c.set_ref_count(2);
c.spawn(b);
- sum = &result->left_sum;
- return_slot = &result->left;
- is_right_child = false;
+ my_sum = &result->my_left_sum;
+ my_return_slot = &result->my_left;
+ my_is_right_child = false;
next_task = this;
- parent_sum = result;
- __TBB_ASSERT( !*return_slot, NULL );
+ my_parent_sum = result;
+ __TBB_ASSERT( !*my_return_slot, NULL );
}
return next_task;
}
diff --git a/include/tbb/parallel_sort.h b/include/tbb/parallel_sort.h
index 5a79294..743eb3c 100644
--- a/include/tbb/parallel_sort.h
+++ b/include/tbb/parallel_sort.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/parallel_while.h b/include/tbb/parallel_while.h
index e2f0c83..0450de5 100644
--- a/include/tbb/parallel_while.h
+++ b/include/tbb/parallel_while.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/partitioner.h b/include/tbb/partitioner.h
index 7805bff..c921beb 100644
--- a/include/tbb/partitioner.h
+++ b/include/tbb/partitioner.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -114,9 +114,21 @@ template<typename Range, typename Body, typename Partitioner> class start_reduce
//! Join task node that contains shared flag for stealing feedback
class flag_task: public task {
public:
- tbb::atomic<bool> child_stolen;
- flag_task() { child_stolen = false; }
+ tbb::atomic<bool> my_child_stolen;
+ flag_task() { my_child_stolen = false; }
task* execute() { return NULL; }
+ static void mark_task_stolen(task &t) {
+ tbb::atomic<bool> &flag = static_cast<flag_task*>(t.parent())->my_child_stolen;
+#if TBB_USE_THREADING_TOOLS
+ // Threading tools respect lock prefix but report false-positive data-race via plain store
+ flag.fetch_and_store<release>(true);
+#else
+ flag = true;
+#endif //TBB_USE_THREADING_TOOLS
+ }
+ static bool is_peer_stolen(task &t) {
+ return static_cast<flag_task*>(t.parent())->my_child_stolen;
+ }
};
//! Task to signal the demand without carrying the work
@@ -124,7 +136,7 @@ class signal_task: public task {
public:
task* execute() {
if( is_stolen_task() ) {
- static_cast<flag_task*>(parent())->child_stolen = true;
+ flag_task::mark_task_stolen(*this);
}
return NULL;
}
@@ -290,17 +302,17 @@ struct auto_partition_type_base : partition_type_base<Partition> {
#endif
}
bool check_being_stolen( task &t) { // part of old should_execute_range()
- if( !my_divisor ) {
- my_divisor = 1; // todo: replace by on-stack flag (partition_state's member)?
+ if( !my_divisor ) { // if not from the top P tasks of binary tree
+ my_divisor = 1; // TODO: replace by on-stack flag (partition_state's member)?
if( t.is_stolen_task() ) {
#if TBB_USE_EXCEPTIONS
// RTTI is available, check whether the cast is valid
__TBB_ASSERT(dynamic_cast<flag_task*>(t.parent()), 0);
// correctness of the cast relies on avoiding the root task for which:
// - initial value of my_divisor != 0 (protected by separate assertion)
- // - is_stolen_task() always return false for the root task.
+ // - is_stolen_task() always returns false for the root task.
#endif
- static_cast<flag_task*>(t.parent())->child_stolen = true;
+ flag_task::mark_task_stolen(t);
my_max_depth++;
return true;
}
@@ -312,7 +324,7 @@ struct auto_partition_type_base : partition_type_base<Partition> {
if( my_divisor && my_max_depth > 1 ) { // can split the task and once more internally. TODO: on-stack flag instead
// keep same fragmentation while splitting for the local task pool
my_max_depth--;
- my_divisor = 0;
+ my_divisor = 0; // decrease max_depth once per task
return true;
} else return false;
}
@@ -320,7 +332,7 @@ struct auto_partition_type_base : partition_type_base<Partition> {
return my_divisor > 0;
}
bool check_for_demand(task &t) {
- if( static_cast<flag_task*>(t.parent())->child_stolen ) {
+ if( flag_task::is_peer_stolen(t) ) {
my_max_depth++;
return true;
} else return false;
@@ -380,7 +392,7 @@ public:
__TBB_ASSERT(my_max_depth>__TBB_Log2(map_end-map_mid), 0);
return true;// do not do my_max_depth++ here, but be sure my_max_depth is big enough
}
- if( static_cast<flag_task*>(t.parent())->child_stolen ) {
+ if( flag_task::is_peer_stolen(t) ) {
my_max_depth++;
return true;
}
diff --git a/include/tbb/pipeline.h b/include/tbb/pipeline.h
index 18f9d47..e6d3a90 100644
--- a/include/tbb/pipeline.h
+++ b/include/tbb/pipeline.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -34,6 +34,7 @@
#include "tbb_allocator.h"
#include <cstddef>
+//TODO: consider more accurate method to check if need to implement <type_trais> ourself
#if !TBB_IMPLEMENT_CPP0X
#include <type_traits>
#endif
@@ -47,7 +48,7 @@ class filter;
namespace internal {
// The argument for PIPELINE_VERSION should be an integer between 2 and 9
-#define __TBB_PIPELINE_VERSION(x) (unsigned char)(x-2)<<1
+#define __TBB_PIPELINE_VERSION(x) ((unsigned char)(x-2)<<1)
typedef unsigned long Token;
typedef long tokendiff_t;
@@ -298,7 +299,7 @@ private:
void __TBB_EXPORTED_METHOD inject_token( task& self );
#if __TBB_TASK_GROUP_CONTEXT
- //! Does clean up if pipeline is cancelled or exception occured
+ //! Does clean up if pipeline is cancelled or exception occurred
void clear_filters();
#endif
};
@@ -346,7 +347,7 @@ template<typename T> struct tbb_trivially_copyable { enum { value = std::has_tri
#else
template<typename T> struct tbb_trivially_copyable { enum { value = std::is_trivially_copyable<T>::value }; };
#endif //
-#endif // __TBB_USE_CPP0X
+#endif // TBB_IMPLEMENT_CPP0X
template<typename T> struct is_large_object {enum { value = tbb_large_object<T>::value || !tbb_trivially_copyable<T>::value }; };
@@ -427,6 +428,11 @@ class concrete_filter: public tbb::filter {
return u_helper::cast_to_void_ptr(output_u);
}
+ /*override*/ void finalize(void * input) {
+ t_pointer temp_input = t_helper::cast_from_void_ptr(input);
+ t_helper::destroy_token(temp_input);
+ }
+
public:
concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
};
@@ -468,6 +474,11 @@ class concrete_filter<T,void,Body>: public filter {
t_helper::destroy_token(temp_input);
return NULL;
}
+ /*override*/ void finalize(void* input) {
+ t_pointer temp_input = t_helper::cast_from_void_ptr(input);
+ t_helper::destroy_token(temp_input);
+ }
+
public:
concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
};
diff --git a/include/tbb/queuing_mutex.h b/include/tbb/queuing_mutex.h
index 04d675b..a588ac7 100644
--- a/include/tbb/queuing_mutex.h
+++ b/include/tbb/queuing_mutex.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/queuing_rw_mutex.h b/include/tbb/queuing_rw_mutex.h
index 57e1d25..1a9d8ec 100644
--- a/include/tbb/queuing_rw_mutex.h
+++ b/include/tbb/queuing_rw_mutex.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/reader_writer_lock.h b/include/tbb/reader_writer_lock.h
index 23084de..068a0d5 100644
--- a/include/tbb/reader_writer_lock.h
+++ b/include/tbb/reader_writer_lock.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/recursive_mutex.h b/include/tbb/recursive_mutex.h
index 458eb48..4ace6e1 100644
--- a/include/tbb/recursive_mutex.h
+++ b/include/tbb/recursive_mutex.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -52,7 +52,7 @@ public:
internal_construct();
#else
#if _WIN32||_WIN64
- InitializeCriticalSection(&impl);
+ InitializeCriticalSectionEx(&impl, 4000, 0);
#else
pthread_mutexattr_t mtx_attr;
int error_code = pthread_mutexattr_init( &mtx_attr );
diff --git a/include/tbb/runtime_loader.h b/include/tbb/runtime_loader.h
index 7b0ee60..8903d01 100644
--- a/include/tbb/runtime_loader.h
+++ b/include/tbb/runtime_loader.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/scalable_allocator.h b/include/tbb/scalable_allocator.h
index 25bdf39..10c4604 100644
--- a/include/tbb/scalable_allocator.h
+++ b/include/tbb/scalable_allocator.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -88,6 +88,16 @@ void __TBB_EXPORTED_FUNC scalable_aligned_free (void* ptr);
@ingroup memory_allocation */
size_t __TBB_EXPORTED_FUNC scalable_msize (void* ptr);
+/* Setting TBB_MALLOC_USE_HUGE_PAGES environment variable to 1 enables huge pages.
+ scalable_allocation_mode call has priority over environment variable. */
+enum AllocationModeParam {
+ USE_HUGE_PAGES /* value turns using huge pages on and off */
+};
+
+/** Set TBB allocator-specific allocation modes.
+ @ingroup memory_allocation */
+int __TBB_EXPORTED_FUNC scalable_allocation_mode(int param, intptr_t value);
+
#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */
@@ -112,7 +122,7 @@ struct MemPoolPolicy {
struct MemPoolPolicy {
enum {
- VERSION = 1
+ TBBMALLOC_POOL_VERSION = 1
};
rawAllocType pAlloc;
@@ -130,7 +140,7 @@ struct MemPoolPolicy {
MemPoolPolicy(rawAllocType pAlloc_, rawFreeType pFree_,
size_t granularity_ = 0, bool fixedPool_ = false,
bool keepAllMemory_ = false) :
- pAlloc(pAlloc_), pFree(pFree_), granularity(granularity_), version(VERSION),
+ pAlloc(pAlloc_), pFree(pFree_), granularity(granularity_), version(TBBMALLOC_POOL_VERSION),
fixedPool(fixedPool_), keepAllMemory(keepAllMemory_),
reserved(0) {}
};
@@ -218,12 +228,12 @@ public:
return (absolutemax > 0 ? absolutemax : 1);
}
#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT
- template<typename... Args>
- void construct(pointer p, Args&&... args)
+ template<typename U, typename... Args>
+ void construct(U *p, Args&&... args)
#if __TBB_CPP11_STD_FORWARD_BROKEN
- { ::new((void *)p) T((args)...); }
+ { ::new((void *)p) U((args)...); }
#else
- { ::new((void *)p) T(std::forward<Args>(args)...); }
+ { ::new((void *)p) U(std::forward<Args>(args)...); }
#endif
#else // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT
void construct( pointer p, const value_type& value ) {::new((void*)(p)) value_type(value);}
diff --git a/include/tbb/spin_mutex.h b/include/tbb/spin_mutex.h
index 2ed29b4..f8b8d51 100644
--- a/include/tbb/spin_mutex.h
+++ b/include/tbb/spin_mutex.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -63,7 +63,10 @@ public:
//! Points to currently held mutex, or NULL if no lock is held.
spin_mutex* my_mutex;
- //! Value to store into spin_mutex::flag to unlock the mutex.
+ //! Value to store into spin_mutex::flag to unlock the mutex.
+ /** This variable is no longer used. Instead, 0 and 1 are used to
+ represent that the lock is free and acquired, respectively.
+ We keep the member variable here to ensure backward compatibility */
__TBB_Flag my_unlock_value;
//! Like acquire, but with ITT instrumentation.
@@ -82,12 +85,13 @@ public:
scoped_lock() : my_mutex(NULL), my_unlock_value(0) {}
//! Construct and acquire lock on a mutex.
- scoped_lock( spin_mutex& m ) {
+ scoped_lock( spin_mutex& m ) : my_unlock_value(0) {
+ internal::suppress_unused_warning(my_unlock_value);
#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
my_mutex=NULL;
internal_acquire(m);
#else
- my_unlock_value = __TBB_LockByte(m.flag);
+ __TBB_LockByte(m.flag);
my_mutex=&m;
#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/
}
@@ -97,7 +101,7 @@ public:
#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
internal_acquire(m);
#else
- my_unlock_value = __TBB_LockByte(m.flag);
+ __TBB_LockByte(m.flag);
my_mutex = &m;
#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/
}
@@ -109,10 +113,8 @@ public:
return internal_try_acquire(m);
#else
bool result = __TBB_TryLockByte(m.flag);
- if( result ) {
- my_unlock_value = 0;
+ if( result )
my_mutex = &m;
- }
return result;
#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/
}
@@ -122,7 +124,7 @@ public:
#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
internal_release();
#else
- __TBB_UnlockByte(my_mutex->flag, my_unlock_value);
+ __TBB_UnlockByte(my_mutex->flag);
my_mutex = NULL;
#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
}
@@ -133,7 +135,7 @@ public:
#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
internal_release();
#else
- __TBB_UnlockByte(my_mutex->flag, my_unlock_value);
+ __TBB_UnlockByte(my_mutex->flag);
#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
}
}
@@ -175,7 +177,6 @@ public:
aligned_space<scoped_lock,1> tmp;
scoped_lock& s = *tmp.begin();
s.my_mutex = this;
- s.my_unlock_value = 0;
s.internal_release();
#else
__TBB_store_with_release(flag, 0);
diff --git a/include/tbb/spin_rw_mutex.h b/include/tbb/spin_rw_mutex.h
index 83c3c67..c1c1610 100644
--- a/include/tbb/spin_rw_mutex.h
+++ b/include/tbb/spin_rw_mutex.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/task.h b/include/tbb/task.h
index 9cbad16..dc233ab 100644
--- a/include/tbb/task.h
+++ b/include/tbb/task.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -371,14 +371,14 @@ private:
- 2 * sizeof(uintptr_t)- sizeof(void*) - sizeof(internal::context_list_node_t)
- sizeof(__itt_caller)];
- //! Specifies whether cancellation was request for this task group.
+ //! Specifies whether cancellation was requested for this task group.
uintptr_t my_cancellation_requested;
//! Version for run-time checks and behavioral traits of the context.
/** Version occupies low 16 bits, and traits (zero or more ORed enumerators
from the traits_type enumerations) take the next 16 bits.
Original (zeroth) version of the context did not support any traits. **/
- uintptr_t my_version_and_traits;
+ uintptr_t my_version_and_traits;
//! Pointer to the container storing exception being propagated across this task group.
exception_container_type *my_exception;
@@ -550,6 +550,10 @@ public:
freed,
//! task to be recycled as continuation
recycle
+#if __TBB_RECYCLE_TO_ENQUEUE
+ //! task to be scheduled for starvation-resistant execution
+ ,to_enqueue
+#endif
};
//------------------------------------------------------------------------
@@ -641,6 +645,15 @@ public:
prefix().state = reexecute;
}
+#if __TBB_RECYCLE_TO_ENQUEUE
+ //! Schedule this to enqueue after descendant tasks complete.
+ /** Save enqueue/spawn difference, it has the semantics of recycle_as_safe_continuation. */
+ void recycle_to_enqueue() {
+ __TBB_ASSERT( prefix().state==executing, "execute not running, or already recycled" );
+ prefix().state = to_enqueue;
+ }
+#endif /* __TBB_RECYCLE_TO_ENQUEUE */
+
// All depth-related methods are obsolete, and are retained for the sake
// of backward source compatibility only
intptr_t depth() const {return 0;}
@@ -817,6 +830,8 @@ public:
//! Returns true if the context has received cancellation request.
bool is_cancelled () const { return prefix().context->is_group_execution_cancelled(); }
+#else
+ bool is_cancelled () const { return false; }
#endif /* __TBB_TASK_GROUP_CONTEXT */
#if __TBB_TASK_PRIORITY
diff --git a/include/tbb/task_arena.h b/include/tbb/task_arena.h
new file mode 100644
index 0000000..cce264e
--- /dev/null
+++ b/include/tbb/task_arena.h
@@ -0,0 +1,228 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#ifndef __TBB_task_arena_H
+#define __TBB_task_arena_H
+
+#include "task.h"
+#include "tbb_exception.h"
+
+#if __TBB_TASK_ARENA
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+ //! Internal to library. Should not be used by clients.
+ /** @ingroup task_scheduling */
+ class arena;
+ class task_scheduler_observer_v3;
+} // namespace internal
+//! @endcond
+
+namespace interface6 {
+//! @cond INTERNAL
+namespace internal {
+using namespace tbb::internal;
+
+template<typename F>
+class enqueued_function_task : public task { // TODO: reuse from task_group?
+ F my_func;
+ /*override*/ task* execute() {
+ my_func();
+ return NULL;
+ }
+public:
+ enqueued_function_task ( const F& f ) : my_func(f) {}
+};
+
+class delegate_base : no_assign {
+public:
+ virtual void operator()() const = 0;
+ virtual ~delegate_base() {}
+};
+
+template<typename F>
+class delegated_function : public delegate_base {
+ F &my_func;
+ /*override*/ void operator()() const {
+ my_func();
+ }
+public:
+ delegated_function ( F& f ) : my_func(f) {}
+};
+} // namespace internal
+//! @endcond
+
+/** 1-to-1 proxy representation class of scheduler's arena
+ * Constructors set up settings only, real construction is deferred till the first method invocation
+ * TODO: A side effect of this is that it's impossible to create a const task_arena object. Rethink?
+ * Destructor only removes one of the references to the inner arena representation.
+ * Final destruction happens when all the references (and the work) are gone.
+ */
+class task_arena {
+ friend class internal::task_scheduler_observer_v3;
+ //! Concurrency level for deferred initialization
+ int my_max_concurrency;
+
+ //! Reserved master slots
+ unsigned my_master_slots;
+
+ //! NULL if not currently initialized.
+ internal::arena* my_arena;
+
+ // Initialization flag enabling compiler to throw excessive lazy initialization checks
+ bool my_initialized;
+
+ // const methods help to optimize the !my_arena check TODO: check, IDEA: move to base-class?
+ void __TBB_EXPORTED_METHOD internal_initialize( );
+ void __TBB_EXPORTED_METHOD internal_terminate( );
+ void __TBB_EXPORTED_METHOD internal_enqueue( task&, intptr_t ) const;
+ void __TBB_EXPORTED_METHOD internal_execute( internal::delegate_base& ) const;
+ void __TBB_EXPORTED_METHOD internal_wait() const;
+
+public:
+ //! Typedef for number of threads that is automatic.
+ static const int automatic = -1; // any value < 1 means 'automatic'
+
+ //! Creates task_arena with certain concurrency limits
+ /** @arg max_concurrency specifies total number of slots in arena where threads work
+ * @arg reserved_for_masters specifies number of slots to be used by master threads only.
+ * Value of 1 is default and reflects behavior of implicit arenas.
+ **/
+ task_arena(int max_concurrency = automatic, unsigned reserved_for_masters = 1)
+ : my_max_concurrency(max_concurrency)
+ , my_master_slots(reserved_for_masters)
+ , my_arena(0)
+ , my_initialized(false)
+ {}
+
+ //! Copies settings from another task_arena
+ task_arena(const task_arena &s)
+ : my_max_concurrency(s.my_max_concurrency) // copy settings
+ , my_master_slots(s.my_master_slots)
+ , my_arena(0) // but not the reference or instance
+ , my_initialized(false)
+ {}
+
+ inline void initialize() {
+ if( !my_initialized ) {
+ internal_initialize();
+ my_initialized = true;
+ }
+ }
+
+ //! Overrides concurrency level and forces initialization of internal representation
+ inline void initialize(int max_concurrency, unsigned reserved_for_masters = 1) {
+ __TBB_ASSERT( !my_arena, "task_arena was initialized already");
+ if( !my_initialized ) {
+ my_max_concurrency = max_concurrency;
+ my_master_slots = reserved_for_masters;
+ initialize();
+ } // TODO: else throw?
+ }
+
+ //! Removes the reference to the internal arena representation.
+ //! Not thread safe wrt concurrent invocations of other methods.
+ inline void terminate() {
+ if( my_initialized ) {
+ internal_terminate();
+ my_initialized = false;
+ }
+ }
+
+ //! Removes the reference to the internal arena representation, and destroys the external object.
+ //! Not thread safe wrt concurrent invocations of other methods.
+ ~task_arena() {
+ terminate();
+ }
+
+ //! Returns true if the arena is active (initialized); false otherwise.
+ //! The name was chosen to match a task_scheduler_init method with the same semantics.
+ bool is_active() const { return my_initialized; }
+
+ //! Enqueues a task into the arena to process a functor, and immediately returns.
+ //! Does not require the calling thread to join the arena
+ template<typename F>
+ void enqueue( const F& f ) {
+ initialize();
+ internal_enqueue( *new( task::allocate_root() ) internal::enqueued_function_task<F>(f), 0 );
+ }
+
+#if __TBB_TASK_PRIORITY
+ //! Enqueues a task with priority p into the arena to process a functor f, and immediately returns.
+ //! Does not require the calling thread to join the arena
+ template<typename F>
+ void enqueue( const F& f, priority_t p ) {
+ __TBB_ASSERT( p == priority_low || p == priority_normal || p == priority_high, "Invalid priority level value" );
+ initialize();
+ internal_enqueue( *new( task::allocate_root() ) internal::enqueued_function_task<F>(f), (intptr_t)p );
+ }
+#endif// __TBB_TASK_PRIORITY
+
+ //! Joins the arena and executes a functor, then returns
+ //! If not possible to join, wraps the functor into a task, enqueues it and waits for task completion
+ //! Can decrement the arena demand for workers, causing a worker to leave and free a slot to the calling thread
+ template<typename F>
+ void execute(F& f) {
+ initialize();
+ internal::delegated_function<F> d(f);
+ internal_execute( d );
+ }
+
+ //! Joins the arena and executes a functor, then returns
+ //! If not possible to join, wraps the functor into a task, enqueues it and waits for task completion
+ //! Can decrement the arena demand for workers, causing a worker to leave and free a slot to the calling thread
+ template<typename F>
+ void execute(const F& f) {
+ initialize();
+ internal::delegated_function<const F> d(f);
+ internal_execute( d );
+ }
+
+ //! Wait for all work in the arena to be completed
+ //! Even submitted by other application threads
+ //! Joins arena if/when possible (in the same way as execute())
+ void wait_until_empty() {
+ initialize();
+ internal_wait();
+ }
+
+ //! Returns the index, aka slot number, of the calling thread in its current arena
+ static int __TBB_EXPORTED_FUNC current_slot();
+};
+
+} // namespace interfaceX
+
+using interface6::task_arena;
+
+} // namespace tbb
+
+#endif /* __TBB_TASK_ARENA */
+
+#endif /* __TBB_task_arena_H */
diff --git a/include/tbb/task_group.h b/include/tbb/task_group.h
index 4a890d6..0c5c5f8 100644
--- a/include/tbb/task_group.h
+++ b/include/tbb/task_group.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/task_scheduler_init.h b/include/tbb/task_scheduler_init.h
index 0f0bb2a..1a09df1 100644
--- a/include/tbb/task_scheduler_init.h
+++ b/include/tbb/task_scheduler_init.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -64,6 +64,11 @@ class task_scheduler_init: internal::no_copy {
propagation_mode_captured = 2u,
propagation_mode_mask = propagation_mode_exact | propagation_mode_captured
};
+#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE
+ enum {
+ wait_workers_in_terminate_flag = 128u
+ };
+#endif
/** NULL if not currently initialized. */
internal::scheduler* my_scheduler;
@@ -97,7 +102,12 @@ public:
void __TBB_EXPORTED_METHOD terminate();
//! Shorthand for default constructor followed by call to initialize(number_of_threads).
- task_scheduler_init( int number_of_threads=automatic, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL) {
+#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE
+ task_scheduler_init( int number_of_threads=automatic, stack_size_type thread_stack_size=0, bool wait_workers_in_terminate = false )
+#else
+ task_scheduler_init( int number_of_threads=automatic, stack_size_type thread_stack_size=0 )
+#endif
+ : my_scheduler(NULL) {
// Two lowest order bits of the stack size argument may be taken to communicate
// default exception propagation mode of the client to be used when the
// client manually creates tasks in the master thread and does not use
@@ -109,6 +119,10 @@ public:
#if TBB_USE_EXCEPTIONS
thread_stack_size |= TBB_USE_CAPTURED_EXCEPTION ? propagation_mode_captured : propagation_mode_exact;
#endif /* TBB_USE_EXCEPTIONS */
+#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE
+ if (wait_workers_in_terminate)
+ my_scheduler = (internal::scheduler*)wait_workers_in_terminate_flag;
+#endif
initialize( number_of_threads, thread_stack_size );
}
diff --git a/include/tbb/task_scheduler_observer.h b/include/tbb/task_scheduler_observer.h
index c7af037..d529eac 100644
--- a/include/tbb/task_scheduler_observer.h
+++ b/include/tbb/task_scheduler_observer.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,42 +30,132 @@
#define __TBB_task_scheduler_observer_H
#include "atomic.h"
+#if __TBB_TASK_ARENA
+#include "task_arena.h"
+#endif //__TBB_TASK_ARENA
#if __TBB_SCHEDULER_OBSERVER
namespace tbb {
-
+namespace interface6 {
+class task_scheduler_observer;
+}
namespace internal {
class observer_proxy;
+class observer_list;
class task_scheduler_observer_v3 {
friend class observer_proxy;
+ friend class observer_list;
+ friend class interface6::task_scheduler_observer;
+
+ //! Pointer to the proxy holding this observer.
+ /** Observers are proxied by the scheduler to maintain persistent lists of them. **/
observer_proxy* my_proxy;
+
+ //! Counter preventing the observer from being destroyed while in use by the scheduler.
+ /** Valid only when observation is on. **/
atomic<intptr_t> my_busy_count;
+
public:
//! Enable or disable observation
+ /** For local observers the method can be used only when the current thread
+ has the task scheduler initialized or is attached to an arena.
+
+ Repeated calls with the same state are no-ops. **/
void __TBB_EXPORTED_METHOD observe( bool state=true );
- //! True if observation is enables; false otherwise.
+ //! Returns true if observation is enabled, false otherwise.
bool is_observing() const {return my_proxy!=NULL;}
//! Construct observer with observation disabled.
- task_scheduler_observer_v3() : my_proxy(NULL) {my_busy_count=0;}
+ task_scheduler_observer_v3() : my_proxy(NULL) { my_busy_count.store<relaxed>(0); }
+
+ //! Entry notification
+ /** Invoked from inside observe(true) call and whenever a worker enters the arena
+ this observer is associated with. If a thread is already in the arena when
+ the observer is activated, the entry notification is called before it
+ executes the first stolen task.
- //! Called by thread before first steal since observation became enabled
+ Obsolete semantics. For global observers it is called by a thread before
+ the first steal since observation became enabled. **/
virtual void on_scheduler_entry( bool /*is_worker*/ ) {}
- //! Called by thread when it no longer takes part in task stealing.
+ //! Exit notification
+ /** Invoked from inside observe(false) call and whenever a worker leaves the
+ arena this observer is associated with.
+
+ Obsolete semantics. For global observers it is called by a thread before
+ the first steal since observation became enabled. **/
virtual void on_scheduler_exit( bool /*is_worker*/ ) {}
- //! Destructor
- virtual ~task_scheduler_observer_v3() {observe(false);}
+ //! Destructor automatically switches observation off if it is enabled.
+ virtual ~task_scheduler_observer_v3() { if(my_proxy) observe(false);}
};
} // namespace internal
-typedef internal::task_scheduler_observer_v3 task_scheduler_observer;
+#if TBB_PREVIEW_LOCAL_OBSERVER
+namespace interface6 {
+class task_scheduler_observer : public internal::task_scheduler_observer_v3 {
+ friend class internal::task_scheduler_observer_v3;
+ friend class internal::observer_proxy;
+ friend class internal::observer_list;
+
+ /** Negative numbers with the largest absolute value to minimize probability
+ of coincidence in case of a bug in busy count usage. **/
+ // TODO: take more high bits for version number
+ static const intptr_t v6_trait = (intptr_t)((~(uintptr_t)0 >> 1) + 1);
+
+ //! contains task_arena pointer or tag indicating local or global semantics of the observer
+ intptr_t my_context_tag;
+ enum { global_tag = 0, implicit_tag = 1 };
+
+public:
+ //! Construct local or global observer in inactive state (observation disabled).
+ /** For a local observer entry/exit notifications are invoked whenever a worker
+ thread joins/leaves the arena of the observer's owner thread. If a thread is
+ already in the arena when the observer is activated, the entry notification is
+ called before it executes the first stolen task. **/
+ /** TODO: Obsolete.
+ Global observer semantics is obsolete as it violates master thread isolation
+ guarantees and is not composable. Thus the current default behavior of the
+ constructor is obsolete too and will be changed in one of the future versions
+ of the library. **/
+ task_scheduler_observer( bool local = false ) {
+ my_busy_count.store<relaxed>(v6_trait);
+ my_context_tag = local? implicit_tag : global_tag;
+ }
+
+#if __TBB_TASK_ARENA
+ //! Construct local observer for a given arena in inactive state (observation disabled).
+ /** entry/exit notifications are invoked whenever a thread joins/leaves arena.
+ If a thread is already in the arena when the observer is activated, the entry notification
+ is called before it executes the first stolen task. **/
+ task_scheduler_observer( task_arena & a) {
+ my_busy_count.store<relaxed>(v6_trait);
+ my_context_tag = (intptr_t)&a;
+ }
+#endif //__TBB_TASK_ARENA
+
+ //! The callback can be invoked in a worker thread before it leaves an arena.
+ /** If it returns false, the thread remains in the arena. Will not be called for masters
+ or if the worker leaves arena due to rebalancing or priority changes, etc.
+ NOTE: The preview library must be linked for this method to take effect **/
+ virtual bool on_scheduler_leaving() { return true; }
+
+ //! Destructor additionally protects concurrent on_scheduler_leaving notification
+ // It is recommended to disable observation before destructor of a derived class starts,
+ // otherwise it can lead to concurrent notification callback on partly destroyed object
+ virtual ~task_scheduler_observer() { if(my_proxy) observe(false); }
+};
+
+} //namespace interface6
+using interface6::task_scheduler_observer;
+#else /*TBB_PREVIEW_LOCAL_OBSERVER*/
+typedef tbb::internal::task_scheduler_observer_v3 task_scheduler_observer;
+#endif /*TBB_PREVIEW_LOCAL_OBSERVER*/
} // namespace tbb
diff --git a/include/tbb/tbb.h b/include/tbb/tbb.h
index 1581bd9..54b4917 100644
--- a/include/tbb/tbb.h
+++ b/include/tbb/tbb.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/tbb_allocator.h b/include/tbb/tbb_allocator.h
index f4e366c..3a753bb 100644
--- a/include/tbb/tbb_allocator.h
+++ b/include/tbb/tbb_allocator.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -122,12 +122,12 @@ public:
//! Copy-construct value at location pointed to by p.
#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT
- template<typename... Args>
- void construct(pointer p, Args&&... args)
+ template<typename U, typename... Args>
+ void construct(U *p, Args&&... args)
#if __TBB_CPP11_STD_FORWARD_BROKEN
- { ::new((void *)p) T((args)...); }
+ { ::new((void *)p) U((args)...); }
#else
- { ::new((void *)p) T(std::forward<Args>(args)...); }
+ { ::new((void *)p) U(std::forward<Args>(args)...); }
#endif
#else // __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT
void construct( pointer p, const value_type& value ) {::new((void*)(p)) value_type(value);}
diff --git a/include/tbb/tbb_config.h b/include/tbb/tbb_config.h
index aed2a8f..920b9a3 100644
--- a/include/tbb/tbb_config.h
+++ b/include/tbb/tbb_config.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,7 +30,7 @@
#define __TBB_tbb_config_H
/** This header is supposed to contain macro definitions and C style comments only.
- The macros defined here are intended to control such aspects of TBB build as
+ The macros defined here are intended to control such aspects of TBB build as
- presence of compiler features
- compilation modes
- feature sets
@@ -38,49 +38,123 @@
**/
#define __TBB_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+
#if __clang__
-#define __TBB_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
+ /**according to clang documentation version can be vendor specific **/
+ #define __TBB_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#endif
/** Presence of compiler features **/
+#if __INTEL_COMPILER == 9999 && __INTEL_COMPILER_BUILD_DATE == 20110811
+/* Intel(R) Composer XE 2011 Update 6 incorrectly sets __INTEL_COMPILER. Fix it. */
+ #undef __INTEL_COMPILER
+ #define __INTEL_COMPILER 1210
+#endif
+
#if (__TBB_GCC_VERSION >= 40400) && !defined(__INTEL_COMPILER)
/** warning suppression pragmas available in GCC since 4.4 **/
#define __TBB_GCC_WARNING_SUPPRESSION_PRESENT 1
#endif
-
/* Select particular features of C++11 based on compiler version.
ICC 12.1 (Linux), GCC 4.3 and higher, clang 2.9 and higher
set __GXX_EXPERIMENTAL_CXX0X__ in c++11 mode.
Compilers that mimics other compilers (ICC, clang) must be processed before
- compilers they mimic.
+ compilers they mimic (GCC, MSVC).
TODO: The following conditions should be extended when new compilers/runtimes
support added.
*/
#if __INTEL_COMPILER
- #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __GXX_EXPERIMENTAL_CXX0X__ && __VARIADIC_TEMPLATES
- #define __TBB_CPP11_RVALUE_REF_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ || _MSC_VER >= 1600) && (__INTEL_COMPILER >= 1200)
- #define __TBB_EXCEPTION_PTR_PRESENT 0
+ /** On Windows environment when using Intel C++ compiler with Visual Studio 2010*,
+ the C++0x features supported by Visual C++ 2010 are enabled by default
+ TODO: find a way to get know if c++0x mode is specified in command line on windows **/
+ #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT ( __VARIADIC_TEMPLATES && (__GXX_EXPERIMENTAL_CXX0X__ || _MSC_VER) )
+ #define __TBB_CPP11_RVALUE_REF_PRESENT ( (__GXX_EXPERIMENTAL_CXX0X__ || _MSC_VER >= 1600) && (__INTEL_COMPILER >= 1200) )
+ #if _MSC_VER >= 1600
+ #define __TBB_EXCEPTION_PTR_PRESENT ( __INTEL_COMPILER > 1300 \
+ /*ICC 12.1 Upd 10 and 13 beta Upd 2 fixed exception_ptr linking issue*/ \
+ || (__INTEL_COMPILER == 1300 && __INTEL_COMPILER_BUILD_DATE >= 20120530) \
+ || (__INTEL_COMPILER == 1210 && __INTEL_COMPILER_BUILD_DATE >= 20120410) )
+ /** libstc++ that comes with GCC 4.6 use C++11 features not supported by ICC 12.1.
+ * Because of that ICC 12.1 does not support C++11 mode with with gcc 4.6. (or higher)
+ * , and therefore does not define __GXX_EXPERIMENTAL_CXX0X__ macro**/
+ #elif (__TBB_GCC_VERSION >= 40404) && (__TBB_GCC_VERSION < 40600)
+ #define __TBB_EXCEPTION_PTR_PRESENT ( __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1200 )
+ #elif (__TBB_GCC_VERSION >= 40600)
+ #define __TBB_EXCEPTION_PTR_PRESENT ( __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1300 )
+ #else
+ #define __TBB_EXCEPTION_PTR_PRESENT 0
+ #endif
+ #define __TBB_MAKE_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1700 || (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40600))
+ #define __TBB_STATIC_ASSERT_PRESENT ( __GXX_EXPERIMENTAL_CXX0X__ || (_MSC_VER >= 1600) )
+ #define __TBB_CPP11_TUPLE_PRESENT ( (_MSC_VER >= 1600) || ((__GXX_EXPERIMENTAL_CXX0X__) && (__TBB_GCC_VERSION >= 40300)) )
+ /** TODO: re-check for compiler version greater than 12.1 if it supports initializer lists**/
+ #define __TBB_INITIALIZER_LISTS_PRESENT 0
+ #define __TBB_CONSTEXPR_PRESENT 0
+ #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT 0
#elif __clang__
- #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_CLANG_VERSION >= 20900)
- #define __TBB_CPP11_RVALUE_REF_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_CLANG_VERSION >= 20900)
- #define __TBB_EXCEPTION_PTR_PRESENT __GXX_EXPERIMENTAL_CXX0X__
+//TODO: these options need to be rechecked
+/** on OS X* the only way to get C++11 is to use clang. For library features (e.g. exception_ptr) libc++ is also
+ * required. So there is no need to check GCC version for clang**/
+ #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __has_feature(__cxx_variadic_templates__)
+ #define __TBB_CPP11_RVALUE_REF_PRESENT __has_feature(__cxx_rvalue_references__)
+ #define __TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && (__cplusplus >= 201103L))
+ #define __TBB_MAKE_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && (__cplusplus >= 201103L))
+ #define __TBB_STATIC_ASSERT_PRESENT __has_feature(__cxx_static_assert__)
+ /**Clang (preprocessor) has problems with dealing with expression having __has_include in #if's
+ * used inside C++ code. (At least version that comes with OS X 10.8) **/
+ #if (__GXX_EXPERIMENTAL_CXX0X__ && __has_include(<tuple>))
+ #define __TBB_CPP11_TUPLE_PRESENT 1
+ #endif
+ #if (__has_feature(__cxx_generalized_initializers__) && __has_include(<initializer_list>))
+ #define __TBB_INITIALIZER_LISTS_PRESENT 1
+ #endif
+ #define __TBB_CONSTEXPR_PRESENT __has_feature(__cxx_constexpr__)
+ #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__has_feature(__cxx_defaulted_functions__) && __has_feature(__cxx_deleted_functions__))
#elif __GNUC__
- #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __GXX_EXPERIMENTAL_CXX0X__
- #define __TBB_CPP11_RVALUE_REF_PRESENT __GXX_EXPERIMENTAL_CXX0X__
- #define __TBB_EXCEPTION_PTR_PRESENT __GXX_EXPERIMENTAL_CXX0X__
+ #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __GXX_EXPERIMENTAL_CXX0X__
+ #define __TBB_CPP11_RVALUE_REF_PRESENT __GXX_EXPERIMENTAL_CXX0X__
+ /** __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 here is a substitution for _GLIBCXX_ATOMIC_BUILTINS_4, which is a prerequisite
+ for exception_ptr but cannot be used in this file because it is defined in a header, not by the compiler.
+ If the compiler has no atomic intrinsics, the C++ library should not expect those as well. **/
+ #define __TBB_EXCEPTION_PTR_PRESENT ((__GXX_EXPERIMENTAL_CXX0X__) && (__TBB_GCC_VERSION >= 40404) && __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+ #define __TBB_MAKE_EXCEPTION_PTR_PRESENT ((__GXX_EXPERIMENTAL_CXX0X__) && (__TBB_GCC_VERSION >= 40600))
+ #define __TBB_STATIC_ASSERT_PRESENT ((__GXX_EXPERIMENTAL_CXX0X__) && (__TBB_GCC_VERSION >= 40300))
+ #define __TBB_CPP11_TUPLE_PRESENT ((__GXX_EXPERIMENTAL_CXX0X__) && (__TBB_GCC_VERSION >= 40300))
+ #define __TBB_INITIALIZER_LISTS_PRESENT ((__GXX_EXPERIMENTAL_CXX0X__) && (__TBB_GCC_VERSION >= 40400))
+ /** gcc seems have to support constexpr from 4.4 but tests in (test_atomic) seeming reasonable fail to compile prior 4.6**/
+ #define __TBB_CONSTEXPR_PRESENT ((__GXX_EXPERIMENTAL_CXX0X__) && (__TBB_GCC_VERSION >= 40400))
+ #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT ((__GXX_EXPERIMENTAL_CXX0X__) && (__TBB_GCC_VERSION >= 40400))
#elif _MSC_VER
- #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 0
- #define __TBB_CPP11_RVALUE_REF_PRESENT 0
- #define __TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600)
+ #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 0
+ #define __TBB_CPP11_RVALUE_REF_PRESENT 0
+ #define __TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600)
+ #define __TBB_STATIC_ASSERT_PRESENT (_MSC_VER >= 1600)
+ #define __TBB_MAKE_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1700)
+ #define __TBB_CPP11_TUPLE_PRESENT (_MSC_VER >= 1600)
+ #define __TBB_INITIALIZER_LISTS_PRESENT 0
+ #define __TBB_CONSTEXPR_PRESENT 0
+ #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT 0
#else
- #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 0
- #define __TBB_CPP11_RVALUE_REF_PRESENT 0
- #define __TBB_EXCEPTION_PTR_PRESENT 0
+ #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 0
+ #define __TBB_CPP11_RVALUE_REF_PRESENT 0
+ #define __TBB_EXCEPTION_PTR_PRESENT 0
+ #define __TBB_STATIC_ASSERT_PRESENT 0
+ #define __TBB_MAKE_EXCEPTION_PTR_PRESENT 0
+ #define __TBB_CPP11_TUPLE_PRESENT 0
+ #define __TBB_INITIALIZER_LISTS_PRESENT 0
+ #define __TBB_CONSTEXPR_PRESENT 0
+ #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT 0
+#endif
+
+//TODO: not clear how exactly this macro affects exception_ptr - investigate
+// On linux ICC fails to find existing std::exception_ptr in libstdc++ without this define
+#if __INTEL_COMPILER && __GNUC__ && __TBB_EXCEPTION_PTR_PRESENT && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+ #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#endif
// Work around a bug in MinGW32
@@ -95,12 +169,19 @@
#define __TBB_DECLSPEC_ALIGN_PRESENT 1
#endif
+/* Actually ICC supports gcc __sync_* intrinsics starting 11.1,
+ * but 64 bit support for 32 bit target comes in later ones*/
/* TODO: change the version back to 4.1.2 once macro __TBB_WORD_SIZE become optional */
-#if (__TBB_GCC_VERSION >= 40306) && !defined(__INTEL_COMPILER)
+#if (__TBB_GCC_VERSION >= 40306) || (__INTEL_COMPILER >= 1200)
/** built-in atomics available in GCC since 4.1.2 **/
#define __TBB_GCC_BUILTIN_ATOMICS_PRESENT 1
#endif
+#if (__INTEL_COMPILER >= 1210)
+ /** built-in C++11 style atomics available in compiler since 12.1 **/
+ #define __TBB_ICC_BUILTIN_ATOMICS_PRESENT 1
+#endif
+
/** User controlled TBB features & modes **/
#ifndef TBB_USE_DEBUG
@@ -118,7 +199,7 @@
#ifndef TBB_USE_ASSERT
#ifdef TBB_DO_ASSERT
#define TBB_USE_ASSERT TBB_DO_ASSERT
-#else
+#else
#define TBB_USE_ASSERT TBB_USE_DEBUG
#endif /* TBB_DO_ASSERT */
#endif /* TBB_USE_ASSERT */
@@ -126,7 +207,7 @@
#ifndef TBB_USE_THREADING_TOOLS
#ifdef TBB_DO_THREADING_TOOLS
#define TBB_USE_THREADING_TOOLS TBB_DO_THREADING_TOOLS
-#else
+#else
#define TBB_USE_THREADING_TOOLS TBB_USE_DEBUG
#endif /* TBB_DO_THREADING_TOOLS */
#endif /* TBB_USE_THREADING_TOOLS */
@@ -134,7 +215,7 @@
#ifndef TBB_USE_PERFORMANCE_WARNINGS
#ifdef TBB_PERFORMANCE_WARNINGS
#define TBB_USE_PERFORMANCE_WARNINGS TBB_PERFORMANCE_WARNINGS
-#else
+#else
#define TBB_USE_PERFORMANCE_WARNINGS TBB_USE_DEBUG
#endif /* TBB_PEFORMANCE_WARNINGS */
#endif /* TBB_USE_PERFORMANCE_WARNINGS */
@@ -163,13 +244,24 @@
/** By default, use C++0x classes if available **/
#if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__
#define TBB_IMPLEMENT_CPP0X 0
+ #elif __clang__ && __cplusplus >= 201103L
+ //TODO: consider introducing separate macros for each file?
+ //prevent injection of corresponding tbb names into std:: namespace if native headers are present
+ #if __has_include(<thread>) || __has_include(<condition_variable>)
+ #define TBB_IMPLEMENT_CPP0X 0
+ #else
+ #define TBB_IMPLEMENT_CPP0X 1
+ #endif
#else
#define TBB_IMPLEMENT_CPP0X 1
#endif
#endif /* TBB_IMPLEMENT_CPP0X */
+/* TBB_USE_CAPTURED_EXCEPTION should be explicitly set to either 0 or 1, as it is used as C++ const */
#ifndef TBB_USE_CAPTURED_EXCEPTION
- #if __TBB_EXCEPTION_PTR_PRESENT
+ /**TODO: enable it by default on OS X*, once it is enabled in pre-built binary **/
+ /** OS X* and IA64 pre-built TBB binaries do not support exception_ptr. **/
+ #if __TBB_EXCEPTION_PTR_PRESENT && !defined(__APPLE__) && !defined(__ia64__)
#define TBB_USE_CAPTURED_EXCEPTION 0
#else
#define TBB_USE_CAPTURED_EXCEPTION 1
@@ -187,17 +279,17 @@
/** Internal TBB features & modes **/
-/** __TBB_DYNAMIC_LOAD_ENABLED describes the system possibility to dynamic load libraries
- __TBB_SOURCE_DIRECTLY_INCLUDED is a mode used in whitebox testing when
- it's necessary to test internal functions not exported from TBB DLLs
-**/
+/** __TBB_WEAK_SYMBOLS_PRESENT denotes that the system supports the weak symbol mechanism **/
+#define __TBB_WEAK_SYMBOLS_PRESENT ( !_WIN32 && !__APPLE__ && !__sun && ((__TBB_GCC_VERSION >= 40000) || __INTEL_COMPILER ) )
+/** __TBB_DYNAMIC_LOAD_ENABLED describes the system possibility to load shared libraries at run time **/
#ifndef __TBB_DYNAMIC_LOAD_ENABLED
#define __TBB_DYNAMIC_LOAD_ENABLED 1
-#elif !(_WIN32||_WIN64) && !__TBB_DYNAMIC_LOAD_ENABLED
- #define __TBB_WEAK_SYMBOLS 1
#endif
+/** __TBB_SOURCE_DIRECTLY_INCLUDED is a mode used in whitebox testing when
+ it's necessary to test internal functions not exported from TBB DLLs
+**/
#if (_WIN32||_WIN64) && __TBB_SOURCE_DIRECTLY_INCLUDED
#define __TBB_NO_IMPLICIT_LINKAGE 1
#define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1
@@ -211,14 +303,32 @@
#define __TBB_TASK_GROUP_CONTEXT 1
#endif /* __TBB_TASK_GROUP_CONTEXT */
-#if TBB_USE_EXCEPTIONS && !__TBB_TASK_GROUP_CONTEXT
- #error TBB_USE_EXCEPTIONS requires __TBB_TASK_GROUP_CONTEXT to be enabled
-#endif
-
#ifndef __TBB_SCHEDULER_OBSERVER
#define __TBB_SCHEDULER_OBSERVER 1
#endif /* __TBB_SCHEDULER_OBSERVER */
+#if !defined(TBB_PREVIEW_TASK_ARENA) && __TBB_BUILD
+ #define TBB_PREVIEW_TASK_ARENA __TBB_CPF_BUILD
+#endif /* TBB_PREVIEW_TASK_ARENA */
+#define __TBB_TASK_ARENA TBB_PREVIEW_TASK_ARENA
+#if TBB_PREVIEW_TASK_ARENA
+ #define TBB_PREVIEW_LOCAL_OBSERVER 1
+ #define __TBB_NO_IMPLICIT_LINKAGE 1
+ #define __TBB_RECYCLE_TO_ENQUEUE 1
+ #define __TBB_TASK_PRIORITY 0 // TODO: it will be removed in next versions
+ #if !__TBB_SCHEDULER_OBSERVER
+ #error TBB_PREVIEW_TASK_ARENA requires __TBB_SCHEDULER_OBSERVER to be enabled
+ #endif
+#endif /* TBB_PREVIEW_TASK_ARENA */
+
+#if !defined(TBB_PREVIEW_LOCAL_OBSERVER) && __TBB_BUILD && __TBB_SCHEDULER_OBSERVER
+ #define TBB_PREVIEW_LOCAL_OBSERVER 1
+#endif /* TBB_PREVIEW_LOCAL_OBSERVER */
+
+#if TBB_USE_EXCEPTIONS && !__TBB_TASK_GROUP_CONTEXT
+ #error TBB_USE_EXCEPTIONS requires __TBB_TASK_GROUP_CONTEXT to be enabled
+#endif
+
#ifndef __TBB_TASK_PRIORITY
#define __TBB_TASK_PRIORITY __TBB_TASK_GROUP_CONTEXT
#endif /* __TBB_TASK_PRIORITY */
@@ -227,7 +337,12 @@
#error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled
#endif
-#if !defined(__TBB_SURVIVE_THREAD_SWITCH) && (_WIN32 || _WIN64 || __linux__)
+#if TBB_PREVIEW_WAITING_FOR_WORKERS || __TBB_BUILD
+ #define __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE 1
+#endif
+
+#if !defined(__TBB_SURVIVE_THREAD_SWITCH) && \
+ (_WIN32 || _WIN64 || __APPLE__ || (__linux__ && !__ANDROID__))
#define __TBB_SURVIVE_THREAD_SWITCH 1
#endif /* __TBB_SURVIVE_THREAD_SWITCH */
@@ -245,39 +360,72 @@
#define __TBB_VARIADIC_MAX _VARIADIC_MAX
#else
#if _MSC_VER >= 1700
-#define __TBB_VARIADIC_MAX 5 // current VS11 setting, may change.
+#define __TBB_VARIADIC_MAX 5 /* current VS11 setting, may change. */
#else
#define __TBB_VARIADIC_MAX 10
#endif
#endif
+// Define preprocessor symbols used to determine architecture
+#if _WIN32||_WIN64
+# if defined(_M_X64)||defined(__x86_64__) // the latter for MinGW support
+# define __TBB_x86_64 1
+# elif defined(_M_IA64)
+# define __TBB_ipf 1
+# elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support
+# define __TBB_x86_32 1
+# endif
+#else /* Assume generic Unix */
+# if !__linux__ && !__APPLE__
+# define __TBB_generic_os 1
+# endif
+# if __x86_64__
+# define __TBB_x86_64 1
+# elif __ia64__
+# define __TBB_ipf 1
+# elif __i386__||__i386 // __i386 is for Sun OS
+# define __TBB_x86_32 1
+# else
+# define __TBB_generic_arch 1
+# endif
+#endif
/** Macros of the form __TBB_XXX_BROKEN denote known issues that are caused by
- the bugs in compilers, standard or OS specific libraries. They should be
+ the bugs in compilers, standard or OS specific libraries. They should be
removed as soon as the corresponding bugs are fixed or the buggy OS/compiler
- versions go out of the support list.
+ versions go out of the support list.
**/
+#if __ANDROID__ && __TBB_GCC_VERSION <= 40403 && !__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
+ /** Necessary because on Android 8-byte CAS and F&A are not available for some processor architectures,
+ but no mandatory warning message appears from GCC 4.4.3. Instead, only a linkage error occurs when
+ these atomic operations are used (such as in unit test test_atomic.exe). **/
+ #define __TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 1
+#endif
+
#if __GNUC__ && __TBB_x86_64 && __INTEL_COMPILER == 1200
#define __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN 1
#endif
#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)
- /** Necessary to avoid ICL error (or warning in non-strict mode):
- "exception specification for implicitly declared virtual destructor is
+ /** Necessary to avoid ICL error (or warning in non-strict mode):
+ "exception specification for implicitly declared virtual destructor is
incompatible with that of overridden one". **/
#define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1
#endif
#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)
- /** VS2005 and earlier do not allow declaring template class as a friend
+ /** VS2005 and earlier do not allow declaring template class as a friend
of classes defined in other namespaces. **/
#define __TBB_TEMPLATE_FRIENDS_BROKEN 1
#endif
-#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__ || (__APPLE__ && __INTEL_COMPILER==1200 && !TBB_USE_DEBUG)
- //! Macro controlling EH usages in TBB tests
- /** Some older versions of glibc crash when exception handling happens concurrently. **/
+//TODO: recheck for different clang versions
+#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__ || (__APPLE__ && (__clang__ || __INTEL_COMPILER==1200 && !TBB_USE_DEBUG))
+ /** Macro controlling EH usages in TBB tests.
+ Some older versions of glibc crash when exception handling happens concurrently. **/
#define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1
+#else
+ #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 0
#endif
#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110
@@ -294,36 +442,43 @@
/** MinGW has a bug with stack alignment for routines invoked from MS RTLs.
Since GCC 4.2, the bug can be worked around via a special attribute. **/
#define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1
+#else
+ #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 0
#endif
#if __GNUC__==4 && __GNUC_MINOR__==3 && __GNUC_PATCHLEVEL__==0
- // GCC of this version may rashly ignore control dependencies
+ /* GCC of this version may rashly ignore control dependencies */
#define __TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1
#endif
#if __FreeBSD__
- /** A bug in FreeBSD 8.0 results in kernel panic when there is contention
+ /** A bug in FreeBSD 8.0 results in kernel panic when there is contention
on a mutex created with this attribute. **/
#define __TBB_PRIO_INHERIT_BROKEN 1
- /** A bug in FreeBSD 8.0 results in test hanging when an exception occurs
+ /** A bug in FreeBSD 8.0 results in test hanging when an exception occurs
during (concurrent?) object construction by means of placement new operator. **/
#define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1
#endif /* __FreeBSD__ */
#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)
- /** The Intel compiler for IA-32 (Linux|Mac OS X) crashes or generates
+ /** The Intel compiler for IA-32 (Linux|OS X) crashes or generates
incorrect code when __asm__ arguments have a cast to volatile. **/
#define __TBB_ICC_ASM_VOLATILE_BROKEN 1
#endif
#if !__INTEL_COMPILER && (_MSC_VER || __GNUC__==3 && __GNUC_MINOR__<=2)
- /** Bug in GCC 3.2 and MSVC compilers that sometimes return 0 for __alignof(T)
+ /** Bug in GCC 3.2 and MSVC compilers that sometimes return 0 for __alignof(T)
when T has not yet been instantiated. **/
#define __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1
#endif
-#if __INTEL_COMPILER
+/* Actually for Clang it should be name __TBB_CPP11_STD_FORWARD_PRESENT.
+ * But in order to check for presence of std:: library feature we need to recognize
+ * is standard library actually used stdlibc++ (GNU one) or libc++ (clang one).
+ * Unfortunately it is not possible at the moment. So postponing it to later moment.*/
+/*TODO: for clang rename it to __TBB_CPP11_STD_FORWARD_PRESENT and re-implement it.*/
+#if (__INTEL_COMPILER) || (__clang__ && __TBB_GCC_VERSION <= 40300)
#define __TBB_CPP11_STD_FORWARD_BROKEN 1
#else
#define __TBB_CPP11_STD_FORWARD_BROKEN 0
@@ -334,4 +489,39 @@
#define __TBB_MAIN_THREAD_AFFINITY_BROKEN 1
#endif
+/** __TBB_WIN8UI_SUPPORT enables support of New Windows*8 Store Apps and limit a possibility to load
+ shared libraries at run time only from application container **/
+#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP
+ #define __TBB_WIN8UI_SUPPORT 1
+#else
+ #define __TBB_WIN8UI_SUPPORT 0
+#endif
+
+#if !defined(__EXCEPTIONS) && __GNUC__==4 && (__GNUC_MINOR__==4 ||__GNUC_MINOR__==5 || (__INTEL_COMPILER==1300 && __TBB_GCC_VERSION>=40600 && __TBB_GCC_VERSION<=40700)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
+/* There is an issue for specific GCC toolchain when C++11 is enabled
+ and exceptions are disabled:
+ exceprion_ptr.h/nested_exception.h are using throw unconditionally.
+ */
+ #define __TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN 1
+#else
+ #define __TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN 0
+#endif
+
+#if __TBB_x86_32 && (__linux__ || __APPLE__ || _WIN32 || __sun) && ((defined(__INTEL_COMPILER) && (__INTEL_COMPILER <= 1300)) || (__GNUC__==3 && __GNUC_MINOR__==3 ) || defined(__SUNPRO_CC))
+ // Some compilers for IA-32 fail to provide 8-byte alignment of objects on the stack,
+ // even if the object specifies 8-byte alignment. On such platforms, the IA-32 implementation
+ // of 64 bit atomics (e.g. atomic<long long>) use different tactics depending upon
+ // whether the object is properly aligned or not.
+ #define __TBB_FORCE_64BIT_ALIGNMENT_BROKEN 1
+#else
+ #define __TBB_FORCE_64BIT_ALIGNMENT_BROKEN 0
+#endif
+
+#if (__TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && (__TBB_GCC_VERSION < 40700) && (!defined(__INTEL_COMPILER) && !defined (__clang__)))
+ #define __TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN 1
+#endif
+/** End of __TBB_XXX_BROKEN macro section **/
+
+#define __TBB_ATOMIC_CTORS (__TBB_CONSTEXPR_PRESENT && __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && (!__TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN))
+
#endif /* __TBB_tbb_config_H */
diff --git a/include/tbb/tbb_exception.h b/include/tbb/tbb_exception.h
index 7754dbc..62d8109 100644
--- a/include/tbb/tbb_exception.h
+++ b/include/tbb/tbb_exception.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -37,7 +37,8 @@
#pragma warning (disable: 4530)
#endif
-#include <stdexcept>
+#include <exception>
+#include <new> //required for bad_alloc definition, operators new
#include <string> // required to construct std exception classes
#if !TBB_USE_EXCEPTIONS && _MSC_VER
@@ -102,6 +103,12 @@ enum exception_id {
eid_reservation_length_error,
eid_invalid_key,
eid_user_abort,
+ eid_reserved1,
+#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE
+ // This id is used only inside library and only for support of CPF functionality.
+ // So, if we drop the functionality, eid_reserved1 can be safely renamed and reused.
+ eid_blocking_sch_init = eid_reserved1,
+#endif
//! The last enumerator tracks the number of defined IDs. It must remain the last one.
/** When adding new IDs, place them immediately _before_ this comment (that is
_after_ all the existing IDs. NEVER insert new IDs between the existing ones. **/
@@ -121,9 +128,7 @@ inline void throw_exception ( exception_id eid ) { throw_exception_v4(eid); }
#if __TBB_TASK_GROUP_CONTEXT
#include "tbb_allocator.h"
-#include <exception>
-#include <typeinfo>
-#include <new>
+#include <typeinfo> //for typeid
namespace tbb {
@@ -156,6 +161,14 @@ class tbb_exception : public std::exception
void* operator new ( size_t );
public:
+#if __clang__
+ // At -O3 or even -O2 optimization level, Clang may fully throw away an empty destructor
+ // of tbb_exception from destructors of derived classes. As a result, it does not create
+ // vtable for tbb_exception, which is a required part of TBB binary interface.
+ // Making the destructor non-empty (with just a semicolon) prevents that optimization.
+ ~tbb_exception() throw() { /* keep the semicolon! */ ; }
+#endif
+
//! Creates and returns pointer to the deep copy of this exception object.
/** Move semantics is allowed. **/
virtual tbb_exception* move () throw() = 0;
@@ -354,7 +367,13 @@ public:
private:
tbb_exception_ptr ( const std::exception_ptr& src ) : my_ptr(src) {}
- tbb_exception_ptr ( const captured_exception& src ) : my_ptr(std::copy_exception(src)) {}
+ tbb_exception_ptr ( const captured_exception& src ) :
+ #if __TBB_MAKE_EXCEPTION_PTR_PRESENT
+ my_ptr(std::make_exception_ptr(src)) // the final function name in C++11
+ #else
+ my_ptr(std::copy_exception(src)) // early C++0x drafts name
+ #endif
+ {}
}; // class tbb::internal::tbb_exception_ptr
} // namespace internal
diff --git a/include/tbb/tbb_machine.h b/include/tbb/tbb_machine.h
index 6c83942..aecbbdf 100644
--- a/include/tbb/tbb_machine.h
+++ b/include/tbb/tbb_machine.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -58,16 +58,17 @@
be set to 1 explicitly, though normally this is not necessary as tbb_machine.h
will set it automatically.
- __TBB_BIG_ENDIAN macro can be defined by the implementation as well.
- It is used only if the __TBB_USE_GENERIC_PART_WORD_CAS is set.
- Possible values are:
- - 1 if the system is big endian,
- - 0 if it is little endian,
- - or -1 to explicitly state that __TBB_USE_GENERIC_PART_WORD_CAS can not be used.
- -1 should be used when it is known in advance that endianness can change in run time
- or it is not simple big or little but something more complex.
- The system will try to detect it in run time if it is not set(in assumption that it
- is either a big or little one).
+ __TBB_ENDIANNESS macro can be defined by the implementation as well.
+ It is used only if __TBB_USE_GENERIC_PART_WORD_CAS is set (or for testing),
+ and must specify the layout of aligned 16-bit and 32-bit data anywhere within a process
+ (while the details of unaligned 16-bit or 32-bit data or of 64-bit data are irrelevant).
+ The layout must be the same at all relevant memory locations within the current process;
+ in case of page-specific endianness, one endianness must be kept "out of sight".
+ Possible settings, reflecting hardware and possibly O.S. convention, are:
+ - __TBB_ENDIAN_BIG for big-endian data,
+ - __TBB_ENDIAN_LITTLE for little-endian data,
+ - __TBB_ENDIAN_DETECT for run-time detection iff exactly one of the above,
+ - __TBB_ENDIAN_UNSUPPORTED to prevent undefined behavior if none of the above.
Prerequisites for each architecture port
----------------------------------------
@@ -173,6 +174,28 @@ template<> struct atomic_selector<8> {
}} // namespaces internal, tbb
+#define __TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(M) \
+ inline void __TBB_machine_generic_store8##M(volatile void *ptr, int64_t value) { \
+ for(;;) { \
+ int64_t result = *(int64_t *)ptr; \
+ if( __TBB_machine_cmpswp8##M(ptr,value,result)==result ) break; \
+ } \
+ } \
+
+#define __TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(M) \
+ inline int64_t __TBB_machine_generic_load8##M(const volatile void *ptr) { \
+ /* Comparand and new value may be anything, they only must be equal, and */ \
+ /* the value should have a low probability to be actually found in 'location'.*/ \
+ const int64_t anyvalue = 2305843009213693951LL; \
+ return __TBB_machine_cmpswp8##M(const_cast<volatile void *>(ptr),anyvalue,anyvalue); \
+ } \
+
+// The set of allowed values for __TBB_ENDIANNESS (see above for details)
+#define __TBB_ENDIAN_UNSUPPORTED -1
+#define __TBB_ENDIAN_LITTLE 0
+#define __TBB_ENDIAN_BIG 1
+#define __TBB_ENDIAN_DETECT 2
+
#if _WIN32||_WIN64
#ifdef _MANAGED
@@ -189,12 +212,16 @@ template<> struct atomic_selector<8> {
#elif __MINGW32__
#include "machine/linux_ia32.h"
#endif
- #elif defined(_M_IX86)
+ #elif (TBB_USE_ICC_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT)
+ #include "machine/icc_generic.h"
+ #elif defined(_M_IX86) && !defined(__TBB_WIN32_USE_CL_BUILTINS)
#include "machine/windows_ia32.h"
#elif defined(_M_X64)
#include "machine/windows_intel64.h"
- #elif _XBOX
+ #elif defined(_XBOX)
#include "machine/xbox360_ppc.h"
+ #elif defined(_M_ARM) || defined(__TBB_WIN32_USE_CL_BUILTINS)
+ #include "machine/msvc_armv7.h"
#endif
#ifdef _MANAGED
@@ -204,12 +231,15 @@ template<> struct atomic_selector<8> {
#elif __TBB_DEFINE_MIC
#include "machine/mic_common.h"
+ //TODO: check if ICC atomic intrinsics are available for MIC
#include "machine/linux_intel64.h"
#elif __linux__ || __FreeBSD__ || __NetBSD__
#if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)
#include "machine/gcc_generic.h"
+ #elif (TBB_USE_ICC_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT)
+ #include "machine/icc_generic.h"
#elif __i386__
#include "machine/linux_ia32.h"
#elif __x86_64__
@@ -218,14 +248,18 @@ template<> struct atomic_selector<8> {
#include "machine/linux_ia64.h"
#elif __powerpc__
#include "machine/mac_ppc.h"
+ #elif __arm__
+ #include "machine/gcc_armv7.h"
#elif __TBB_GCC_BUILTIN_ATOMICS_PRESENT
#include "machine/gcc_generic.h"
#endif
#include "machine/linux_common.h"
#elif __APPLE__
-
- #if __i386__
+ //TODO: TBB_USE_GCC_BUILTINS is not used for Mac, Sun, Aix
+ #if (TBB_USE_ICC_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT)
+ #include "machine/icc_generic.h"
+ #elif __i386__
#include "machine/linux_ia32.h"
#elif __x86_64__
#include "machine/linux_intel64.h"
@@ -260,6 +294,8 @@ template<> struct atomic_selector<8> {
#define __TBB_64BIT_ATOMICS 1
#endif
+//TODO: replace usage of these functions with usage of tbb::atomic, and then remove them
+//TODO: map functions with W suffix to use cast to tbb::atomic and according op, i.e. as_atomic().op()
// Special atomic functions
#if __TBB_USE_FENCED_ATOMICS
#define __TBB_machine_cmpswp1 __TBB_machine_cmpswp1full_fence
@@ -274,7 +310,11 @@ template<> struct atomic_selector<8> {
#define __TBB_FetchAndIncrementWacquire(P) __TBB_machine_fetchadd8acquire(P,1)
#define __TBB_FetchAndDecrementWrelease(P) __TBB_machine_fetchadd8release(P,(-1))
#else
- #error Define macros for 4-byte word, similarly to the above __TBB_WORDSIZE==8 branch.
+ #define __TBB_machine_fetchadd4 __TBB_machine_fetchadd4full_fence
+ #define __TBB_machine_fetchstore4 __TBB_machine_fetchstore4full_fence
+ #define __TBB_FetchAndAddWrelease(P,V) __TBB_machine_fetchadd4release(P,V)
+ #define __TBB_FetchAndIncrementWacquire(P) __TBB_machine_fetchadd4acquire(P,1)
+ #define __TBB_FetchAndDecrementWrelease(P) __TBB_machine_fetchadd4release(P,(-1))
#endif /* __TBB_WORDSIZE==4 */
#else /* !__TBB_USE_FENCED_ATOMICS */
#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
@@ -367,31 +407,38 @@ void spin_wait_until_eq( const volatile T& location, const U value ) {
while( location!=value ) backoff.pause();
}
-//TODO: add static_assert for the requirements stated below
-//TODO: check if it works with signed types
-
-// there are following restrictions/limitations for this operation:
-// - T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.
-// - T should be integer type of at most 4 bytes, for the casts and calculations to work.
-// (Together, these rules limit applicability of Masked CAS to uint8_t and uint16_t only,
-// as it does nothing useful for 4 bytes).
-// - The operation assumes that the architecture consistently uses either little-endian or big-endian:
-// it does not support mixed-endian or page-specific bi-endian architectures.
-// This function is the only use of __TBB_BIG_ENDIAN.
-#if (__TBB_BIG_ENDIAN!=-1)
- #if ( __TBB_USE_GENERIC_PART_WORD_CAS)
- #error generic implementation of part-word CAS was explicitly disabled for this configuration
- #endif
+
+////////////////////////////////////////////////////////////////////////////////
+// Generic compare-and-swap applied to only a part of a machine word.
+//
+#ifndef __TBB_ENDIANNESS
+#define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT
+#endif
+
+#if __TBB_USE_GENERIC_PART_WORD_CAS && __TBB_ENDIANNESS==__TBB_ENDIAN_UNSUPPORTED
+#error Generic implementation of part-word CAS may not be used with __TBB_ENDIAN_UNSUPPORTED
+#endif
+
+#if __TBB_ENDIANNESS!=__TBB_ENDIAN_UNSUPPORTED
+//
+// This function is the only use of __TBB_ENDIANNESS.
+// The following restrictions/limitations apply for this operation:
+// - T must be an integer type of at most 4 bytes for the casts and calculations to work
+// - T must also be less than 4 bytes to avoid compiler warnings when computing mask
+// (and for the operation to be useful at all, so no workaround is applied)
+// - the architecture must consistently use either little-endian or big-endian (same for all locations)
+//
+// TODO: static_assert for the type requirements stated above
template<typename T>
inline T __TBB_MaskedCompareAndSwap (volatile T * const ptr, const T value, const T comparand ) {
struct endianness{ static bool is_big_endian(){
- #ifndef __TBB_BIG_ENDIAN
+ #if __TBB_ENDIANNESS==__TBB_ENDIAN_DETECT
const uint32_t probe = 0x03020100;
return (((const char*)(&probe))[0]==0x03);
- #elif (__TBB_BIG_ENDIAN==0) || (__TBB_BIG_ENDIAN==1)
- return __TBB_BIG_ENDIAN;
+ #elif __TBB_ENDIANNESS==__TBB_ENDIAN_BIG || __TBB_ENDIANNESS==__TBB_ENDIAN_LITTLE
+ return __TBB_ENDIANNESS==__TBB_ENDIAN_BIG;
#else
- #error unexpected value of __TBB_BIG_ENDIAN
+ #error Unexpected value of __TBB_ENDIANNESS
#endif
}};
@@ -401,11 +448,12 @@ inline T __TBB_MaskedCompareAndSwap (volatile T * const ptr, const T value, cons
// location of T within uint32_t for a C++ shift operation
const uint32_t bits_to_shift = 8*(endianness::is_big_endian() ? (4 - sizeof(T) - (byte_offset)) : byte_offset);
const uint32_t mask = (((uint32_t)1<<(sizeof(T)*8)) - 1 )<<bits_to_shift;
+ // for signed T, any sign extension bits in cast value/comparand are immediately clipped by mask
const uint32_t shifted_comparand = ((uint32_t)comparand << bits_to_shift)&mask;
const uint32_t shifted_value = ((uint32_t)value << bits_to_shift)&mask;
for(atomic_backoff b;;b.pause()) {
- const uint32_t surroundings = *aligned_ptr & ~mask ; // reload the aligned_ptr value which might change during the pause
+ const uint32_t surroundings = *aligned_ptr & ~mask ; // may have changed during the pause
const uint32_t big_comparand = surroundings | shifted_comparand ;
const uint32_t big_value = surroundings | shifted_value ;
// __TBB_machine_cmpswp4 presumed to have full fence.
@@ -416,10 +464,12 @@ inline T __TBB_MaskedCompareAndSwap (volatile T * const ptr, const T value, cons
{
return T((big_result & mask) >> bits_to_shift);
}
- else continue; // CAS failed but the bits of interest left unchanged
+ else continue; // CAS failed but the bits of interest were not changed
}
}
-#endif
+#endif // __TBB_ENDIANNESS!=__TBB_ENDIAN_UNSUPPORTED
+////////////////////////////////////////////////////////////////////////////////
+
template<size_t S, typename T>
inline T __TBB_CompareAndSwapGeneric (volatile void *ptr, T value, T comparand );
@@ -528,28 +578,34 @@ __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(8)
#endif /* __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */
#if __TBB_USE_GENERIC_DWORD_LOAD_STORE
-inline void __TBB_machine_store8 (volatile void *ptr, int64_t value) {
- for(;;) {
- int64_t result = *(int64_t *)ptr;
- if( __TBB_machine_cmpswp8(ptr,value,result)==result ) break;
- }
-}
+/*TODO: find a more elegant way to handle function names difference*/
+#if ! __TBB_USE_FENCED_ATOMICS
+ /* This name forwarding is needed for generic implementation of
+ * load8/store8 defined below (via macro) to pick the right CAS function*/
+ #define __TBB_machine_cmpswp8full_fence __TBB_machine_cmpswp8
+#endif
+__TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(full_fence)
+__TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(full_fence)
-inline int64_t __TBB_machine_load8 (const volatile void *ptr) {
- // Comparand and new value may be anything, they only must be equal, and
- // the value should have a low probability to be actually found in 'location'.
- const int64_t anyvalue = 2305843009213693951LL;
- return __TBB_machine_cmpswp8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
-}
+#if ! __TBB_USE_FENCED_ATOMICS
+ #undef __TBB_machine_cmpswp8full_fence
+#endif
+
+#define __TBB_machine_store8 tbb::internal::__TBB_machine_generic_store8full_fence
+#define __TBB_machine_load8 tbb::internal::__TBB_machine_generic_load8full_fence
#endif /* __TBB_USE_GENERIC_DWORD_LOAD_STORE */
#if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE
/** Fenced operations use volatile qualifier to prevent compiler from optimizing
- them out, and on on architectures with weak memory ordering to induce compiler
+ them out, and on architectures with weak memory ordering to induce compiler
to generate code with appropriate acquire/release semantics.
- On architectures like IA32, Intel64 (and likely and Sparc TSO) volatile has
+ On architectures like IA32, Intel64 (and likely Sparc TSO) volatile has
no effect on code gen, and consistency helpers serve as a compiler fence (the
- latter being true for IA64/gcc as well to fix a bug in some gcc versions). **/
+ latter being true for IA64/gcc as well to fix a bug in some gcc versions).
+ This code assumes that the generated instructions will operate atomically,
+ which typically requires a type that can be moved in a single instruction,
+ cooperation from the compiler for effective use of such an instruction,
+ and appropriate alignment of the data. **/
template <typename T, size_t S>
struct machine_load_store {
static T load_with_acquire ( const volatile T& location ) {
@@ -792,13 +848,16 @@ using tbb::internal::__TBB_store_with_release;
inline intptr_t __TBB_Log2( uintptr_t x ) {
if( x==0 ) return -1;
intptr_t result = 0;
+
+#if !defined(_M_ARM)
uintptr_t tmp;
+ if( sizeof(x)>4 && (tmp = ((uint64_t)x)>>32) ) { x=tmp; result += 32; }
+#endif
+ if( uintptr_t tmp = x>>16 ) { x=tmp; result += 16; }
+ if( uintptr_t tmp = x>>8 ) { x=tmp; result += 8; }
+ if( uintptr_t tmp = x>>4 ) { x=tmp; result += 4; }
+ if( uintptr_t tmp = x>>2 ) { x=tmp; result += 2; }
- if( sizeof(x)>4 && (tmp = ((uint64_t)x)>>32)) { x=tmp; result += 32; }
- if( (tmp = x>>16) ) { x=tmp; result += 16; }
- if( (tmp = x>>8) ) { x=tmp; result += 8; }
- if( (tmp = x>>4) ) { x=tmp; result += 4; }
- if( (tmp = x>>2) ) { x=tmp; result += 2; }
return (x&2)? result+1: result;
}
#endif
@@ -827,6 +886,16 @@ inline void __TBB_AtomicAND( volatile void *operand, uintptr_t addend ) {
}
#endif
+#if __TBB_PREFETCHING
+#ifndef __TBB_cl_prefetch
+#error This platform does not define cache management primitives required for __TBB_PREFETCHING
+#endif
+
+#ifndef __TBB_cl_evict
+#define __TBB_cl_evict(p)
+#endif
+#endif
+
#ifndef __TBB_Flag
typedef unsigned char __TBB_Flag;
#endif
@@ -851,7 +920,7 @@ inline __TBB_Flag __TBB_LockByte( __TBB_atomic_flag& flag ) {
#endif
#ifndef __TBB_UnlockByte
-#define __TBB_UnlockByte __TBB_store_with_release
+#define __TBB_UnlockByte(addr) __TBB_store_with_release((addr),0)
#endif
#ifndef __TBB_ReverseByte
diff --git a/include/tbb/tbb_profiling.h b/include/tbb/tbb_profiling.h
index 23c7292..efafb82 100644
--- a/include/tbb/tbb_profiling.h
+++ b/include/tbb/tbb_profiling.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -63,7 +63,7 @@ namespace tbb {
/** Should be used in the "tbb" namespace only.
Don't place semicolon after it to avoid compiler warnings. **/
#if _WIN32||_WIN64
- #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \
+ #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \
namespace profiling { \
inline void set_name( sync_object_type& obj, const wchar_t* name ) { \
tbb::internal::itt_set_sync_name_v3( &obj, name ); \
@@ -77,7 +77,7 @@ namespace tbb {
} \
}
#else /* !WIN */
- #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \
+ #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \
namespace profiling { \
inline void set_name( sync_object_type& obj, const char* name ) { \
tbb::internal::itt_set_sync_name_v3( &obj, name ); \
@@ -88,13 +88,13 @@ namespace tbb {
#else /* no tools support */
#if _WIN32||_WIN64
- #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \
+ #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \
namespace profiling { \
inline void set_name( sync_object_type&, const wchar_t* ) {} \
inline void set_name( sync_object_type&, const char* ) {} \
}
#else /* !WIN */
- #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \
+ #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \
namespace profiling { \
inline void set_name( sync_object_type&, const char* ) {} \
}
diff --git a/include/tbb/tbb_stddef.h b/include/tbb/tbb_stddef.h
index 5f527b7..1c5b581 100644
--- a/include/tbb/tbb_stddef.h
+++ b/include/tbb/tbb_stddef.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -31,10 +31,10 @@
// Marketing-driven product version
#define TBB_VERSION_MAJOR 4
-#define TBB_VERSION_MINOR 0
+#define TBB_VERSION_MINOR 1
// Engineering-focused interface version
-#define TBB_INTERFACE_VERSION 6005
+#define TBB_INTERFACE_VERSION 6104
#define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000
// The oldest major interface version still supported
@@ -99,30 +99,6 @@
- \subpage parallel_sort_iter_req
**/
-// Define preprocessor symbols used to determine architecture
-#if _WIN32||_WIN64
-# if defined(_M_X64)||defined(__x86_64__) // the latter for MinGW support
-# define __TBB_x86_64 1
-# elif defined(_M_IA64)
-# define __TBB_ipf 1
-# elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support
-# define __TBB_x86_32 1
-# endif
-#else /* Assume generic Unix */
-# if !__linux__ && !__APPLE__
-# define __TBB_generic_os 1
-# endif
-# if __x86_64__
-# define __TBB_x86_64 1
-# elif __ia64__
-# define __TBB_ipf 1
-# elif __i386__||__i386 // __i386 is for Sun OS
-# define __TBB_x86_32 1
-# else
-# define __TBB_generic_arch 1
-# endif
-#endif
-
// tbb_config.h should be included the first since it contains macro definitions used in other headers
#include "tbb_config.h"
@@ -328,9 +304,11 @@ template<typename T>
inline void poison_pointer( T* ) {/*do nothing*/}
#endif /* !TBB_USE_ASSERT */
-//! Cast pointer from U* to T.
+//! Cast between unrelated pointer types.
/** This method should be used sparingly as a last resort for dealing with
situations that inherently break strict ISO C++ aliasing rules. */
+// T is a pointer type because it will be explicitly provided by the programmer as a template argument;
+// U is a referent type to enable the compiler to check that "ptr" is a pointer, deducing U in the process.
template<typename T, typename U>
inline T punned_cast( U* ptr ) {
uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
@@ -371,15 +349,49 @@ struct allocator_type<const T> {
};
#endif
-//! A function to select either 32-bit or 64-bit value, depending on machine word size.
-inline size_t size_t_select( unsigned u, unsigned long long ull ) {
- /* Explicit cast of the arguments to size_t is done to avoid compiler warnings
- (e.g. by Clang and MSVC) about possible truncation. The value of the right size,
- which is selected by ?:, is anyway not truncated or promoted.
- MSVC still warns if this trick is applied directly to constants, hence this function. */
- return (sizeof(size_t)==sizeof(u)) ? size_t(u) : size_t(ull);
+//! A template to select either 32-bit or 64-bit constant as compile time, depending on machine word size.
+template <unsigned u, unsigned long long ull >
+struct select_size_t_constant {
+ //Explicit cast is needed to avoid compiler warnings about possible truncation.
+ //The value of the right size, which is selected by ?:, is anyway not truncated or promoted.
+ static const size_t value = (size_t)((sizeof(size_t)==sizeof(u)) ? u : ull);
+};
+
+//! A function to check if passed in pointer is aligned on a specific border
+template<typename T>
+inline bool is_aligned(T* pointer, uintptr_t alignment) {
+ return 0==((uintptr_t)pointer & (alignment-1));
}
+//! A function to check if passed integer is a power of 2
+template<typename integer_type>
+inline bool is_power_of_two(integer_type arg) {
+ return arg && (0 == (arg & (arg - 1)));
+}
+
+//! A function to compute arg modulo divisor where divisor is a power of 2.
+template<typename argument_integer_type, typename divisor_integer_type>
+inline argument_integer_type modulo_power_of_two(argument_integer_type arg, divisor_integer_type divisor) {
+ // Divisor is assumed to be a power of two (which is valid for current uses).
+ __TBB_ASSERT( is_power_of_two(divisor), "Divisor should be a power of two" );
+ return (arg & (divisor - 1));
+}
+
+
+//! A function to determine if "arg is a multiplication of a number and a power of 2".
+// i.e. for strictly positive i and j, with j a power of 2,
+// determines whether i==j<<k for some nonnegative k (so i==j yields true).
+template<typename argument_integer_type, typename divisor_integer_type>
+inline bool is_power_of_two_factor(argument_integer_type arg, divisor_integer_type divisor) {
+ // Divisor is assumed to be a power of two (which is valid for current uses).
+ __TBB_ASSERT( is_power_of_two(divisor), "Divisor should be a power of two" );
+ return 0 == (arg & (arg - divisor));
+}
+
+//! Utility template function to prevent "unused" warnings by various compilers.
+template<typename T>
+void suppress_unused_warning( const T& ) {}
+
// Struct to be used as a version tag for inline functions.
/** Version tag can be necessary to prevent loader on Linux from using the wrong
symbol in debug builds (when inline functions are compiled as out-of-line). **/
@@ -392,5 +404,28 @@ typedef version_tag_v3 version_tag;
} // tbb
+namespace tbb { namespace internal {
+template <bool condition>
+struct STATIC_ASSERTION_FAILED;
+
+template <>
+struct STATIC_ASSERTION_FAILED<false> { enum {value=1};};
+
+template<>
+struct STATIC_ASSERTION_FAILED<true>; //intentionally left undefined to cause compile time error
+}} // namespace tbb { namespace internal {
+
+#if __TBB_STATIC_ASSERT_PRESENT
+#define __TBB_STATIC_ASSERT(condition,msg) static_assert(condition,msg)
+#else
+//please note condition is intentionally inverted to get a bit more understandable error msg
+#define __TBB_STATIC_ASSERT_IMPL1(condition,msg,line) \
+ enum {static_assert_on_line_##line = tbb::internal::STATIC_ASSERTION_FAILED<!(condition)>::value}
+
+#define __TBB_STATIC_ASSERT_IMPL(condition,msg,line) __TBB_STATIC_ASSERT_IMPL1(condition,msg,line)
+//! Verify at compile time that passed in condition is hold
+#define __TBB_STATIC_ASSERT(condition,msg) __TBB_STATIC_ASSERT_IMPL(condition,msg,__LINE__)
+#endif
+
#endif /* RC_INVOKED */
#endif /* __TBB_tbb_stddef_H */
diff --git a/include/tbb/tbb_thread.h b/include/tbb/tbb_thread.h
index 1edaa2e..7ba6ff1 100644
--- a/include/tbb/tbb_thread.h
+++ b/include/tbb/tbb_thread.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,17 +29,22 @@
#ifndef __TBB_tbb_thread_H
#define __TBB_tbb_thread_H
+#include "tbb_stddef.h"
#if _WIN32||_WIN64
#include "machine/windows_api.h"
#define __TBB_NATIVE_THREAD_ROUTINE unsigned WINAPI
#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) unsigned (WINAPI* r)( void* )
+#if __TBB_WIN8UI_SUPPORT
+typedef size_t thread_id_type;
+#else // __TBB_WIN8UI_SUPPORT
+typedef DWORD thread_id_type;
+#endif // __TBB_WIN8UI_SUPPORT
#else
#define __TBB_NATIVE_THREAD_ROUTINE void*
#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) void* (*r)( void* )
#include <pthread.h>
#endif // _WIN32||_WIN64
-#include "tbb_stddef.h"
#include "tick_count.h"
#if !TBB_USE_EXCEPTIONS && _MSC_VER
@@ -183,7 +188,7 @@ namespace internal {
private:
native_handle_type my_handle;
#if _WIN32||_WIN64
- DWORD my_thread_id;
+ thread_id_type my_thread_id;
#endif // _WIN32||_WIN64
/** Runs start_routine(closure) on another thread and sets my_handle to the handle of the created thread. */
@@ -195,8 +200,8 @@ namespace internal {
class tbb_thread_v3::id {
#if _WIN32||_WIN64
- DWORD my_id;
- id( DWORD id_ ) : my_id(id_) {}
+ thread_id_type my_id;
+ id( thread_id_type id_ ) : my_id(id_) {}
#else
pthread_t my_id;
id( pthread_t id_ ) : my_id(id_) {}
@@ -281,9 +286,9 @@ inline void swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ) {
t1.my_handle = t2.my_handle;
t2.my_handle = h;
#if _WIN32||_WIN64
- DWORD i = t1.my_thread_id;
- t1.my_thread_id = t2.my_thread_id;
- t2.my_thread_id = i;
+ thread_id_type i = t1.my_thread_id;
+ t1.my_thread_id = t2.my_thread_id;
+ t2.my_thread_id = i;
#endif /* _WIN32||_WIN64 */
}
diff --git a/include/tbb/tbbmalloc_proxy.h b/include/tbb/tbbmalloc_proxy.h
index 181144f..0165073 100644
--- a/include/tbb/tbbmalloc_proxy.h
+++ b/include/tbb/tbbmalloc_proxy.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/include/tbb/tick_count.h b/include/tbb/tick_count.h
index 4c56e4e..c93c6b3 100644
--- a/include/tbb/tick_count.h
+++ b/include/tbb/tick_count.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -79,6 +79,19 @@ public:
//! Subtraction operator
interval_t& operator-=( const interval_t& i ) {value -= i.value; return *this;}
+ private:
+ static long long ticks_per_second(){
+#if _WIN32||_WIN64
+ LARGE_INTEGER qpfreq;
+ int rval = QueryPerformanceFrequency(&qpfreq);
+ __TBB_ASSERT_EX(rval, "QueryPerformanceFrequency returned zero");
+ return static_cast<long long>(qpfreq.QuadPart);
+#elif __linux__
+ return static_cast<long long>(1E9);
+#else /* generic Unix */
+ return static_cast<long long>(1E6);
+#endif /* (choice of OS) */
+ }
};
//! Construct an absolute timestamp initialized to zero.
@@ -90,6 +103,9 @@ public:
//! Subtract two timestamps to get the time interval between
friend interval_t operator-( const tick_count& t1, const tick_count& t0 );
+ //! Return the resolution of the clock in seconds per tick.
+ static double resolution() { return 1.0 / interval_t::ticks_per_second(); }
+
private:
long long my_count;
};
@@ -98,39 +114,25 @@ inline tick_count tick_count::now() {
tick_count result;
#if _WIN32||_WIN64
LARGE_INTEGER qpcnt;
- QueryPerformanceCounter(&qpcnt);
+ int rval = QueryPerformanceCounter(&qpcnt);
+ __TBB_ASSERT_EX(rval, "QueryPerformanceCounter failed");
result.my_count = qpcnt.QuadPart;
#elif __linux__
struct timespec ts;
-#if TBB_USE_ASSERT
- int status =
-#endif /* TBB_USE_ASSERT */
- clock_gettime( CLOCK_REALTIME, &ts );
- __TBB_ASSERT( status==0, "CLOCK_REALTIME not supported" );
+ int status = clock_gettime( CLOCK_REALTIME, &ts );
+ __TBB_ASSERT_EX( status==0, "CLOCK_REALTIME not supported" );
result.my_count = static_cast<long long>(1000000000UL)*static_cast<long long>(ts.tv_sec) + static_cast<long long>(ts.tv_nsec);
#else /* generic Unix */
struct timeval tv;
-#if TBB_USE_ASSERT
- int status =
-#endif /* TBB_USE_ASSERT */
- gettimeofday(&tv, NULL);
- __TBB_ASSERT( status==0, "gettimeofday failed" );
+ int status = gettimeofday(&tv, NULL);
+ __TBB_ASSERT_EX( status==0, "gettimeofday failed" );
result.my_count = static_cast<long long>(1000000)*static_cast<long long>(tv.tv_sec) + static_cast<long long>(tv.tv_usec);
#endif /*(choice of OS) */
return result;
}
-inline tick_count::interval_t::interval_t( double sec )
-{
-#if _WIN32||_WIN64
- LARGE_INTEGER qpfreq;
- QueryPerformanceFrequency(&qpfreq);
- value = static_cast<long long>(sec*qpfreq.QuadPart);
-#elif __linux__
- value = static_cast<long long>(sec*1E9);
-#else /* generic Unix */
- value = static_cast<long long>(sec*1E6);
-#endif /* (choice of OS) */
+inline tick_count::interval_t::interval_t( double sec ) {
+ value = static_cast<long long>(sec*interval_t::ticks_per_second());
}
inline tick_count::interval_t operator-( const tick_count& t1, const tick_count& t0 ) {
@@ -138,18 +140,9 @@ inline tick_count::interval_t operator-( const tick_count& t1, const tick_count&
}
inline double tick_count::interval_t::seconds() const {
-#if _WIN32||_WIN64
- LARGE_INTEGER qpfreq;
- QueryPerformanceFrequency(&qpfreq);
- return value/(double)qpfreq.QuadPart;
-#elif __linux__
- return value*1E-9;
-#else /* generic Unix */
- return value*1E-6;
-#endif /* (choice of OS) */
+ return value*tick_count::resolution();
}
} // namespace tbb
#endif /* __TBB_tick_count_H */
-
diff --git a/index.html b/index.html
index 7abe0f4..bf468e1 100644
--- a/index.html
+++ b/index.html
@@ -2,7 +2,7 @@
<BODY>
<H2>Overview</H2>
-Top level directory for Intel® Threading Building Blocks (Intel® TBB).
+Top level directory for Intel® Threading Building Blocks.
<P>
To build Intel TBB, use the <A HREF=Makefile>top-level Makefile</A>; see also the <A HREF=build/index.html#build>build directions</A>.
To port Intel TBB to a new platform, operating system or architecture, see the <A HREF=build/index.html#port>porting directions</A>.
@@ -16,7 +16,7 @@ To port Intel TBB to a new platform, operating system or architecture, see the <
<H2>Directories</H2>
<DL>
-<DT><A HREF="doc/index.html">doc</A>
+<DT><A HREF="doc/html/index.html">doc</A>
<DD>Documentation for the library.
<DT><A HREF="include/index.html">include</A>
<DD>Include files required for compiling code that uses the library.
@@ -26,13 +26,11 @@ To port Intel TBB to a new platform, operating system or architecture, see the <
<DD>Source code for the library.
<DT><A HREF="build/index.html">build</A>
<DD>Internal Makefile infrastructure for Intel TBB. Do not use directly; see the <A HREF=build/index.html#build>build directions</A>.
-<DT><A HREF="ia32">ia32</A>, <A HREF="intel64">intel64</A>, <A HREF="ia64">ia64</A>
-<DD>Platform-specific binary files for the library.
</DL>
<HR>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/examples/parallel_reduce/primes/Makefile b/jni/Android.mk
similarity index 56%
copy from examples/parallel_reduce/primes/Makefile
copy to jni/Android.mk
index 9b6f06e..761bb07 100644
--- a/examples/parallel_reduce/primes/Makefile
+++ b/jni/Android.mk
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -24,46 +24,22 @@
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.
-# GNU Makefile that builds and runs example.
-PROG=primes
-ARGS=
-PERF_RUN_ARGS=silent auto 1000000000 1000 20
-
-# The C++ compiler
-ifneq (,$(shell which icc 2>/dev/null))
-CXX=icc
-endif # icc
-
-ifeq ($(offload), mic)
-override CXXFLAGS += -D__TBB_MIC=1
-endif
-
-ifeq ($(CXX), icc)
-TBBLIB = -tbb
-TBBLIB_DEBUG = -tbb
+ifeq (armeabi-v7a,$(APP_ABI))
+ export SYSROOT:=$(NDK_ROOT)/platforms/$(APP_PLATFORM)/arch-arm
else
-TBBLIB = -ltbb
-TBBLIB_DEBUG = -ltbb_debug
+ export SYSROOT:=$(NDK_ROOT)/platforms/$(APP_PLATFORM)/arch-$(APP_ABI)
endif
-
-ifeq ($(shell uname), Linux)
-LIBS+= -lrt
+ifeq (windows,$(tbb_os))
+ export CPATH_SEPARATOR :=;
+else
+ export CPATH_SEPARATOR :=:
endif
-
-all: release test
-
-release: main.cpp primes.cpp
- $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ $(TBBLIB) $(LIBS)
-
-debug: main.cpp primes.cpp
- $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ $(TBBLIB_DEBUG) $(LIBS)
-
-clean:
- $(RM) $(PROG) *.o *.d
-
-test:
- ./$(PROG) $(ARGS)
-
-perf_build: release
-
-perf_run:
+export CPATH := $(SYSROOT)/usr/include$(CPATH_SEPARATOR)$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/include$(CPATH_SEPARATOR)$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(APP_ABI)/include
+#LIB_GNU_STL_ANDROID is required to be set up for copying Android specific library libgnustl_shared.so to '.'
+export LIB_GNU_STL_ANDROID := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(APP_ABI)
+export CPLUS_LIB_PATH := $(SYSROOT)/usr/lib -L$(LIB_GNU_STL_ANDROID)
+export ANDROID_NDK_ROOT:=$(NDK_ROOT)
+export target_os_version:=$(APP_PLATFORM)
+export tbb_tool_prefix:=$(TOOLCHAIN_PREFIX)
+
+include $(NDK_PROJECT_PATH)/src/Makefile
diff --git a/build/test_launcher.sh b/jni/Application.mk
similarity index 77%
copy from build/test_launcher.sh
copy to jni/Application.mk
index 0e80d43..0baabd9 100644
--- a/build/test_launcher.sh
+++ b/jni/Application.mk
@@ -1,6 +1,4 @@
-#!/bin/sh
-#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -26,17 +24,15 @@
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.
-while getopts "l:" flag #
-do #
- if [ `uname` != 'Linux' ] ; then #
- echo 'skip' #
- exit #
- fi #
- LD_PRELOAD=$OPTARG #
- shift `expr $OPTIND - 1` #
-done #
-# Set stack limit
-ulimit -s 10240 #
-# Run the command line passed via parameters
-export LD_PRELOAD #
-./$* #
+export tbb_os?=linux
+export compiler?=gcc
+export arch?=ia32
+export target?=android
+
+ifeq (arm,$(arch))
+ APP_ABI:=armeabi-v7a
+else
+ APP_ABI:=x86
+endif
+APP_PLATFORM:=android-9
+NDK_TOOLCHAIN_VERSION:=4.6
diff --git a/src/Makefile b/src/Makefile
index 74546b6..7649e9f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,4 +1,4 @@
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
@@ -40,9 +40,9 @@ tbbproxy: tbbproxy_release tbbproxy_debug
rml: rml_release rml_debug
-test: tbbmalloc_test_release $(if $(use_proxy),tbbproxy_test_release) rml_test_release test_release tbbmalloc_test_debug $(if $(use_proxy),tbbproxy_test_debug) rml_test_debug test_debug
+test: tbbmalloc_test_release $(if $(use_proxy),tbbproxy_test_release) rml_test_release tbb_test_release tbbmalloc_test_debug $(if $(use_proxy),tbbproxy_test_debug) rml_test_debug tbb_test_debug
-test_no_depends: tbbmalloc_test_release_no_depends $(if $(use_proxy),tbbproxy_test_release_no_depends) test_release_no_depends tbbmalloc_test_debug_no_depends $(if $(use_proxy),tbbproxy_test_debug_no_depends) test_debug_no_depends
+tbb_test_no_depends: tbbmalloc_test_release_no_depends $(if $(use_proxy),tbbproxy_test_release_no_depends) tbb_test_release_no_depends tbbmalloc_test_debug_no_depends $(if $(use_proxy),tbbproxy_test_debug_no_depends) tbb_test_debug_no_depends
@echo done
release: tbb_release tbbmalloc_release $(if $(use_proxy),tbbproxy_release)
@@ -53,6 +53,8 @@ debug: $(call cross_cfg,tbbmalloc_test_debug) $(call cross_cfg, test_debug)
examples: tbb tbbmalloc examples_debug clean_examples examples_release
+examples_no_depends: examples_release_no_depends examples_debug_no_depends
+
clean: clean_release clean_debug clean_examples
@echo clean done
@@ -90,8 +92,8 @@ else
@$(MAKE) -C "$(work_dir)_$(cfg)" -r -f $(tbb_root)/build/Makefile.test cfg=$(cfg) tbb_root=$(tbb_root) $@
endif
-.PHONY: tbb_release tbb_debug test_release test_debug test_release_no_depends test_debug_no_depends
-
+.PHONY: test_release test_debug test_release_no_depends test_debug_no_depends
+.PHONY: tbb_release tbb_debug tbb_test_release tbb_test_debug tbb_test_release_no_depends tbb_test_debug_no_depends
# do not delete double-space after -C option
tbb_release: mkdir_release
$(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbb cfg=release tbb_root=$(tbb_root)
@@ -99,13 +101,18 @@ tbb_release: mkdir_release
tbb_debug: mkdir_debug
$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbb cfg=debug tbb_root=$(tbb_root)
-test_release: $(call cross_cfg,mkdir_release) $(call cross_cfg,tbb_release) $(if $(use_proxy),$(call cross_cfg,tbbproxy_release)) test_release_no_depends
-test_release_no_depends:
+tbb_test_release: $(call cross_cfg,tbb_release) $(if $(use_proxy),$(call cross_cfg,tbbproxy_release)) tbb_test_release_no_depends
+tbb_test_release_no_depends:$(call cross_cfg,mkdir_release)
$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.test cfg=release tbb_root=$(tbb_root)
-test_debug: $(call cross_cfg,mkdir_debug) $(call cross_cfg,tbb_debug) $(if $(use_proxy),$(call cross_cfg,tbbproxy_debug)) test_debug_no_depends
-test_debug_no_depends:
+tbb_test_debug: $(call cross_cfg,tbb_debug) $(if $(use_proxy),$(call cross_cfg,tbbproxy_debug)) tbb_test_debug_no_depends
+tbb_test_debug_no_depends:$(call cross_cfg,mkdir_debug)
$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.test cfg=debug tbb_root=$(tbb_root)
+# backward compatibility
+test_release: tbb_test_release
+test_debug: tbb_test_debug
+test_release_no_depends: tbb_test_release_no_depends
+test_debug_no_depends: tbb_test_debug_no_depends
.PHONY: tbbmalloc_release tbbmalloc_debug
.PHONY: tbbmalloc_dll_release tbbmalloc_dll_debug tbbmalloc_proxy_dll_release tbbmalloc_proxy_dll_debug
@@ -131,12 +138,12 @@ tbbmalloc_proxy_dll_debug: mkdir_debug
tbbmalloc_test: tbbmalloc_test_release tbbmalloc_test_debug
-tbbmalloc_test_release: $(call cross_cfg,mkdir_release) $(call cross_cfg,tbbmalloc_release) tbbmalloc_test_release_no_depends
-tbbmalloc_test_release_no_depends:
+tbbmalloc_test_release: $(call cross_cfg,tbbmalloc_release) tbbmalloc_test_release_no_depends
+tbbmalloc_test_release_no_depends: $(call cross_cfg,mkdir_release)
$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc_test_no_depends tbb_root=$(tbb_root)
-tbbmalloc_test_debug: $(call cross_cfg,mkdir_debug) $(call cross_cfg,tbbmalloc_debug) tbbmalloc_test_debug_no_depends
-tbbmalloc_test_debug_no_depends:
+tbbmalloc_test_debug: $(call cross_cfg,tbbmalloc_debug) tbbmalloc_test_debug_no_depends
+tbbmalloc_test_debug_no_depends: $(call cross_cfg,mkdir_debug)
$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc_test_no_depends tbb_root=$(tbb_root)
.PHONY: tbbproxy_release tbbproxy_debug
@@ -150,12 +157,12 @@ tbbproxy_debug: mkdir_debug tbb_debug
tbbproxy_test: tbbproxy_test_release tbbproxy_test_debug
-tbbproxy_test_release: $(call cross_cfg,mkdir_release) $(call cross_cfg,tbb_release) $(call cross_cfg,tbbproxy_release) tbbproxy_test_release_no_depends
-tbbproxy_test_release_no_depends:
+tbbproxy_test_release: $(call cross_cfg,tbb_release) $(call cross_cfg,tbbproxy_release) tbbproxy_test_release_no_depends
+tbbproxy_test_release_no_depends:$(call cross_cfg,mkdir_release)
$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=release tbbproxy_test tbb_root=$(tbb_root)
-tbbproxy_test_debug: $(call cross_cfg,mkdir_debug) $(call cross_cfg,tbb_debug) $(call cross_cfg,tbbproxy_debug) tbbproxy_test_debug_no_depends
-tbbproxy_test_debug_no_depends:
+tbbproxy_test_debug: $(call cross_cfg,tbb_debug) $(call cross_cfg,tbbproxy_debug) tbbproxy_test_debug_no_depends
+tbbproxy_test_debug_no_depends: $(call cross_cfg,mkdir_debug)
$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=debug tbbproxy_test tbb_root=$(tbb_root)
.PHONY: rml_release rml_debug rml_test_release rml_test_debug
@@ -167,20 +174,22 @@ rml_release: mkdir_release
rml_debug: mkdir_debug
$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.rml cfg=debug tbb_root=$(tbb_root) rml
-rml_test_release: $(call cross_cfg,mkdir_release) $(call cross_cfg,rml_release) rml_test_release_no_depends
-rml_test_release_no_depends:
+rml_test_release: $(call cross_cfg,rml_release) rml_test_release_no_depends
+rml_test_release_no_depends: $(call cross_cfg,mkdir_release)
$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.rml cfg=release rml_test tbb_root=$(tbb_root)
-rml_test_debug: $(call cross_cfg,mkdir_debug) $(call cross_cfg,rml_debug) rml_test_debug_no_depends
-rml_test_debug_no_depends:
+rml_test_debug: $(call cross_cfg,rml_debug) rml_test_debug_no_depends
+rml_test_debug_no_depends: $(call cross_cfg,mkdir_debug)
$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.rml cfg=debug rml_test tbb_root=$(tbb_root)
-.PHONY: examples_release examples_debug
+.PHONY: examples_release examples_debug examples_release_no_depends examples_debug_no_depends
-examples_release: tbb_release tbbmalloc_release
+examples_release: tbb_release tbbmalloc_release examples_release_no_depends
+examples_release_no_depends:
$(MAKE) -C $(examples_root) -r -f Makefile tbb_root=.. release test
-examples_debug: tbb_debug tbbmalloc_debug
+examples_debug: tbb_debug tbbmalloc_debug examples_debug_no_depends
+examples_debug_no_depends:
$(MAKE) -C $(examples_root) -r -f Makefile tbb_root=.. debug test
.PHONY: clean_release clean_debug clean_examples
diff --git a/src/index.html b/src/index.html
index cf2a66a..d990480 100644
--- a/src/index.html
+++ b/src/index.html
@@ -66,7 +66,7 @@ This directory contains the source code and unit tests for Threading Building Bl
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/src/old/concurrent_queue_v2.cpp b/src/old/concurrent_queue_v2.cpp
index 4e7101e..9a4fafa 100644
--- a/src/old/concurrent_queue_v2.cpp
+++ b/src/old/concurrent_queue_v2.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -154,7 +154,7 @@ public:
void micro_queue::push( const void* item, ticket k, concurrent_queue_base& base ) {
k &= -concurrent_queue_rep::n_queue;
page* p = NULL;
- size_t index = (k/concurrent_queue_rep::n_queue & base.items_per_page-1);
+ size_t index = modulo_power_of_two( k/concurrent_queue_rep::n_queue, base.items_per_page );
if( !index ) {
size_t n = sizeof(page) + base.items_per_page*base.item_size;
p = static_cast<page*>(operator new( n ));
@@ -186,7 +186,7 @@ bool micro_queue::pop( void* dst, ticket k, concurrent_queue_base& base ) {
spin_wait_while_eq( tail_counter, k );
page& p = *head_page;
__TBB_ASSERT( &p, NULL );
- size_t index = (k/concurrent_queue_rep::n_queue & base.items_per_page-1);
+ size_t index = modulo_power_of_two( k/concurrent_queue_rep::n_queue, base.items_per_page );
bool success = false;
{
pop_finalizer finalizer( *this, k+concurrent_queue_rep::n_queue, index==base.items_per_page-1 ? &p : NULL );
@@ -327,7 +327,7 @@ public:
else {
concurrent_queue_base::page* p = array[concurrent_queue_rep::index(k)];
__TBB_ASSERT(p,NULL);
- size_t i = k/concurrent_queue_rep::n_queue & my_queue.items_per_page-1;
+ size_t i = modulo_power_of_two( k/concurrent_queue_rep::n_queue, my_queue.items_per_page );
return static_cast<unsigned char*>(static_cast<void*>(p+1)) + my_queue.item_size*i;
}
}
@@ -359,7 +359,7 @@ void concurrent_queue_iterator_base::advance() {
size_t k = my_rep->head_counter;
const concurrent_queue_base& queue = my_rep->my_queue;
__TBB_ASSERT( my_item==my_rep->choose(k), NULL );
- size_t i = k/concurrent_queue_rep::n_queue & queue.items_per_page-1;
+ size_t i = modulo_power_of_two( k/concurrent_queue_rep::n_queue, queue.items_per_page );
if( i==queue.items_per_page-1 ) {
concurrent_queue_base::page*& root = my_rep->array[concurrent_queue_rep::index(k)];
root = root->next;
diff --git a/src/old/concurrent_queue_v2.h b/src/old/concurrent_queue_v2.h
index ed3dc13..c7614e9 100644
--- a/src/old/concurrent_queue_v2.h
+++ b/src/old/concurrent_queue_v2.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -102,7 +102,7 @@ protected:
//! Type-independent portion of concurrent_queue_iterator.
/** @ingroup containers */
-class concurrent_queue_iterator_base {
+class concurrent_queue_iterator_base : no_assign{
//! concurrent_queue over which we are iterating.
/** NULL if one past last element in queue. */
concurrent_queue_iterator_rep* my_rep;
diff --git a/src/old/concurrent_vector_v2.cpp b/src/old/concurrent_vector_v2.cpp
index 9480eb8..14be6e7 100644
--- a/src/old/concurrent_vector_v2.cpp
+++ b/src/old/concurrent_vector_v2.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/old/concurrent_vector_v2.h b/src/old/concurrent_vector_v2.h
index 6f07736..6754ac8 100644
--- a/src/old/concurrent_vector_v2.h
+++ b/src/old/concurrent_vector_v2.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/old/spin_rw_mutex_v2.cpp b/src/old/spin_rw_mutex_v2.cpp
index 3c99b80..30cf46e 100644
--- a/src/old/spin_rw_mutex_v2.cpp
+++ b/src/old/spin_rw_mutex_v2.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,13 +29,14 @@
#include "spin_rw_mutex_v2.h"
#include "tbb/tbb_machine.h"
#include "../tbb/itt_notify.h"
+#include "tbb/atomic.h"
namespace tbb {
using namespace internal;
static inline bool CAS(volatile uintptr_t &addr, uintptr_t newv, uintptr_t oldv) {
- return __TBB_CompareAndSwapW((volatile void *)&addr, (intptr_t)newv, (intptr_t)oldv) == (intptr_t)oldv;
+ return as_atomic(addr).compare_and_swap(newv, oldv) == oldv;
}
//! Signal that write lock is released
diff --git a/src/old/spin_rw_mutex_v2.h b/src/old/spin_rw_mutex_v2.h
index 1bffe5e..3ebe9f5 100644
--- a/src/old/spin_rw_mutex_v2.h
+++ b/src/old/spin_rw_mutex_v2.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/old/task_v2.cpp b/src/old/task_v2.cpp
index 96dd3d9..42d5f85 100644
--- a/src/old/task_v2.cpp
+++ b/src/old/task_v2.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/old/test_concurrent_queue_v2.cpp b/src/old/test_concurrent_queue_v2.cpp
index 9dc24ae..0a59b36 100644
--- a/src/old/test_concurrent_queue_v2.cpp
+++ b/src/old/test_concurrent_queue_v2.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -36,11 +36,12 @@
static tbb::atomic<long> FooConstructed;
static tbb::atomic<long> FooDestroyed;
+enum state_t{
+ LIVE=0x1234,
+ DEAD=0xDEAD
+};
+
class Foo {
- enum state_t{
- LIVE=0x1234,
- DEAD=0xDEAD
- };
state_t state;
public:
int thread_id;
@@ -58,8 +59,8 @@ public:
ASSERT( state==LIVE, NULL );
++FooDestroyed;
state=DEAD;
- thread_id=0xDEAD;
- serial=0xDEAD;
+ thread_id=DEAD;
+ serial=DEAD;
}
void operator=( Foo& item ) {
ASSERT( item.state==LIVE, NULL );
@@ -96,8 +97,8 @@ struct Body: NoAssign {
long sum = 0;
for( long j=0; j<M; ++j ) {
Foo f;
- f.thread_id = 0xDEAD;
- f.serial = 0xDEAD;
+ f.thread_id = DEAD;
+ f.serial = DEAD;
bool prepopped = false;
if( j&1 ) {
prepopped = queue->pop_if_present(f);
diff --git a/src/old/test_concurrent_vector_v2.cpp b/src/old/test_concurrent_vector_v2.cpp
index ad9c12a..41203b1 100644
--- a/src/old/test_concurrent_vector_v2.cpp
+++ b/src/old/test_concurrent_vector_v2.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/old/test_mutex_v2.cpp b/src/old/test_mutex_v2.cpp
index 24fb32b..9bf69a1 100644
--- a/src/old/test_mutex_v2.cpp
+++ b/src/old/test_mutex_v2.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -35,6 +35,7 @@
//
// Compile with _OPENMP and -openmp
//------------------------------------------------------------------------
+#include "../test/harness_defs.h"
#include "tbb/atomic.h"
#include "tbb/blocked_range.h"
#include "tbb/parallel_for.h"
@@ -103,11 +104,9 @@ struct Invariant {
M mutex;
const char* mutex_name;
volatile long value[N];
- volatile long single_value;
Invariant( const char* mutex_name_ ) :
mutex_name(mutex_name_)
{
- single_value = 0;
for( size_t k=0; k<N; ++k )
value[k] = 0;
}
diff --git a/src/test/test_task_scheduler_observer.cpp b/src/old/test_task_scheduler_observer_v3.cpp
similarity index 96%
copy from src/test/test_task_scheduler_observer.cpp
copy to src/old/test_task_scheduler_observer_v3.cpp
index 16e2170..5c994e3 100644
--- a/src/test/test_task_scheduler_observer.cpp
+++ b/src/old/test_task_scheduler_observer_v3.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+//TODO: when removing TBB_PREVIEW_LOCAL_OBSERVER, change the header or defines here
#include "tbb/task_scheduler_observer.h"
typedef uintptr_t FlagType;
diff --git a/src/perf/coarse_grained_raii_lru_cache.h b/src/perf/coarse_grained_raii_lru_cache.h
index b087d94..99aff02 100644
--- a/src/perf/coarse_grained_raii_lru_cache.h
+++ b/src/perf/coarse_grained_raii_lru_cache.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/perf/cpq_pdes.cpp b/src/perf/cpq_pdes.cpp
new file mode 100644
index 0000000..b6e8aa3
--- /dev/null
+++ b/src/perf/cpq_pdes.cpp
@@ -0,0 +1,239 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#include <cstdlib>
+#include <cmath>
+#include <queue>
+#include "tbb/tbb_stddef.h"
+#include "tbb/spin_mutex.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/parallel_for.h"
+#include "tbb/tick_count.h"
+#include "tbb/blocked_range.h"
+#include "../test/harness.h"
+#include "tbb/concurrent_priority_queue.h"
+
+#pragma warning(disable: 4996)
+
+#define IMPL_STL 0
+#define IMPL_CPQ 1
+
+using namespace tbb;
+
+//const int contention = 75; // degree contention. 100 = 0 us busy_wait, 50 = 50*contention_unit us
+const double contention_unit = 0.025; // in microseconds (us)
+const double throughput_window = 30; // in seconds
+const int num_initial_events = 10000; // number of initial events in the queue
+const int min_elapse = 20; // min contention_units to elapse between event spawns
+const int max_elapse = 40; // max contention_units to elapse between event spawns
+const int min_spawn = 0; // min number of events to spawn
+const int max_spawn = 2; // max number of events to spawn
+
+tbb::atomic<unsigned int> operation_count;
+tbb::tick_count start;
+bool done;
+
+class event {
+public:
+ int timestamp;
+ int elapse;
+ int spawn;
+};
+
+class timestamp_compare {
+public:
+ bool operator()(event e1, event e2) {
+ return e2.timestamp<e1.timestamp;
+ }
+};
+
+spin_mutex *my_mutex;
+std::priority_queue<event, std::vector<event>, timestamp_compare > *stl_cpq;
+concurrent_priority_queue<event, timestamp_compare > *lfc_pq;
+
+unsigned int one_us_iters = 429; // default value
+
+// if user wants to calibrate to microseconds on particular machine, call this at beginning of program
+// sets one_us_iters to number of iters to busy_wait for approx. 1 us
+void calibrate_busy_wait() {
+ tbb::tick_count t0, t1;
+
+ t0 = tbb::tick_count::now();
+ for (volatile unsigned int i=0; i<1000000; ++i) continue;
+ t1 = tbb::tick_count::now();
+
+ one_us_iters = (1000000.0/(t1-t0).seconds())*0.000001;
+ printf("one_us_iters: %d\n", one_us_iters);
+}
+
+void busy_wait(double us)
+{
+ unsigned int iter = us*one_us_iters;
+ for (volatile unsigned int i=0; i<iter; ++i) continue;
+}
+
+
+void do_push(event elem, int nThr, int impl) {
+ if (impl == IMPL_STL) {
+ if (nThr == 1) {
+ stl_cpq->push(elem);
+ }
+ else {
+ tbb::spin_mutex::scoped_lock myLock(*my_mutex);
+ stl_cpq->push(elem);
+ }
+ }
+ else {
+ lfc_pq->push(elem);
+ }
+}
+
+bool do_pop(event& elem, int nThr, int impl) {
+ if (impl == IMPL_STL) {
+ if (nThr == 1) {
+ if (!stl_cpq->empty()) {
+ elem = stl_cpq->top();
+ stl_cpq->pop();
+ return true;
+ }
+ }
+ else {
+ tbb::spin_mutex::scoped_lock myLock(*my_mutex);
+ if (!stl_cpq->empty()) {
+ elem = stl_cpq->top();
+ stl_cpq->pop();
+ return true;
+ }
+ }
+ }
+ else {
+ if (lfc_pq->try_pop(elem)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+struct TestPDESloadBody : NoAssign {
+ int nThread;
+ int implementation;
+
+ TestPDESloadBody(int nThread_, int implementation_) :
+ nThread(nThread_), implementation(implementation_) {}
+
+ void operator()(const int threadID) const {
+ if (threadID == nThread) {
+ sleep(throughput_window);
+ done = true;
+ }
+ else {
+ event e, tmp;
+ unsigned int num_operations = 0;
+ for (;;) {
+ // pop an event
+ if (do_pop(e, nThread, implementation)) {
+ num_operations++;
+ // do the event
+ busy_wait(e.elapse*contention_unit);
+ while (e.spawn > 0) {
+ tmp.spawn = ((e.spawn+1-min_spawn) % ((max_spawn-min_spawn)+1))+min_spawn;
+ tmp.timestamp = e.timestamp + e.elapse;
+ e.timestamp = tmp.timestamp;
+ e.elapse = ((e.elapse+1-min_elapse) % ((max_elapse-min_elapse)+1))+min_elapse;
+ tmp.elapse = e.elapse;
+ do_push(tmp, nThread, implementation);
+ num_operations++;
+ e.spawn--;
+ busy_wait(e.elapse*contention_unit);
+ if (done) break;
+ }
+ }
+ if (done) break;
+ }
+ operation_count += num_operations;
+ }
+ }
+};
+
+void preload_queue(int nThr, int impl) {
+ event an_event;
+ for (int i=0; i<num_initial_events; ++i) {
+ an_event.timestamp = 0;
+ an_event.elapse = (int)rand() % (max_elapse+1);
+ an_event.spawn = (int)rand() % (max_spawn+1);
+ do_push(an_event, nThr, impl);
+ }
+}
+
+void TestPDESload(int nThreads) {
+ REPORT("%4d", nThreads);
+
+ operation_count = 0;
+ done = false;
+ stl_cpq = new std::priority_queue<event, std::vector<event>, timestamp_compare >;
+ preload_queue(nThreads, IMPL_STL);
+ TestPDESloadBody my_stl_test(nThreads, IMPL_STL);
+ start = tbb::tick_count::now();
+ NativeParallelFor(nThreads+1, my_stl_test);
+ delete stl_cpq;
+
+ REPORT(" %10d", operation_count/throughput_window);
+
+ operation_count = 0;
+ done = false;
+ lfc_pq = new concurrent_priority_queue<event, timestamp_compare >;
+ preload_queue(nThreads, IMPL_CPQ);
+ TestPDESloadBody my_cpq_test(nThreads, IMPL_CPQ);
+ start = tbb::tick_count::now();
+ NativeParallelFor(nThreads+1, my_cpq_test);
+ delete lfc_pq;
+
+ REPORT(" %10d\n", operation_count/throughput_window);
+}
+
+int TestMain() {
+ srand(42);
+ if (MinThread < 1)
+ MinThread = 1;
+ //calibrate_busy_wait();
+ cache_aligned_allocator<spin_mutex> my_mutex_allocator;
+ my_mutex = (spin_mutex *)my_mutex_allocator.allocate(1);
+
+ REPORT("#Thr ");
+ REPORT("STL ");
+#ifdef LINEARIZABLE
+ REPORT("CPQ_L\n");
+#else
+ REPORT("CPQ_N\n");
+#endif
+ for (int p = MinThread; p <= MaxThread; ++p) {
+ TestPDESload(p);
+ }
+
+ return Harness::Done;
+}
diff --git a/src/perf/cpq_throughput_test.cpp b/src/perf/cpq_throughput_test.cpp
new file mode 100644
index 0000000..61809d0
--- /dev/null
+++ b/src/perf/cpq_throughput_test.cpp
@@ -0,0 +1,381 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#define HARNESS_CUSTOM_MAIN 1
+#define HARNESS_NO_PARSE_COMMAND_LINE 1
+
+#include <cstdlib>
+#include <cmath>
+#include <queue>
+#include "tbb/tbb_stddef.h"
+#include "tbb/spin_mutex.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/tick_count.h"
+#include "tbb/cache_aligned_allocator.h"
+#include "tbb/concurrent_priority_queue.h"
+#include "../test/harness.h"
+#pragma warning(disable: 4996)
+
+#define IMPL_SERIAL 0
+#define IMPL_STL 1
+#define IMPL_CPQ 2
+
+using namespace tbb;
+
+// test parameters & defaults
+int impl; // which implementation to test
+int contention = 1; // busywork between operations in us
+int preload = 0; // # elements to pre-load queue with
+double throughput_window = 30.0; // in seconds
+int ops_per_iteration = 20; // minimum: 2 (1 push, 1 pop)
+const int sample_operations = 1000; // for timing checks
+int min_threads = 1;
+int max_threads;
+
+// global data & types
+int pushes_per_iter;
+int pops_per_iter;
+tbb::atomic<unsigned int> operation_count;
+tbb::tick_count start;
+
+// a non-trivial data element to use in the priority queue
+const int padding_size = 15; // change to get cache line size for test machine
+class padding_type {
+public:
+ int p[padding_size];
+ padding_type& operator=(const padding_type& other) {
+ if (this != &other) {
+ for (int i=0; i<padding_size; ++i) {
+ p[i] = other.p[i];
+ }
+ }
+ return *this;
+ }
+};
+
+class my_data_type {
+public:
+ int priority;
+ padding_type padding;
+ my_data_type() : priority(0) {}
+};
+
+class my_less {
+public:
+ bool operator()(my_data_type d1, my_data_type d2) {
+ return d1.priority<d2.priority;
+ }
+};
+
+// arrays to get/put data from/to to generate non-trivial accesses during busywork
+my_data_type *input_data;
+my_data_type *output_data;
+size_t arrsz;
+
+// Serial priority queue
+std::priority_queue<my_data_type, std::vector<my_data_type>, my_less > *serial_cpq;
+
+// Coarse-locked priority queue
+spin_mutex *my_mutex;
+std::priority_queue<my_data_type, std::vector<my_data_type>, my_less > *stl_cpq;
+
+// TBB concurrent_priority_queue
+concurrent_priority_queue<my_data_type, my_less > *agg_cpq;
+
+// Busy work and calibration helpers
+unsigned int one_us_iters = 345; // default value
+
+// if user wants to calibrate to microseconds on particular machine, call
+// this at beginning of program; sets one_us_iters to number of iters to
+// busy_wait for approx. 1 us
+void calibrate_busy_wait() {
+ tbb::tick_count t0, t1;
+
+ t0 = tbb::tick_count::now();
+ for (volatile unsigned int i=0; i<1000000; ++i) continue;
+ t1 = tbb::tick_count::now();
+
+ one_us_iters = (unsigned int)((1000000.0/(t1-t0).seconds())*0.000001);
+ printf("one_us_iters: %d\n", one_us_iters);
+}
+
+void busy_wait(int us)
+{
+ unsigned int iter = us*one_us_iters;
+ for (volatile unsigned int i=0; i<iter; ++i) continue;
+}
+
+// Push to priority queue, depending on implementation
+void do_push(my_data_type elem, int nThr, int impl) {
+ if (impl == IMPL_SERIAL) {
+ serial_cpq->push(elem);
+ }
+ else if (impl == IMPL_STL) {
+ tbb::spin_mutex::scoped_lock myLock(*my_mutex);
+ stl_cpq->push(elem);
+ }
+ else if (impl == IMPL_CPQ) {
+ agg_cpq->push(elem);
+ }
+}
+
+// Pop from priority queue, depending on implementation
+my_data_type do_pop(int nThr, int impl) {
+ my_data_type elem;
+ if (impl == IMPL_SERIAL) {
+ if (!serial_cpq->empty()) {
+ elem = serial_cpq->top();
+ serial_cpq->pop();
+ return elem;
+ }
+ }
+ else if (impl == IMPL_STL) {
+ tbb::spin_mutex::scoped_lock myLock(*my_mutex);
+ if (!stl_cpq->empty()) {
+ elem = stl_cpq->top();
+ stl_cpq->pop();
+ return elem;
+ }
+ }
+ else if (impl == IMPL_CPQ) {
+ if (agg_cpq->try_pop(elem)) {
+ return elem;
+ }
+ }
+ return elem;
+}
+
+
+struct TestThroughputBody : NoAssign {
+ int nThread;
+ int implementation;
+
+ TestThroughputBody(int nThread_, int implementation_) :
+ nThread(nThread_), implementation(implementation_) {}
+
+ void operator()(const int threadID) const {
+ tbb::tick_count now;
+ int pos_in = threadID, pos_out = threadID;
+ my_data_type elem;
+ while (1) {
+ for (int i=0; i<sample_operations; i+=ops_per_iteration) {
+ // do pushes
+ for (int j=0; j<pushes_per_iter; ++j) {
+ elem = input_data[pos_in];
+ do_push(elem, nThread, implementation);
+ busy_wait(contention);
+ pos_in += nThread;
+ if (pos_in >= arrsz) pos_in = pos_in % arrsz;
+ }
+ // do pops
+ for (int j=0; j<pops_per_iter; ++j) {
+ output_data[pos_out] = do_pop(nThread, implementation);
+ busy_wait(contention);
+ pos_out += nThread;
+ if (pos_out >= arrsz) pos_out = pos_out % arrsz;
+ }
+ }
+ now = tbb::tick_count::now();
+ operation_count += sample_operations;
+ if ((now-start).seconds() >= throughput_window) break;
+ }
+ }
+};
+
+void TestSerialThroughput() {
+ tbb::tick_count now;
+
+ serial_cpq = new std::priority_queue<my_data_type, std::vector<my_data_type>, my_less >;
+ for (int i=0; i<preload; ++i) do_push(input_data[i], 1, IMPL_SERIAL);
+
+ TestThroughputBody my_serial_test(1, IMPL_SERIAL);
+ start = tbb::tick_count::now();
+ NativeParallelFor(1, my_serial_test);
+ now = tbb::tick_count::now();
+ delete serial_cpq;
+
+ printf("SERIAL 1 %10d\n", int(operation_count/(now-start).seconds()));
+}
+
+void TestThroughputCpqOnNThreads(int nThreads) {
+ tbb::tick_count now;
+
+ if (impl == IMPL_STL) {
+ stl_cpq = new std::priority_queue<my_data_type, std::vector<my_data_type>, my_less >;
+ for (int i=0; i<preload; ++i) do_push(input_data[i], nThreads, IMPL_STL);
+
+ TestThroughputBody my_stl_test(nThreads, IMPL_STL);
+ start = tbb::tick_count::now();
+ NativeParallelFor(nThreads, my_stl_test);
+ now = tbb::tick_count::now();
+ delete stl_cpq;
+
+ printf("STL %3d %10d\n", nThreads, int(operation_count/(now-start).seconds()));
+ }
+ else if (impl == IMPL_CPQ) {
+ agg_cpq = new concurrent_priority_queue<my_data_type, my_less >;
+ for (int i=0; i<preload; ++i) do_push(input_data[i], nThreads, IMPL_CPQ);
+
+ TestThroughputBody my_cpq_test(nThreads, IMPL_CPQ);
+ start = tbb::tick_count::now();
+ NativeParallelFor(nThreads, my_cpq_test);
+ now = tbb::tick_count::now();
+ delete agg_cpq;
+
+ printf("CPQ %3d %10d\n", nThreads, int(operation_count/(now-start).seconds()));
+ }
+}
+
+void printCommandLineErrorMsg() {
+ fprintf(stderr,
+ "Usage: a.out <min_threads>[:<max_threads>] "
+ "contention(us) queue_type pre-load batch duration"
+ "\n where queue_type is one of 0(SERIAL), 1(STL), 2(CPQ).\n");
+}
+
+void ParseCommandLine(int argc, char *argv[]) {
+ // Initialize defaults
+ max_threads = 1;
+ impl = IMPL_SERIAL;
+ int i = 1;
+ if (argc > 1) {
+ // read n_thread range
+ char* endptr;
+ min_threads = strtol( argv[i], &endptr, 0 );
+ if (*endptr == ':')
+ max_threads = strtol( endptr+1, &endptr, 0 );
+ else if (*endptr == '\0')
+ max_threads = min_threads;
+ if (*endptr != '\0') {
+ printCommandLineErrorMsg();
+ exit(1);
+ }
+ if (min_threads < 1) {
+ printf("ERROR: min_threads must be at least one.\n");
+ exit(1);
+ }
+ if (max_threads < min_threads) {
+ printf("ERROR: max_threads should not be less than min_threads\n");
+ exit(1);
+ }
+ ++i;
+ if (argc > 2) {
+ // read contention
+ contention = strtol( argv[i], &endptr, 0 );
+ if( *endptr!='\0' ) {
+ printf("ERROR: contention is garbled\n");
+ printCommandLineErrorMsg();
+ exit(1);
+ }
+ ++i;
+ if (argc > 3) {
+ // read impl
+ impl = strtol( argv[i], &endptr, 0 );
+ if( *endptr!='\0' ) {
+ printf("ERROR: impl is garbled\n");
+ printCommandLineErrorMsg();
+ exit(1);
+ }
+ if ((impl != IMPL_SERIAL) && (impl != IMPL_STL) && (impl != IMPL_CPQ)) {
+
+ printf("ERROR: impl of %d is invalid\n", impl);
+ printCommandLineErrorMsg();
+ exit(1);
+ }
+ ++i;
+ if (argc > 4) {
+ // read pre-load
+ preload = strtol( argv[i], &endptr, 0 );
+ if( *endptr!='\0' ) {
+ printf("ERROR: pre-load is garbled\n");
+ printCommandLineErrorMsg();
+ exit(1);
+ }
+ ++i;
+ if (argc > 5) {
+ //read batch
+ ops_per_iteration = strtol( argv[i], &endptr, 0 );
+ if( *endptr!='\0' ) {
+ printf("ERROR: batch size is garbled\n");
+ printCommandLineErrorMsg();
+ exit(1);
+ }
+ ++i;
+ if (argc > 6) {
+ // read duration
+ if (argc != 7) {
+ printf("ERROR: maximum of six args\n");
+ printCommandLineErrorMsg();
+ exit(1);
+ }
+ throughput_window = strtol( argv[i], &endptr, 0 );
+ if( *endptr!='\0' ) {
+ printf("ERROR: duration is garbled\n");
+ printCommandLineErrorMsg();
+ exit(1);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ printf("Priority queue performance test %d will run with %dus contention "
+ "using %d:%d threads, %d batch size, %d pre-loaded elements, for %d seconds.\n",
+ (int)impl, (int)contention, (int)min_threads, (int)max_threads,
+ (int)ops_per_iteration, (int) preload, (int)throughput_window);
+}
+
+int main(int argc, char *argv[]) {
+ ParseCommandLine(argc, argv);
+ srand(42);
+ arrsz = 100000;
+ input_data = new my_data_type[arrsz];
+ output_data = new my_data_type[arrsz];
+ for (int i=0; i<arrsz; ++i) {
+ input_data[i].priority = rand()%100;
+ }
+ //calibrate_busy_wait();
+ pushes_per_iter = ops_per_iteration/2;
+ pops_per_iter = ops_per_iteration/2;
+ operation_count = 0;
+
+ // Initialize mutex for Coarse-locked priority_queue
+ cache_aligned_allocator<spin_mutex> my_mutex_allocator;
+ my_mutex = (spin_mutex *)my_mutex_allocator.allocate(1);
+
+ if (impl == IMPL_SERIAL) {
+ TestSerialThroughput();
+ }
+ else {
+ for (int p = min_threads; p <= max_threads; ++p) {
+ TestThroughputCpqOnNThreads(p);
+ }
+ }
+ return Harness::Done;
+}
diff --git a/src/perf/fibonacci_impl_tbb.cpp b/src/perf/fibonacci_impl_tbb.cpp
index c33471a..50bab0b 100644
--- a/src/perf/fibonacci_impl_tbb.cpp
+++ b/src/perf/fibonacci_impl_tbb.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/perf/perf.cpp b/src/perf/perf.cpp
index 7b3fe8e..93c9746 100644
--- a/src/perf/perf.cpp
+++ b/src/perf/perf.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -283,7 +283,7 @@ namespace internal {
public:
Initializer () {
SYSTEM_INFO si;
- GetSystemInfo(&si);
+ GetNativeSystemInfo(&si);
ASSERT( si.dwNumberOfProcessors <= MaxAffinitySetSize, "Too many CPUs" );
AffinitySetSize = min (si.dwNumberOfProcessors, MaxAffinitySetSize);
cpu_set_t systemMask = 0;
@@ -353,10 +353,12 @@ namespace internal {
#endif /* __linux__ */
bool PinTheThread ( int cpu_idx, tbb::atomic<int>& nThreads ) {
+ #if _MSC_VER || __linux__
cpu_set_t orig_mask, target_mask;
CPU_ZERO( &target_mask );
CPU_SET( cpu_idx, &target_mask );
ASSERT ( CPU_ISSET(cpu_idx, &target_mask), "CPU_SET failed" );
+ #endif
#if _MSC_VER
orig_mask = SetThreadAffinityMask( GetCurrentThread(), target_mask );
if ( !orig_mask )
diff --git a/src/perf/perf.h b/src/perf/perf.h
index 0403fd5..c0d30ab 100644
--- a/src/perf/perf.h
+++ b/src/perf/perf.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/perf/perf_sched.cpp b/src/perf/perf_sched.cpp
index fa64ef4..a4a9172 100644
--- a/src/perf/perf_sched.cpp
+++ b/src/perf/perf_sched.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/perf/run_statistics.sh b/src/perf/run_statistics.sh
index 183efdd..60c2c03 100644
--- a/src/perf/run_statistics.sh
+++ b/src/perf/run_statistics.sh
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+# Copyright 2005-2013 Intel Corporation. All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
diff --git a/src/perf/statistics.cpp b/src/perf/statistics.cpp
index cf73533..9620ede 100644
--- a/src/perf/statistics.cpp
+++ b/src/perf/statistics.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/perf/statistics.h b/src/perf/statistics.h
index aec3e93..66f298e 100644
--- a/src/perf/statistics.h
+++ b/src/perf/statistics.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -47,7 +47,7 @@ typedef double value_t;
/*
Statistical collector class.
-
+
Resulting table output:
+---------------------------------------------------------------------------+
| [Date] <Title>... |
@@ -63,7 +63,7 @@ typedef double value_t;
+---------------------------------------------------------------------------+
| [Date] <TestName>, Threads: <N>, Mode: <M>; for <Title>... |
+----------+----v----+--v---+----------------+------------+-..-+------------+
-
+
*/
class StatisticsCollector
@@ -85,11 +85,11 @@ protected:
};
// internal members
- //bool OpenFile;
+ //bool OpenFile;
StatisticResults *CurrentKey;
string Title;
const char /**Name,*/ *ResultsFmt;
- string Name;
+ string Name;
//! Data
typedef map<string, StatisticResults*> Statistics_t;
Statistics_t Statistics;
@@ -181,7 +181,7 @@ private:
};
//! using: Func(const char *fmt, ...) { vargf2buff(buff, 128, fmt);...
-#define vargf2buff(name, size, fmt) \
+#define vargf2buff(name, size, fmt) \
char name[size]; memset(name, 0, size); \
va_list args; va_start(args, fmt); \
vsnprintf(name, size-1, fmt, args); \
diff --git a/src/perf/statistics_xml.h b/src/perf/statistics_xml.h
index c3aed3c..db5b42f 100644
--- a/src/perf/statistics_xml.h
+++ b/src/perf/statistics_xml.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/perf/fibonacci_cutoff.cpp b/src/perf/time_fibonacci_cutoff.cpp
similarity index 88%
rename from src/perf/fibonacci_cutoff.cpp
rename to src/perf/time_fibonacci_cutoff.cpp
index 0da712f..9d12eac 100644
--- a/src/perf/fibonacci_cutoff.cpp
+++ b/src/perf/time_fibonacci_cutoff.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -32,6 +32,7 @@
#include "tbb/task_scheduler_init.h"
#include "tbb/task.h"
#include "tbb/tick_count.h"
+#include "fibonacci_impl_tbb.cpp"
long CutOff = 1;
@@ -40,11 +41,12 @@ long SerialFib( const long n );
long ParallelFib( const long n );
inline void dump_title() {
- printf("Serial/Parallel, P, N, cutoff, repetitions, time, fib, speedup\n");
+ printf(" Mode, P, repeat, N, =fib value, cutoff, time, speedup\n");
}
inline void output(int P, long n, long c, int T, double serial_elapsed, double elapsed, long result) {
- printf("%s, %d, %ld, %ld, %d, %g, %ld, %g\n", ( (P == 0) ? "Serial" : "Parallel" ), P, n, c, T, elapsed, result, serial_elapsed / elapsed);
+ printf("%s,%4d,%7d,%3ld,%11ld,%7ld,%9.3g,%8.3g\n", ( (P == 0) ? " Serial" : "Parallel" ),
+ P, T, n, result, c, elapsed, serial_elapsed / elapsed);
}
#define MOVE_BY_FOURTHS 1
@@ -106,16 +108,19 @@ void find_cutoff(const int P, const long n, const int T, const double serial_ela
int main(int argc, char *argv[]) {
if (argc < 4) {
- printf("Usage: %s threads n repetitions\n",argv[0]);
+ printf("Usage: %s threads n repetitions\nWhere n make sense in range [25; 45]\n",argv[0]);
return 1;
}
- dump_title();
-
int P = atoi(argv[1]);
- long n = atol(argv[2]);
+ volatile long n = atol(argv[2]);
int T = atoi(argv[3]);
+ // warmup parallel engine
+ ParallelFib(n);
+
+ dump_title();
+
// collect serial time
long serial_result = 0;
tbb::tick_count t0;
@@ -131,4 +136,3 @@ int main(int argc, char *argv[]) {
return 0;
}
-
diff --git a/src/perf/time_framework.h b/src/perf/time_framework.h
index ffcde42..3fe73db 100644
--- a/src/perf/time_framework.h
+++ b/src/perf/time_framework.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/perf/time_hash_map.cpp b/src/perf/time_hash_map.cpp
index a3ee3c5..04312a1 100644
--- a/src/perf/time_hash_map.cpp
+++ b/src/perf/time_hash_map.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -37,11 +37,11 @@
#define OLDTABLEHEADER "tbb/concurrent_hash_map-5468.h"//-4329
//! enable/disable experimental implementation tests (correct include file also)
-#define TESTTABLE 1
+#define TESTTABLE 0
#define TESTTABLEHEADER "tbb/concurrent_unordered_map.h"
//! avoid erase()
-#define TEST_ERASE 0
+#define TEST_ERASE 1
//////////////////////////////////////////////////////////////////////////////////
@@ -60,7 +60,9 @@
#include "tbb/spin_rw_mutex.h"
#include "tbb/aligned_space.h"
#include "tbb/atomic.h"
+#define __TBB_concurrent_unordered_set_H
#include "tbb/internal/_concurrent_unordered_impl.h"
+#undef __TBB_concurrent_unordered_set_H
// for test
#include "tbb/spin_mutex.h"
#include "time_framework.h"
@@ -224,7 +226,7 @@ public:
class test_hash_map : public TestProcessor {
public:
- test_hash_map() : TestProcessor("test_hash_map") {}
+ test_hash_map() : TestProcessor("time_hash_map") {}
void factory(int value, int threads) {
if(Verbose) printf("Processing with %d threads: %d...\n", threads, value);
process( value, threads,
@@ -265,4 +267,3 @@ int main(int argc, char* argv[]) {
}
return 0;
}
-
diff --git a/src/perf/time_hash_map_fill.cpp b/src/perf/time_hash_map_fill.cpp
index 0c27b24..508d01c 100644
--- a/src/perf/time_hash_map_fill.cpp
+++ b/src/perf/time_hash_map_fill.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -69,7 +69,9 @@ int MAX_TABLE_SIZE = 2000000;
#include "tbb/spin_rw_mutex.h"
#include "tbb/aligned_space.h"
#include "tbb/atomic.h"
+#define __TBB_concurrent_unordered_set_H
#include "tbb/internal/_concurrent_unordered_impl.h"
+#undef __TBB_concurrent_unordered_set_H
// for test
#include "tbb/spin_mutex.h"
#include "time_framework.h"
@@ -93,7 +95,7 @@ struct Uniques : TesterBase {
//Table->max_load_factor(1); // add stub into hash_map to uncomment it
}
~Uniques() {}
-
+
// Returns name of test mode specified by number
/*override*/ std::string get_name(int testn) {
if(testn == 1) return "find";
@@ -130,6 +132,7 @@ struct Uniques : TesterBase {
};
/////////////////////////////////////////////////////////////////////////////////////////
+#undef max
#include <limits>
// Using BOX declarations from configuration
diff --git a/src/perf/time_hash_map_fill.html b/src/perf/time_hash_map_fill.html
index 5d62c3a..c43bb43 100644
--- a/src/perf/time_hash_map_fill.html
+++ b/src/perf/time_hash_map_fill.html
@@ -110,7 +110,7 @@ In addition, a size of the source array correlates with input rates in order to
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/src/perf/time_locked_work.cpp b/src/perf/time_locked_work.cpp
index 30255f5..9975e82 100644
--- a/src/perf/time_locked_work.cpp
+++ b/src/perf/time_locked_work.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/perf/time_lru_cache_throughput.cpp b/src/perf/time_lru_cache_throughput.cpp
index 63e04f2..96b852f 100644
--- a/src/perf/time_lru_cache_throughput.cpp
+++ b/src/perf/time_lru_cache_throughput.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/perf/time_sandbox.h b/src/perf/time_sandbox.h
index 76cf975..3760f7e 100644
--- a/src/perf/time_sandbox.h
+++ b/src/perf/time_sandbox.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -34,7 +34,7 @@
#define INJECT_TBB5 namespace tbb { namespace interface5 { using namespace ::tbb::interface5; namespace internal { using namespace ::tbb::interface5::internal; } } }
#ifndef INJECT_BOX_NAMES
-#if defined(__TBB_task_H) || defined(__TBB_concurrent_unordered_internal_H) || defined(__TBB_reader_writer_lock_H)
+#if defined(__TBB_task_H) || defined(__TBB_concurrent_unordered_internal_H) || defined(__TBB_reader_writer_lock_H) || defined(__TBB__concurrent_unordered_impl_H)
#define INJECT_BOX_NAMES INJECT_TBB INJECT_TBB5
#else
#define INJECT_BOX_NAMES INJECT_TBB
diff --git a/src/perf/time_vector.cpp b/src/perf/time_vector.cpp
index 951c0c0..b6445bb 100644
--- a/src/perf/time_vector.cpp
+++ b/src/perf/time_vector.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/client/index.html b/src/rml/client/index.html
index c013c8f..7fb8c26 100644
--- a/src/rml/client/index.html
+++ b/src/rml/client/index.html
@@ -31,7 +31,7 @@ This directory has source code that must be statically linked into an RML client
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/src/rml/client/library_assert.h b/src/rml/client/library_assert.h
index 9b8cd50..92b5aeb 100644
--- a/src/rml/client/library_assert.h
+++ b/src/rml/client/library_assert.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -34,7 +34,8 @@
#define LIBRARY_ASSERT(x,y) KMP_ASSERT2((x),(y))
#else
#include <assert.h>
-#define LIBRARY_ASSERT(x,y) assert(x)
+#define LIBRARY_ASSERT(x,y) assert(x)
+#define __TBB_DYNAMIC_LOAD_ENABLED 1
#endif
#endif /* LIBRARY_ASSERT */
diff --git a/src/rml/client/omp_dynamic_link.cpp b/src/rml/client/omp_dynamic_link.cpp
index d38b230..2ce9063 100644
--- a/src/rml/client/omp_dynamic_link.cpp
+++ b/src/rml/client/omp_dynamic_link.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/client/omp_dynamic_link.h b/src/rml/client/omp_dynamic_link.h
index d3cfd61..a670eb6 100644
--- a/src/rml/client/omp_dynamic_link.h
+++ b/src/rml/client/omp_dynamic_link.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -32,6 +32,7 @@
#define OPEN_INTERNAL_NAMESPACE namespace __kmp {
#define CLOSE_INTERNAL_NAMESPACE }
+#include "library_assert.h"
#include "tbb/dynamic_link.h" // Refers to src/tbb, not include/tbb
#endif /* __KMP_omp_dynamic_link_H */
diff --git a/src/rml/client/rml_factory.h b/src/rml/client/rml_factory.h
index 3af8447..1447bd3 100644
--- a/src/rml/client/rml_factory.h
+++ b/src/rml/client/rml_factory.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -47,22 +47,16 @@
#error Unknown OS
#endif
-#include "library_assert.h"
-
const ::rml::versioned_object::version_type CLIENT_VERSION = 2;
-#if __TBB_WEAK_SYMBOLS
+#if __TBB_WEAK_SYMBOLS_PRESENT
#pragma weak __RML_open_factory
- #pragma weak __TBB_make_rml_server
#pragma weak __RML_close_factory
- #pragma weak __TBB_call_with_my_server_info
extern "C" {
::rml::factory::status_type __RML_open_factory ( ::rml::factory&, ::rml::versioned_object::version_type&, ::rml::versioned_object::version_type );
- ::rml::factory::status_type __TBB_make_rml_server( tbb::internal::rml::tbb_factory& f, tbb::internal::rml::tbb_server*& server, tbb::internal::rml::tbb_client& client );
- void __TBB_call_with_my_server_info( ::rml::server_info_callback_t cb, void* arg );
void __RML_close_factory( ::rml::factory& f );
}
-#endif /* __TBB_WEAK_SYMBOLS */
+#endif /* __TBB_WEAK_SYMBOLS_PRESENT */
::rml::factory::status_type FACTORY::open() {
// Failure of following assertion indicates that factory is already open, or not zero-inited.
@@ -75,10 +69,10 @@ const ::rml::versioned_object::version_type CLIENT_VERSION = 2;
GET_INFO(my_call_with_server_info_routine),
};
status_type result;
- if( dynamic_link( RML_SERVER_NAME, server_link_table, 4, 4, &library_handle ) ) {
+ if( dynamic_link( RML_SERVER_NAME, server_link_table, 4, &library_handle ) ) {
version_type server_version;
result = (*open_factory_routine)( *this, server_version, CLIENT_VERSION );
- // server_version can be checked here for incompatibility here if necessary.
+ // server_version can be checked here for incompatibility if necessary.
} else {
library_handle = NULL;
result = st_not_found;
diff --git a/src/rml/client/rml_omp.cpp b/src/rml/client/rml_omp.cpp
index 7f961d4..8975791 100644
--- a/src/rml/client/rml_omp.cpp
+++ b/src/rml/client/rml_omp.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -38,6 +38,16 @@ namespace rml {
#define SERVER omp_server
#define CLIENT omp_client
#define FACTORY omp_factory
+
+#if __TBB_WEAK_SYMBOLS_PRESENT
+ #pragma weak __KMP_make_rml_server
+ #pragma weak __KMP_call_with_my_server_info
+ extern "C" {
+ omp_factory::status_type __KMP_make_rml_server( omp_factory& f, omp_server*& server, omp_client& client );
+ void __KMP_call_with_my_server_info( ::rml::server_info_callback_t cb, void* arg );
+ }
+#endif /* __TBB_WEAK_SYMBOLS_PRESENT */
+
#include "rml_factory.h"
} // rml
diff --git a/src/rml/client/rml_tbb.cpp b/src/rml/client/rml_tbb.cpp
index b2d8a4d..d2aa1cf 100644
--- a/src/rml/client/rml_tbb.cpp
+++ b/src/rml/client/rml_tbb.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -39,6 +39,16 @@ namespace rml {
#define SERVER tbb_server
#define CLIENT tbb_client
#define FACTORY tbb_factory
+
+#if __TBB_WEAK_SYMBOLS_PRESENT
+ #pragma weak __TBB_make_rml_server
+ #pragma weak __TBB_call_with_my_server_info
+ extern "C" {
+ ::rml::factory::status_type __TBB_make_rml_server( tbb::internal::rml::tbb_factory& f, tbb::internal::rml::tbb_server*& server, tbb::internal::rml::tbb_client& client );
+ void __TBB_call_with_my_server_info( ::rml::server_info_callback_t cb, void* arg );
+ }
+#endif /* __TBB_WEAK_SYMBOLS_PRESENT */
+
#include "rml_factory.h"
} // rml
diff --git a/src/rml/include/index.html b/src/rml/include/index.html
index b377757..e6e0016 100644
--- a/src/rml/include/index.html
+++ b/src/rml/include/index.html
@@ -18,7 +18,7 @@ This directory has the include files for the Resource Management Layer (RML).
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/src/rml/include/rml_base.h b/src/rml/include/rml_base.h
index 6f32b7d..9db72c9 100644
--- a/src/rml/include/rml_base.h
+++ b/src/rml/include/rml_base.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/include/rml_omp.h b/src/rml/include/rml_omp.h
index ad17a0d..1524802 100644
--- a/src/rml/include/rml_omp.h
+++ b/src/rml/include/rml_omp.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/include/rml_tbb.h b/src/rml/include/rml_tbb.h
index af8fafd..e4bcc91 100644
--- a/src/rml/include/rml_tbb.h
+++ b/src/rml/include/rml_tbb.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -31,6 +31,7 @@
#ifndef __TBB_rml_tbb_H
#define __TBB_rml_tbb_H
+#include "tbb/tbb_config.h"
#include "rml_base.h"
namespace tbb {
diff --git a/src/rml/index.html b/src/rml/index.html
index 8527d21..52e4a7e 100644
--- a/src/rml/index.html
+++ b/src/rml/index.html
@@ -20,7 +20,7 @@ The subdirectories pertain to the Resource Management Layer (RML).
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/src/rml/perfor/omp_nested.cpp b/src/rml/perfor/omp_nested.cpp
index 0844cb4..ff8e892 100644
--- a/src/rml/perfor/omp_nested.cpp
+++ b/src/rml/perfor/omp_nested.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/perfor/omp_simple.cpp b/src/rml/perfor/omp_simple.cpp
index 14215b6..d6948ce 100644
--- a/src/rml/perfor/omp_simple.cpp
+++ b/src/rml/perfor/omp_simple.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/perfor/tbb_multi_omp.cpp b/src/rml/perfor/tbb_multi_omp.cpp
index 97a6404..1fd3b57 100644
--- a/src/rml/perfor/tbb_multi_omp.cpp
+++ b/src/rml/perfor/tbb_multi_omp.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/perfor/tbb_simple.cpp b/src/rml/perfor/tbb_simple.cpp
index e63831f..1457fff 100644
--- a/src/rml/perfor/tbb_simple.cpp
+++ b/src/rml/perfor/tbb_simple.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/perfor/thread_level.h b/src/rml/perfor/thread_level.h
index 9c323da..9fc3cc7 100644
--- a/src/rml/perfor/thread_level.h
+++ b/src/rml/perfor/thread_level.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/server/index.html b/src/rml/server/index.html
index 4107716..045fd61 100644
--- a/src/rml/server/index.html
+++ b/src/rml/server/index.html
@@ -7,7 +7,7 @@ This directory has source code internal to the server.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/src/rml/server/irml.rc b/src/rml/server/irml.rc
index 1ed76ba..6b1974a 100644
--- a/src/rml/server/irml.rc
+++ b/src/rml/server/irml.rc
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
@@ -90,7 +90,7 @@ BEGIN
VALUE "FileDescription", "Threading Building Blocks resource manager library\0"
VALUE "FileVersion", TBB_VERSION "\0"
//what is it? VALUE "InternalName", "irml\0"
- VALUE "LegalCopyright", "Copyright 2005-2012 Intel Corporation. All Rights Reserved.\0"
+ VALUE "LegalCopyright", "Copyright 2005-2013 Intel Corporation. All Rights Reserved.\0"
VALUE "LegalTrademarks", "\0"
#ifndef TBB_USE_DEBUG
VALUE "OriginalFilename", "irml.dll\0"
diff --git a/src/rml/server/job_automaton.h b/src/rml/server/job_automaton.h
index 8720cbe..7d6dd96 100644
--- a/src/rml/server/job_automaton.h
+++ b/src/rml/server/job_automaton.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/server/lin-rml-export.def b/src/rml/server/lin-rml-export.def
index 780c18c..290bd3d 100644
--- a/src/rml/server/lin-rml-export.def
+++ b/src/rml/server/lin-rml-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/server/rml_server.cpp b/src/rml/server/rml_server.cpp
index 7a0fd63..b8dc62c 100644
--- a/src/rml/server/rml_server.cpp
+++ b/src/rml/server/rml_server.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -833,7 +833,7 @@ void thread_map::unbind() {
void thread_map::assist_cleanup( bool assist_null_only ) {
// To avoid deadlock, the current thread *must* help out with cleanups that have not started,
- // becausd the thread that created the job may be busy for a long time.
+ // because the thread that created the job may be busy for a long time.
for( iterator i = begin(); i!=end(); ++i ) {
rml::job* j=0;
job_automaton& ja = i->my_automaton;
diff --git a/src/rml/server/thread_monitor.h b/src/rml/server/thread_monitor.h
index 6e18885..6bc0a6f 100644
--- a/src/rml/server/thread_monitor.h
+++ b/src/rml/server/thread_monitor.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -27,7 +27,7 @@
*/
// All platform-specific threading support is encapsulated here. */
-
+
#ifndef __RML_thread_monitor_H
#define __RML_thread_monitor_H
@@ -35,14 +35,17 @@
#include <windows.h>
#include <process.h>
#include <malloc.h> //_alloca
-#include "tbb/tbb_misc.h" // NumberOfProcessorGroups, MoveThreadIntoProcessorGroup, FindProcessorGroupIndex
+#include "tbb/tbb_misc.h" // support for processor groups
+#if __TBB_WIN8UI_SUPPORT
+#include <thread>
+#endif
#elif USE_PTHREAD
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#else
#error Unsupported platform
-#endif
+#endif
#include <stdio.h>
#include "tbb/itt_notify.h"
#include "tbb/atomic.h"
@@ -63,7 +66,7 @@
__TBB_ASSERT_EX(sink_for_alloca, "_alloca failed");
#else
// Linux thread allocators avoid 64K aliasing.
-#define AVOID_64K_ALIASING(idx)
+#define AVOID_64K_ALIASING(idx) tbb::internal::suppress_unused_warning(idx)
#endif /* _WIN32||_WIN64 */
namespace rml {
@@ -75,7 +78,7 @@ static const ::tbb::tchar *SyncType_RML = _T("%Constant");
static const ::tbb::tchar *SyncObj_ThreadMonitor = _T("RML Thr Monitor");
#endif /* DO_ITT_NOTIFY */
-//! Monitor with limited two-phase commit form of wait.
+//! Monitor with limited two-phase commit form of wait.
/** At most one thread should wait on an instance at a time. */
class thread_monitor {
public:
@@ -83,10 +86,10 @@ public:
friend class thread_monitor;
tbb::atomic<size_t> my_epoch;
};
- thread_monitor() : spurious(false) {
- my_cookie.my_epoch = 0;
+ thread_monitor() : spurious(false) {
+ my_cookie.my_epoch = 0;
ITT_SYNC_CREATE(&my_sema, SyncType_RML, SyncObj_ThreadMonitor);
- in_wait = false;
+ in_wait = false;
}
~thread_monitor() {}
@@ -95,7 +98,7 @@ public:
void notify();
//! Begin two-phase wait.
- /** Should only be called by thread that owns the monitor.
+ /** Should only be called by thread that owns the monitor.
The caller must either complete the wait or cancel it. */
void prepare_wait( cookie& c );
@@ -106,22 +109,33 @@ public:
void cancel_wait();
#if USE_WINTHREAD
+ typedef HANDLE handle_type;
+
#define __RML_DECL_THREAD_ROUTINE unsigned WINAPI
typedef unsigned (WINAPI *thread_routine_type)(void*);
//! Launch a thread
- static void launch( thread_routine_type thread_routine, void* arg, size_t stack_size, const size_t* worker_index = NULL );
+ static handle_type launch( thread_routine_type thread_routine, void* arg, size_t stack_size, const size_t* worker_index = NULL );
#elif USE_PTHREAD
+ typedef pthread_t handle_type;
+
#define __RML_DECL_THREAD_ROUTINE void*
typedef void*(*thread_routine_type)(void*);
//! Launch a thread
- static void launch( thread_routine_type thread_routine, void* arg, size_t stack_size );
+ static handle_type launch( thread_routine_type thread_routine, void* arg, size_t stack_size );
#endif /* USE_PTHREAD */
+ //! Yield control to OS
+ /** Affects the calling thread. **/
static void yield();
+ //! Join thread
+ static void join(handle_type handle);
+
+ //! Detach thread
+ static void detach_thread(handle_type handle);
private:
cookie my_cookie;
tbb::atomic<bool> in_wait;
@@ -138,29 +152,64 @@ private:
#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000
#endif
-inline void thread_monitor::launch( thread_routine_type thread_routine, void* arg, size_t stack_size, const size_t* worker_index ) {
+#if __TBB_WIN8UI_SUPPORT
+inline thread_monitor::handle_type thread_monitor::launch( thread_routine_type thread_function, void* arg, size_t, const size_t*) {
+//TODO: check that exception thrown from std::thread is not swallowed silently
+ std::thread* thread_tmp=new std::thread(thread_function, arg);
+ return thread_tmp->native_handle();
+}
+#else //__TBB_WIN8UI_SUPPORT
+inline thread_monitor::handle_type thread_monitor::launch( thread_routine_type thread_routine, void* arg, size_t stack_size, const size_t* worker_index ) {
unsigned thread_id;
int number_of_processor_groups = ( worker_index ) ? tbb::internal::NumberOfProcessorGroups() : 0;
unsigned create_flags = ( number_of_processor_groups > 1 ) ? CREATE_SUSPENDED : 0;
- uintptr_t status = _beginthreadex( NULL, unsigned(stack_size), thread_routine, arg, STACK_SIZE_PARAM_IS_A_RESERVATION | create_flags, &thread_id );
- if( status==0 ) {
+ HANDLE h = (HANDLE)_beginthreadex( NULL, unsigned(stack_size), thread_routine, arg, STACK_SIZE_PARAM_IS_A_RESERVATION | create_flags, &thread_id );
+ if( !h ) {
fprintf(stderr,"thread_monitor::launch: _beginthreadex failed\n");
- exit(1);
+ exit(1);
}
if ( number_of_processor_groups > 1 ) {
- tbb::internal::MoveThreadIntoProcessorGroup( (HANDLE)status,
+ tbb::internal::MoveThreadIntoProcessorGroup( h,
tbb::internal::FindProcessorGroupIndex( static_cast<int>(*worker_index) ) );
- ResumeThread( (HANDLE)status );
+ ResumeThread( h );
}
- CloseHandle( (HANDLE)status );
+ return h;
+}
+#endif //__TBB_WIN8UI_SUPPORT
+
+void thread_monitor::join(handle_type handle) {
+#if TBB_USE_ASSERT
+ DWORD res =
+#endif
+ WaitForSingleObjectEx(handle, INFINITE, FALSE);
+ __TBB_ASSERT( res==WAIT_OBJECT_0, NULL );
+#if TBB_USE_ASSERT
+ BOOL val =
+#endif
+ CloseHandle(handle);
+ __TBB_ASSERT( val, NULL );
+}
+
+void thread_monitor::detach_thread(handle_type handle) {
+#if TBB_USE_ASSERT
+ BOOL val =
+#endif
+ CloseHandle(handle);
+ __TBB_ASSERT( val, NULL );
}
inline void thread_monitor::yield() {
+// TODO: consider unification via __TBB_Yield or tbb::this_tbb_thread::yield
+#if !__TBB_WIN8UI_SUPPORT
SwitchToThread();
+#else
+ std::this_thread::yield();
+#endif
}
#endif /* USE_WINTHREAD */
#if USE_PTHREAD
+// TODO: can we throw exceptions instead of termination?
inline void thread_monitor::check( int error_code, const char* routine ) {
if( error_code ) {
fprintf(stderr,"thread_monitor %s in %s\n", strerror(error_code), routine );
@@ -168,17 +217,25 @@ inline void thread_monitor::check( int error_code, const char* routine ) {
}
}
-inline void thread_monitor::launch( void* (*thread_routine)(void*), void* arg, size_t stack_size ) {
+inline thread_monitor::handle_type thread_monitor::launch( void* (*thread_routine)(void*), void* arg, size_t stack_size ) {
// FIXME - consider more graceful recovery than just exiting if a thread cannot be launched.
- // Note that there are some tricky situations to deal with, such that the thread is already
- // grabbed as part of an OpenMP team.
+ // Note that there are some tricky situations to deal with, such that the thread is already
+ // grabbed as part of an OpenMP team.
pthread_attr_t s;
check(pthread_attr_init( &s ), "pthread_attr_init");
if( stack_size>0 )
check(pthread_attr_setstacksize( &s, stack_size ), "pthread_attr_setstack_size" );
pthread_t handle;
check( pthread_create( &handle, &s, thread_routine, arg ), "pthread_create" );
- check( pthread_detach( handle ), "pthread_detach" );
+ return handle;
+}
+
+void thread_monitor::join(handle_type handle) {
+ check(pthread_join(handle, NULL), "pthread_join");
+}
+
+void thread_monitor::detach_thread(handle_type handle) {
+ check(pthread_detach(handle), "pthread_detach");
}
inline void thread_monitor::yield() {
diff --git a/src/rml/server/wait_counter.h b/src/rml/server/wait_counter.h
index 0f01b1f..034302d 100644
--- a/src/rml/server/wait_counter.h
+++ b/src/rml/server/wait_counter.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/server/win32-rml-export.def b/src/rml/server/win32-rml-export.def
index 10cdc9a..4102813 100644
--- a/src/rml/server/win32-rml-export.def
+++ b/src/rml/server/win32-rml-export.def
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
diff --git a/src/rml/server/win64-rml-export.def b/src/rml/server/win64-rml-export.def
index 10cdc9a..4102813 100644
--- a/src/rml/server/win64-rml-export.def
+++ b/src/rml/server/win64-rml-export.def
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
diff --git a/src/rml/test/rml_omp_stub.cpp b/src/rml/test/rml_omp_stub.cpp
index 59aab9a..1cf6f9d 100644
--- a/src/rml/test/rml_omp_stub.cpp
+++ b/src/rml/test/rml_omp_stub.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -36,9 +36,16 @@
// VS2008/VC9 seems to have an issue;
#pragma warning( push )
#pragma warning( disable: 4100 )
-#endif
+#elif _MSC_VER==1700 && !defined(__INTEL_COMPILER)
+// VS2012 issues "warning C4702: unreachable code" for the code which really
+// shouldn't be reached according to the test logic: rml::client has the
+// implementation for the "pure" virtual methods to be aborted if they are
+// called.
+#pragma warning( push )
+#pragma warning( disable: 4702 )
+#endif
#include "rml_omp.h"
-#if _MSC_VER==1500 && !defined(__INTEL_COMPILER)
+#if ( _MSC_VER==1500 || _MSC_VER==1700 ) && !defined(__INTEL_COMPILER)
#pragma warning( pop )
#endif
diff --git a/src/rml/test/test_job_automaton.cpp b/src/rml/test/test_job_automaton.cpp
index 5c76c99..884fa30 100644
--- a/src/rml/test/test_job_automaton.cpp
+++ b/src/rml/test/test_job_automaton.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,9 +26,14 @@
the GNU General Public License.
*/
+#include "harness.h"
+#if __TBB_MIC_OFFLOAD
+int TestMain () {
+ return Harness::Skipped;
+}
+#else
#include "job_automaton.h"
#define HARNESS_NO_PARSE_COMMAND_LINE 1
-#include "harness.h"
#include "harness_barrier.h"
class State {
@@ -151,3 +156,5 @@ int TestMain () {
CheckCoverage(true);
return Harness::Done;
}
+
+#endif /* __TBB_MIC_OFFLOAD */
diff --git a/src/rml/test/test_rml_mixed.cpp b/src/rml/test/test_rml_mixed.cpp
index fd46d3e..c231eed 100644
--- a/src/rml/test/test_rml_mixed.cpp
+++ b/src/rml/test/test_rml_mixed.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,13 @@
the GNU General Public License.
*/
+#include <tbb/tbb_config.h>
+#if __TBB_WIN8UI_SUPPORT || __TBB_MIC_OFFLOAD
+#include "harness.h"
+int TestMain () {
+ return Harness::Skipped;
+}
+#else
#include "rml_tbb.h"
#include "rml_omp.h"
#include "tbb/atomic.h"
@@ -34,8 +41,15 @@
#define HARNESS_DEFAULT_MIN_THREADS 4
#include "harness.h"
+// dynamic_link initializes its data structures in a static constructor. But
+// the initialization order of static constructors in different modules is
+// non-deterministic. Thus dynamic_link fails on some systems when when the
+// applicaton changes its current directory after the library (TBB/OpenMP/...)
+// is loaded but before the static constructors in the library are executed.
+#define CHDIR_SUPPORT_BROKEN ( __GNUC__ == 4 && __GNUC_MINOR__ >=6 && __GNUC_MINOR__ <=7 )
+
const int OMP_ParallelRegionSize = 16;
-int TBB_MaxThread = 4; // Includes master
+int TBB_MaxThread = 4; // Includes master
int OMP_MaxThread = int(~0u>>1); // Includes master
template<typename Client>
@@ -62,6 +76,9 @@ private:
delete this;
}
/*override*/void cleanup( job& j ) {delete &j;}
+
+public:
+ virtual ~ClientBase() {}
};
#if _WIN32
@@ -83,6 +100,7 @@ private:
#define _chdir chdir
#endif
+#if !CHDIR_SUPPORT_BROKEN
class ChangeCurrentDir {
char dir[PATH_LEN+1];
char *last_slash;
@@ -109,6 +127,7 @@ public:
}
}
};
+#endif
//! Represents a TBB or OpenMP run-time that uses RML.
template<typename Factory, typename Client>
@@ -193,9 +212,11 @@ class OMP_Client: public ClientBase<__kmp::rml::omp_client> {
}
};
+#if !CHDIR_SUPPORT_BROKEN
// A global instance of ChangeCurrentDir should be declared before TBB_RunTime and OMP_RunTime
// since we want to change current directory before opening factory
ChangeCurrentDir Changer;
+#endif
RunTime<tbb::internal::rml::tbb_factory, TBB_Client> TBB_RunTime;
RunTime<__kmp::rml::omp_factory, OMP_Client> OMP_RunTime;
@@ -300,3 +321,4 @@ int TestMain () {
TotalThreadLevel.dump();
return Harness::Done;
}
+#endif /* __TBB_WIN8UI_SUPPORT || __TBB_MIC_OFFLOAD */
diff --git a/src/rml/test/test_rml_omp.cpp b/src/rml/test/test_rml_omp.cpp
index 47364bc..4f37024 100644
--- a/src/rml/test/test_rml_omp.cpp
+++ b/src/rml/test/test_rml_omp.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,13 @@
the GNU General Public License.
*/
+#include <tbb/tbb_config.h>
+#if __TBB_WIN8UI_SUPPORT || __TBB_MIC_OFFLOAD
+#include "harness.h"
+int TestMain () {
+ return Harness::Skipped;
+}
+#else
#include "rml_omp.h"
typedef __kmp::rml::omp_server MyServer;
@@ -134,7 +141,7 @@ void FireUpJobs( MyServer& server, MyClient& client, int max_thread, int n_extra
server.independent_thread_number_changed( n_extra );
if( checker ) {
// Give RML time to respond to change in number of threads.
- MilliSleep(1);
+ Harness::Sleep(1);
}
int n_delivered = server.try_increase_load( n_thread, StrictTeam );
ASSERT( !StrictTeam || n_delivered==int(n_thread), "server failed to satisfy strict request" );
@@ -194,3 +201,4 @@ int TestMain () {
return Harness::Done;
}
+#endif /* __TBB_WIN8UI_SUPPORT || __TBB_MIC_OFFLOAD */
diff --git a/src/rml/test/test_rml_omp_c_linkage.c b/src/rml/test/test_rml_omp_c_linkage.c
index 285001c..88318cd 100644
--- a/src/rml/test/test_rml_omp_c_linkage.c
+++ b/src/rml/test/test_rml_omp_c_linkage.c
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/rml/test/test_rml_tbb.cpp b/src/rml/test/test_rml_tbb.cpp
index cebd85d..22c1ac3 100644
--- a/src/rml/test/test_rml_tbb.cpp
+++ b/src/rml/test/test_rml_tbb.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,13 @@
the GNU General Public License.
*/
+#include <tbb/tbb_config.h>
+#if __TBB_WIN8UI_SUPPORT || __TBB_MIC_OFFLOAD
+#include "harness.h"
+int TestMain () {
+ return Harness::Skipped;
+}
+#else
#include "rml_tbb.h"
typedef tbb::internal::rml::tbb_server MyServer;
@@ -46,7 +53,7 @@ class MyClient: public ClientBase<tbb::internal::rml::tbb_client> {
do_process(j);
//wait until the gate is open.
while( gate==0 )
- MilliSleep(1);
+ Harness::Sleep(1);
__TBB_ASSERT( nesting.limit<=2, NULL );
if( nesting.level>=nesting.limit )
@@ -63,7 +70,7 @@ class MyClient: public ClientBase<tbb::internal::rml::tbb_client> {
// at this point, ( nesting.level<nesting.limit ) && ( my_server->default_concurrency()-max_outstanding_connections>2 )
for( ;; ) {
while( n_available_hw_threads<=1 )
- MilliSleep(1);
+ Harness::Sleep(1);
int n = --n_available_hw_threads;
if( n>0 ) break;
@@ -96,7 +103,7 @@ void FireUpJobs( MyServer& server, MyClient& client, int n_thread, int n_extra,
// while for the RML worker threads to do some work.
if( checker ) {
// Give RML time to respond to change in number of threads.
- MilliSleep(1);
+ Harness::Sleep(1);
for( int k=0; k<n_thread; ++k )
client.job_array[k].processing_count = 0;
}
@@ -105,7 +112,7 @@ void FireUpJobs( MyServer& server, MyClient& client, int n_thread, int n_extra,
server.adjust_job_count_estimate( n_thread );
int n_used = 0;
if( checker ) {
- MilliSleep(100);
+ Harness::Sleep(100);
for( int k=0; k<n_thread; ++k )
if( client.job_array[k].processing_count )
++n_used;
@@ -140,7 +147,7 @@ void FireUpJobs( MyServer& server, MyClient& client, int n_thread, int n_extra,
if( client.job_array[k].processing_count!=0 )
++n;
if( n>=expected ) break;
- MilliSleep(1);
+ Harness::Sleep(1);
}
}
}
@@ -151,7 +158,7 @@ void FireUpJobs( MyServer& server, MyClient& client, int n_thread, int n_extra,
#endif
// Give RML some time to respond
if( checker ) {
- MilliSleep(1);
+ Harness::Sleep(1);
checker->check_number_of_threads_delivered( n_used, n_thread, n_extra );
}
}
@@ -195,7 +202,12 @@ void Initialize()
int TestMain () {
VerifyInitialization<MyFactory,MyClient>( MaxThread );
+ if ( default_concurrency<1 ) {
+ REPORT("The test is not intended to run on 1 thread\n");
+ return Harness::Skipped;
+ }
Initialize();
SimpleTest<MyFactory,MyClient>();
return Harness::Done;
}
+#endif /* __TBB_WIN8UI_SUPPORT || __TBB_MIC_OFFLOAD */
diff --git a/src/rml/test/test_server.h b/src/rml/test/test_server.h
index 40afc77..346eef0 100644
--- a/src/rml/test/test_server.h
+++ b/src/rml/test/test_server.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -67,19 +67,7 @@ static bool TestSingleConnection;
static size_t N_TestConnections;
-#if _WIN32||_WIN64
-#include <Windows.h> /* Need Sleep */
-#else
-#include <unistd.h> /* Need usleep */
-#endif
-
-void MilliSleep( unsigned milliseconds ) {
-#if _WIN32||_WIN64
- Sleep( milliseconds );
-#else
- usleep( milliseconds*1000 );
-#endif /* _WIN32||_WIN64 */
-}
+static int default_concurrency;
class MyJob: public ::rml::job {
public:
@@ -144,7 +132,7 @@ private:
public:
enum state_t {
//! Treat *this as constructed.
- live=0x1,
+ live=0x1234,
//! Treat *this as destroyed.
destroyed=0xDEAD
};
@@ -408,11 +396,11 @@ void SimpleTest() {
doc(0);
#endif
}
- ASSERT( Harness::ConcurrencyTracker::PeakParallelism()>1, "No multiple connections exercised?" );
+ ASSERT( Harness::ConcurrencyTracker::PeakParallelism()>1 || default_concurrency==0, "No multiple connections exercised?" );
#endif /* !TRIVIAL */
// Let RML catch up.
while( ClientConstructions!=ClientDestructions )
- MilliSleep(1);
+ Harness::Sleep(1);
}
static void check_server_info( void* arg, const char* server_info )
@@ -440,6 +428,7 @@ void VerifyInitialization( int n_thread ) {
client->client_id(), n_thread, 0, 0);
ASSERT( server, NULL );
client->set_server( server );
+ default_concurrency = server->default_concurrency();
DoClientSpecificVerification( *server, n_thread );
diff --git a/src/rml/test/test_thread_monitor.cpp b/src/rml/test/test_thread_monitor.cpp
index 5b0453c..42be091 100644
--- a/src/rml/test/test_thread_monitor.cpp
+++ b/src/rml/test/test_thread_monitor.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,8 +26,13 @@
the GNU General Public License.
*/
-#include "thread_monitor.h"
#include "harness.h"
+#if __TBB_MIC_OFFLOAD
+int TestMain () {
+ return Harness::Skipped;
+}
+#else
+#include "thread_monitor.h"
#include "harness_memory.h"
#include "tbb/semaphore.cpp"
@@ -117,3 +122,4 @@ int TestMain () {
return Harness::Done;
}
+#endif /* __TBB_MIC_OFFLOAD */
diff --git a/src/tbb/arena.cpp b/src/tbb/arena.cpp
index c516bcb..469c653 100644
--- a/src/tbb/arena.cpp
+++ b/src/tbb/arena.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,6 +30,7 @@
#include "governor.h"
#include "scheduler.h"
#include "itt_notify.h"
+#include "semaphore.h"
#if !__TBB_CPU_CTL_ENV_PRESENT
inline void __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* ctl ) { fegetenv(ctl); }
@@ -60,7 +61,7 @@ void arena::process( generic_scheduler& s ) {
// Find a vacant slot
for ( ;; ) {
- if ( !my_slots[index].my_scheduler && __TBB_CompareAndSwapW( &my_slots[index].my_scheduler, (intptr_t)&s, 0 ) == 0 )
+ if ( !my_slots[index].my_scheduler && as_atomic(my_slots[index].my_scheduler).compare_and_swap(&s, NULL ) == NULL )
break;
if ( ++index == my_num_slots )
index = 1;
@@ -72,17 +73,23 @@ void arena::process( generic_scheduler& s ) {
ITT_NOTIFY(sync_acquired, my_slots + index);
s.my_arena = this;
s.my_arena_index = index;
+ s.my_arena_slot = my_slots + index;
#if __TBB_TASK_PRIORITY
s.my_local_reload_epoch = my_reload_epoch;
__TBB_ASSERT( !s.my_offloaded_tasks, NULL );
#endif /* __TBB_TASK_PRIORITY */
s.attach_mailbox( affinity_id(index+1) );
- my_slots[index].hint_for_push = index ^ unsigned(&s-(generic_scheduler*)NULL)>>16; // randomizer seed
- my_slots[index].hint_for_pop = index; // initial value for round-robin
+ s.hint_for_push = index ^ s.my_random.get(); // randomizer seed
+ s.my_arena_slot->hint_for_pop = index; // initial value for round-robin
__TBB_set_cpu_ctl_env(&my_cpu_ctl_env);
+#if __TBB_SCHEDULER_OBSERVER
+ __TBB_ASSERT( !s.my_last_local_observer, "There cannot be notified local observers when entering arena" );
+ my_observers.notify_entry_observers( s.my_last_local_observer, /*worker=*/true );
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
atomic_update( my_limit, index + 1, std::less<unsigned>() );
for ( ;; ) {
@@ -98,14 +105,24 @@ void arena::process( generic_scheduler& s ) {
__TBB_ASSERT( !s.my_dispatching_task, NULL );
s.local_wait_for_all(*s.my_dummy_task,t);
}
- __TBB_ASSERT ( __TBB_load_relaxed(my_slots[index].head) == __TBB_load_relaxed(my_slots[index].tail), "Worker cannot leave arena while its task pool is not empty" );
- __TBB_ASSERT( my_slots[index].task_pool == EmptyTaskPool, "Empty task pool is not marked appropriately" );
- // Revalidate quitting condition
- // This check prevents relinquishing more than necessary workers because
+ __TBB_ASSERT ( __TBB_load_relaxed(s.my_arena_slot->head) == __TBB_load_relaxed(s.my_arena_slot->tail),
+ "Worker cannot leave arena while its task pool is not empty" );
+ __TBB_ASSERT( s.my_arena_slot->task_pool == EmptyTaskPool, "Empty task pool is not marked appropriately" );
+ // This check prevents relinquishing more than necessary workers because
// of the non-atomicity of the decision making procedure
- if ( num_workers_active() >= my_num_workers_allotted || !my_num_workers_requested )
- break;
+ unsigned allotted = my_num_workers_allotted;
+ if (((num_workers_active() > allotted)
+#if __TBB_SCHEDULER_OBSERVER && __TBB_TASK_ARENA
+ && allotted > 0) || (allotted == 0 && my_observers.ask_permission_to_leave()
+ // TODO: my_num_workers_allotted > 0 makes bug 1967 even worse, rework with accounting of demand by other arenas
+ // TODO: add monitoring of my_pool_state when not allowed to leave
+#endif /* __TBB_SCHEDULER_OBSERVER && __TBB_TASK_ARENA */
+ )) break;
}
+#if __TBB_SCHEDULER_OBSERVER
+ my_observers.notify_exit_observers( s.my_last_local_observer, /*worker=*/true );
+ s.my_last_local_observer = NULL;
+#endif /* __TBB_SCHEDULER_OBSERVER */
#if __TBB_TASK_PRIORITY
if ( s.my_offloaded_tasks ) {
GATHER_STATISTIC( ++s.my_counters.prio_orphanings );
@@ -115,7 +132,7 @@ void arena::process( generic_scheduler& s ) {
do {
orphans = const_cast<task*>(my_orphaned_tasks);
*s.my_offloaded_task_list_tail_link = orphans;
- } while ( __TBB_CompareAndSwapW(&my_orphaned_tasks, (ptrdiff_t)s.my_offloaded_tasks, (ptrdiff_t)orphans) != (ptrdiff_t)orphans );
+ } while ( as_atomic(my_orphaned_tasks).compare_and_swap(s.my_offloaded_tasks, orphans) != orphans );
s.my_offloaded_tasks = NULL;
#if TBB_USE_ASSERT
s.my_offloaded_task_list_tail_link = NULL;
@@ -128,6 +145,7 @@ void arena::process( generic_scheduler& s ) {
s.my_counters.reset();
#endif /* __TBB_STATISTICS */
__TBB_store_with_release( my_slots[index].my_scheduler, (generic_scheduler*)NULL );
+ s.my_arena_slot = 0; // detached from slot
s.my_inbox.detach();
__TBB_ASSERT( s.my_inbox.is_idle_state(true), NULL );
__TBB_ASSERT( !s.my_innermost_running_task, NULL );
@@ -138,7 +156,7 @@ quit:
// that arena may be temporarily left unpopulated by threads. See comments in
// arena::on_thread_leaving() for more details.
#if !__TBB_TRACK_PRIORITY_LEVEL_SATURATION
- on_thread_leaving();
+ on_thread_leaving</*is_master*/false>();
#endif /* !__TBB_TRACK_PRIORITY_LEVEL_SATURATION */
}
@@ -154,21 +172,27 @@ arena::arena ( market& m, unsigned max_num_workers ) {
// Two slots are mandatory: for the master, and for 1 worker (required to support starvation resistant tasks).
my_num_slots = num_slots_to_reserve(max_num_workers);
my_max_num_workers = max_num_workers;
- my_num_threads_active = 1; // accounts for the master
+ my_references = 1; // accounts for the master
__TBB_get_cpu_ctl_env(&my_cpu_ctl_env);
#if __TBB_TASK_PRIORITY
my_bottom_priority = my_top_priority = normalized_normal_priority;
#endif /* __TBB_TASK_PRIORITY */
my_aba_epoch = m.my_arenas_aba_epoch;
+#if __TBB_SCHEDULER_OBSERVER
+ my_observers.my_arena = this;
+#endif /* __TBB_SCHEDULER_OBSERVER */
__TBB_ASSERT ( my_max_num_workers < my_num_slots, NULL );
- // Construct mailboxes. Mark internal synchronization elements for the tools.
+ // Construct slots. Mark internal synchronization elements for the tools.
for( unsigned i = 0; i < my_num_slots; ++i ) {
__TBB_ASSERT( !my_slots[i].my_scheduler && !my_slots[i].task_pool, NULL );
+ __TBB_ASSERT( !my_slots[i].task_pool_ptr, NULL );
+ __TBB_ASSERT( !my_slots[i].my_task_pool_size, NULL );
ITT_SYNC_CREATE(my_slots + i, SyncType_Scheduler, SyncObj_WorkerTaskPool);
mailbox(i+1).construct();
ITT_SYNC_CREATE(&mailbox(i+1), SyncType_Scheduler, SyncObj_Mailbox);
+ my_slots[i].hint_for_pop = i;
#if __TBB_STATISTICS
- my_slots[i].my_counters = new ( NFS_Allocate(sizeof(statistics_counters), 1, NULL) ) statistics_counters;
+ my_slots[i].my_counters = new ( NFS_Allocate(1, sizeof(statistics_counters), NULL) ) statistics_counters;
#endif /* __TBB_STATISTICS */
}
#if __TBB_TASK_PRIORITY
@@ -182,8 +206,10 @@ arena::arena ( market& m, unsigned max_num_workers ) {
#endif /* !__TBB_TASK_PRIORITY */
my_mandatory_concurrency = false;
#if __TBB_TASK_GROUP_CONTEXT
- my_master_default_ctx = NULL;
-#endif
+ // Context to be used by root tasks by default (if the user has not specified one).
+ my_default_ctx =
+ new ( NFS_Allocate(1, sizeof(task_group_context), NULL) ) task_group_context(task_group_context::isolated);
+#endif /* __TBB_TASK_GROUP_CONTEXT */
}
arena& arena::allocate_arena( market& m, unsigned max_num_workers ) {
@@ -191,7 +217,7 @@ arena& arena::allocate_arena( market& m, unsigned max_num_workers ) {
__TBB_ASSERT( sizeof(base_type) % NFS_GetLineSize() == 0, "arena slots area misaligned: wrong padding" );
__TBB_ASSERT( sizeof(mail_outbox) == NFS_MaxLineSize, "Mailbox padding is wrong" );
size_t n = allocation_size(max_num_workers);
- unsigned char* storage = (unsigned char*)NFS_Allocate( n, 1, NULL );
+ unsigned char* storage = (unsigned char*)NFS_Allocate( 1, n, NULL );
// Zero all slots to indicate that they are empty
memset( storage, 0, n );
return *new( storage + num_slots_to_reserve(max_num_workers) * sizeof(mail_outbox) ) arena(m, max_num_workers);
@@ -199,7 +225,7 @@ arena& arena::allocate_arena( market& m, unsigned max_num_workers ) {
void arena::free_arena () {
__TBB_ASSERT( is_alive(my_guard), NULL );
- __TBB_ASSERT( !my_num_threads_active, "There are threads in the dying arena" );
+ __TBB_ASSERT( !my_references, "There are threads in the dying arena" );
__TBB_ASSERT( !my_num_workers_requested && !my_num_workers_allotted, "Dying arena requests workers" );
__TBB_ASSERT( my_pool_state == SNAPSHOT_EMPTY || !my_max_num_workers, "Inconsistent state of a dying arena" );
#if !__TBB_STATISTICS_EARLY_DUMP
@@ -207,8 +233,20 @@ void arena::free_arena () {
#endif
poison_value( my_guard );
intptr_t drained = 0;
- for ( unsigned i = 1; i <= my_num_slots; ++i )
- drained += mailbox(i).drain();
+ for ( unsigned i = 0; i < my_num_slots; ++i ) {
+ __TBB_ASSERT( !my_slots[i].my_scheduler, "arena slot is not empty" );
+#if !__TBB_TASK_ARENA
+ __TBB_ASSERT( my_slots[i].task_pool == EmptyTaskPool, NULL );
+#else
+ //TODO: understand the assertion and modify
+#endif
+ __TBB_ASSERT( my_slots[i].head == my_slots[i].tail, NULL ); // TODO: replace by is_quiescent_local_task_pool_empty
+ my_slots[i].free_task_pool();
+#if __TBB_STATISTICS
+ NFS_Free( my_slots[i].my_counters );
+#endif /* __TBB_STATISTICS */
+ drained += mailbox(i+1).drain();
+ }
#if __TBB_TASK_PRIORITY && TBB_USE_ASSERT
for ( intptr_t i = 0; i < num_priority_levels; ++i )
__TBB_ASSERT(my_task_stream[i].empty() && my_task_stream[i].drain()==0, "Not all enqueued tasks were executed");
@@ -220,16 +258,16 @@ void arena::free_arena () {
#endif /* __TBB_COUNT_TASK_NODES */
my_market->release();
#if __TBB_TASK_GROUP_CONTEXT
- __TBB_ASSERT( my_master_default_ctx, "Master thread never entered the arena?" );
- my_master_default_ctx->~task_group_context();
- NFS_Free(my_master_default_ctx);
+ __TBB_ASSERT( my_default_ctx, "Master thread never entered the arena?" );
+ my_default_ctx->~task_group_context();
+ NFS_Free(my_default_ctx);
#endif /* __TBB_TASK_GROUP_CONTEXT */
-#if __TBB_STATISTICS
- for( unsigned i = 0; i < my_num_slots; ++i )
- NFS_Free( my_slots[i].my_counters );
-#endif /* __TBB_STATISTICS */
+#if __TBB_SCHEDULER_OBSERVER
+ if ( !my_observers.empty() )
+ my_observers.clear();
+#endif /* __TBB_SCHEDULER_OBSERVER */
void* storage = &mailbox(my_num_slots);
- __TBB_ASSERT( my_num_threads_active == 0, NULL );
+ __TBB_ASSERT( my_references == 0, NULL );
__TBB_ASSERT( my_pool_state == SNAPSHOT_EMPTY || !my_max_num_workers, NULL );
this->~arena();
#if TBB_USE_ASSERT > 1
@@ -270,7 +308,7 @@ void arena::dump_arena_statistics () {
#endif /* __TBB_STATISTICS */
#if __TBB_TASK_PRIORITY
-// TODO: This function seems deserving refactoring
+// TODO: This function seems deserving refactoring, e.g. get rid of 's'
inline bool arena::may_have_tasks ( generic_scheduler* s, arena_slot& slot, bool& tasks_present, bool& dequeuing_possible ) {
suppress_unused_warning(slot);
if ( !s ) {
@@ -311,7 +349,7 @@ bool arena::is_out_of_work() {
// Request permission to take snapshot
if( my_pool_state.compare_and_swap( busy, SNAPSHOT_FULL )==SNAPSHOT_FULL ) {
// Got permission. Take the snapshot.
- // NOTE: This is not a lock, as the state can be set to FULL at
+ // NOTE: This is not a lock, as the state can be set to FULL at
// any moment by a thread that spawns/enqueues new task.
size_t n = my_limit;
// Make local copies of volatile parameters. Their change during
@@ -322,7 +360,7 @@ bool arena::is_out_of_work() {
uintptr_t reload_epoch = my_reload_epoch;
// Inspect primary task pools first
#endif /* __TBB_TASK_PRIORITY */
- size_t k;
+ size_t k;
for( k=0; k<n; ++k ) {
if( my_slots[k].task_pool != EmptyTaskPool &&
__TBB_load_relaxed(my_slots[k].head) < __TBB_load_relaxed(my_slots[k].tail) )
@@ -343,13 +381,14 @@ bool arena::is_out_of_work() {
// brought some tasks to the current priority level
uintptr_t abandonment_epoch = my_abandonment_epoch;
- // Master thread's scheduler needs special handling as it
- // may be destroyed at any moment (workers' schedulers are
+ // Master thread's scheduler needs special handling as it
+ // may be destroyed at any moment (workers' schedulers are
// guaranteed to be alive while at least one thread is in arena).
// Have to exclude concurrency with task group state change propagation too.
+ // TODO: check whether it is still necessary since some pools belong to slots now
my_market->my_arenas_list_mutex.lock();
generic_scheduler *s = my_slots[0].my_scheduler;
- if ( s && __TBB_CompareAndSwapW(&my_slots[0].my_scheduler, (intptr_t)LockedMaster, (intptr_t)s) == (intptr_t)s ) {
+ if ( s && as_atomic(my_slots[0].my_scheduler).compare_and_swap(LockedMaster, s) == s ) { //TODO: remove need to lock
__TBB_ASSERT( my_slots[0].my_scheduler == LockedMaster && s != LockedMaster, NULL );
work_absent = !may_have_tasks( s, my_slots[0], tasks_present, dequeuing_possible );
__TBB_store_with_release( my_slots[0].my_scheduler, s );
@@ -360,12 +399,12 @@ bool arena::is_out_of_work() {
// leave to RML or migrate to another arena.
// But the races are not prevented because all of them are benign.
// First, the code relies on the fact that worker thread's scheduler
- // object persists until the whole library is deinitialized.
- // Second, in the worst case the races can only cause another
- // round of stealing attempts to be undertaken. Introducing complex
- // synchronization into this coldest part of the scheduler's control
- // flow does not seem to make sense because it both is unlikely to
- // ever have any observable performance effect, and will require
+ // object persists until the whole library is deinitialized.
+ // Second, in the worst case the races can only cause another
+ // round of stealing attempts to be undertaken. Introducing complex
+ // synchronization into this coldest part of the scheduler's control
+ // flow does not seem to make sense because it both is unlikely to
+ // ever have any observable performance effect, and will require
// additional synchronization code on the hotter paths.
for( k = 1; work_absent && k < n; ++k )
work_absent = !may_have_tasks( my_slots[k].my_scheduler, my_slots[k], tasks_present, dequeuing_possible );
@@ -400,7 +439,7 @@ bool arena::is_out_of_work() {
// to avoid race with advertise_new_work.
int current_demand = (int)my_max_num_workers;
if( my_pool_state.compare_and_swap( SNAPSHOT_EMPTY, busy )==busy ) {
- // This thread transitioned pool to empty state, and thus is
+ // This thread transitioned pool to empty state, and thus is
// responsible for telling RML that there is no other work to do.
my_market->adjust_demand( *this, -current_demand );
#if __TBB_TASK_PRIORITY
@@ -408,7 +447,7 @@ bool arena::is_out_of_work() {
// priority levels because updating arena priority and switching
// arena into "populated" (FULL) state happen non-atomically.
// Imposing atomicity would require task::enqueue() to use a lock,
- // which is unacceptable.
+ // which is unacceptable.
bool switch_back = false;
for ( int p = 0; p < num_priority_levels; ++p ) {
if ( !my_task_stream[p].empty() ) {
@@ -430,7 +469,7 @@ bool arena::is_out_of_work() {
// Undo previous transition SNAPSHOT_FULL-->busy, unless another thread undid it.
my_pool_state.compare_and_swap( SNAPSHOT_FULL, busy );
}
- }
+ }
return false;
}
default:
@@ -440,7 +479,7 @@ bool arena::is_out_of_work() {
}
}
-#if __TBB_COUNT_TASK_NODES
+#if __TBB_COUNT_TASK_NODES
intptr_t arena::workers_task_node_count() {
intptr_t result = 0;
for( unsigned i = 1; i < my_num_slots; ++i ) {
@@ -452,5 +491,270 @@ intptr_t arena::workers_task_node_count() {
}
#endif /* __TBB_COUNT_TASK_NODES */
+void arena::enqueue_task( task& t, intptr_t prio, unsigned &hint_for_push )
+{
+#if __TBB_RECYCLE_TO_ENQUEUE
+ __TBB_ASSERT( t.state()==task::allocated || t.state()==task::to_enqueue, "attempt to enqueue task with inappropriate state" );
+#else
+ __TBB_ASSERT( t.state()==task::allocated, "attempt to enqueue task that is not in 'allocated' state" );
+#endif
+ t.prefix().state = task::ready;
+ t.prefix().extra_state |= es_task_enqueued; // enqueued task marker
+
+#if TBB_USE_ASSERT
+ if( task* parent = t.parent() ) {
+ internal::reference_count ref_count = parent->prefix().ref_count;
+ __TBB_ASSERT( ref_count!=0, "attempt to enqueue task whose parent has a ref_count==0 (forgot to set_ref_count?)" );
+ __TBB_ASSERT( ref_count>0, "attempt to enqueue task whose parent has a ref_count<0" );
+ parent->prefix().extra_state |= es_ref_count_active;
+ }
+ __TBB_ASSERT(t.prefix().affinity==affinity_id(0), "affinity is ignored for enqueued tasks");
+#endif /* TBB_USE_ASSERT */
+
+#if __TBB_TASK_PRIORITY
+ intptr_t p = prio ? normalize_priority(priority_t(prio)) : normalized_normal_priority;
+ assert_priority_valid(p);
+ task_stream &ts = my_task_stream[p];
+#else /* !__TBB_TASK_PRIORITY */
+ __TBB_ASSERT_EX(prio == 0, "the library is not configured to respect the task priority");
+ task_stream &ts = my_task_stream;
+#endif /* !__TBB_TASK_PRIORITY */
+ ITT_NOTIFY(sync_releasing, &ts);
+ ts.push( &t, hint_for_push );
+#if __TBB_TASK_PRIORITY
+ if ( p != my_top_priority )
+ my_market->update_arena_priority( *this, p );
+#endif /* __TBB_TASK_PRIORITY */
+ advertise_new_work< /*Spawned=*/ false >();
+#if __TBB_TASK_PRIORITY
+ if ( p != my_top_priority )
+ my_market->update_arena_priority( *this, p );
+#endif /* __TBB_TASK_PRIORITY */
+}
+
+#if __TBB_TASK_ARENA
+template<typename Body>
+void generic_scheduler::nested_arena_execute(arena* arena, task* t, bool needs_adjusting, Body &b) {
+ // TODO: is it safe to assign slot to a scheduler which is not yet switched
+ // save current arena settings
+ scheduler_state state = *this;
+ // overwrite arena settings
+ my_arena = arena;
+ my_arena_index = 0;
+ my_arena_slot = my_arena->my_slots + my_arena_index;
+ my_inbox.detach(); // TODO: mailboxes were not designed for switching, add copy constructor?
+ attach_mailbox( affinity_id(my_arena_index+1) );
+ my_innermost_running_task = my_dispatching_task = t;
+
+#if __TBB_SCHEDULER_OBSERVER
+ my_last_local_observer = 0;
+ my_arena->my_observers.notify_entry_observers( my_last_local_observer, /*worker=*/false );
+#endif
+ // TODO: it requires market to have P workers (not P-1)
+ // TODO: it still allows temporary oversubscription by 1 worker (due to my_max_num_workers)
+ // TODO: a preempted worker should be excluded from assignment to other arenas e.g. my_slack--
+ if( needs_adjusting ) my_arena->my_market->adjust_demand(*my_arena, -1);
+ b();
+ if( needs_adjusting ) my_arena->my_market->adjust_demand(*my_arena, 1);
+#if __TBB_SCHEDULER_OBSERVER
+ my_arena->my_observers.notify_exit_observers( my_last_local_observer, /*worker=*/false );
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+ // Free the master slot. TODO: support multiple masters
+#if __TBB_TASK_PRIORITY
+ while ( as_atomic(my_arena->my_slots[0].my_scheduler).compare_and_swap( NULL, this) != this )
+ __TBB_Yield(); // task priority can use master slot for locking while accessing the scheduler
+#else
+ __TBB_store_with_release(my_arena->my_slots[0].my_scheduler, (generic_scheduler*)NULL);
+#endif
+ my_arena->my_exit_monitors.notify_one_relaxed();
+ // restore arena settings
+ *(scheduler_state*)this = state;
+}
+#endif /* __TBB_TASK_ARENA */
+
} // namespace internal
} // namespace tbb
+
+#if __TBB_TASK_ARENA
+#include "scheduler_utility.h"
+
+namespace tbb {
+namespace interface6 {
+using namespace tbb::internal;
+
+void task_arena::internal_initialize( ) {
+ __TBB_ASSERT(!my_initialized, NULL);
+ __TBB_ASSERT(!my_arena, NULL);
+ __TBB_ASSERT( my_master_slots <= 1, "Number of slots reserved for master can be only [0,1]");
+ if( my_master_slots > 1 ) my_master_slots = 1; // TODO: make more masters
+ if( my_max_concurrency < 1 )
+ my_max_concurrency = (int)governor::default_num_threads();
+ // TODO: reimplement in an efficient way. We need a scheduler instance in this thread
+ // but the scheduler is only required for task allocation and fifo random seeds until
+ // master wants to join the arena. (Idea - to create a restricted specialization)
+ // It is excessive to create an implicit arena for master here anyway. But scheduler
+ // instance implies master thread to be always connected with arena.
+ // browse recursively into init_scheduler and arena::process for details
+ if( !governor::local_scheduler_if_initialized() )
+ governor::init_scheduler( (unsigned)my_max_concurrency - my_master_slots + 1/*TODO: address in market instead*/, 0, true );
+ // TODO: we will need to introduce a mechanism for global settings, including stack size, used by all arenas
+ my_arena = &market::create_arena( my_max_concurrency - my_master_slots/*it's +1 slot for num_masters=0*/, ThreadStackSize );
+}
+
+void task_arena::internal_terminate( ) {
+ if( my_arena ) {// task_arena was initialized
+ my_arena->on_thread_leaving</*is_master*/true>();
+ my_arena = 0;
+ }
+}
+
+void task_arena::internal_enqueue( task& t, intptr_t prio ) const {
+ __TBB_ASSERT(my_arena, NULL);
+ generic_scheduler* s = governor::local_scheduler_if_initialized();
+ __TBB_ASSERT(s, "Scheduler is not initialized"); // we allocated a task so can expect the scheduler
+#if __TBB_TASK_GROUP_CONTEXT
+ __TBB_ASSERT(s->my_innermost_running_task->prefix().context == t.prefix().context, "using non-default context? consider reimplement code below");
+ t.prefix().context = my_arena->my_default_ctx;
+ ITT_STACK_CREATE(my_arena->my_default_ctx->itt_caller);
+#endif
+ my_arena->enqueue_task( t, prio, s->hint_for_push );
+}
+
+class delegated_task : public task {
+ internal::delegate_base & my_delegate;
+ concurrent_monitor & my_monitor;
+ task * my_root;
+ /*override*/ task* execute() {
+ generic_scheduler& s = *(generic_scheduler*)prefix().owner;
+ __TBB_ASSERT(s.worker_outermost_level() || s.master_outermost_level(), "expected to be enqueued and received on the outermost level");
+ // but this task can mimics outermost level, detect it
+ if( s.master_outermost_level() && s.my_dummy_task->state() == task::executing ) {
+#if TBB_USE_EXCEPTIONS
+ // RTTI is available, check whether the cast is valid
+ __TBB_ASSERT(dynamic_cast<delegated_task*>(s.my_dummy_task), 0);
+#endif
+ set_ref_count(1); // required by the semantics of recycle_to_enqueue()
+ recycle_to_enqueue();
+ return NULL;
+ }
+ task * old_dummy = s.my_dummy_task;
+ s.my_dummy_task = this; // mimics outermost master
+ __TBB_ASSERT(s.my_innermost_running_task == this, 0);
+ my_delegate();
+ s.my_dummy_task = old_dummy;
+ __TBB_ASSERT(my_root->ref_count()==2, NULL);
+ __TBB_store_with_release(my_root->prefix().ref_count, 1); // must precede the wakeup
+ my_monitor.notify_relaxed(*this);
+ return NULL;
+ }
+public:
+ delegated_task ( internal::delegate_base & d, concurrent_monitor & s, task * t )
+ : my_delegate(d), my_monitor(s), my_root(t) {}
+ bool operator()(uintptr_t ctx) const { return (void*)ctx == (void*)&my_delegate; }
+};
+
+struct arena_join_body : internal::delegate_base {
+ generic_scheduler *my_scheduler;
+ task * my_root;
+ arena_join_body(generic_scheduler *s, task * t) : my_scheduler(s), my_root(t) {}
+ /*override*/ void operator()() const {
+ my_scheduler->local_wait_for_all(*my_root, NULL);
+ }
+};
+// TODO: consider replacing of delegate_base by scoped_task
+void task_arena::internal_execute( internal::delegate_base& d) const {
+ __TBB_ASSERT(my_arena, NULL);
+ generic_scheduler* s = governor::local_scheduler();
+ __TBB_ASSERT(s, "Scheduler is not initialized");
+ if( s->my_arena == my_arena )
+ d();
+ else if( !__TBB_load_with_acquire(my_arena->my_slots[0].my_scheduler) // TODO TEMP: one master, make more masters
+ && as_atomic(my_arena->my_slots[0].my_scheduler).compare_and_swap(s, NULL ) == NULL ) {
+ s->nested_arena_execute<const internal::delegate_base>(my_arena, s->my_dummy_task, !my_master_slots, d);
+ } else {
+ concurrent_monitor::thread_context waiter;
+ auto_empty_task root(__TBB_CONTEXT_ARG(s, s->my_dummy_task->prefix().context));
+ root.prefix().ref_count = 2;
+ internal_enqueue( *new( task::allocate_root() ) delegated_task(d, my_arena->my_exit_monitors, &root), 0 ); // TODO: priority?
+ do {
+ my_arena->my_exit_monitors.prepare_wait(waiter, (uintptr_t)&d);
+ if( __TBB_load_with_acquire(root.prefix().ref_count) < 2 ) {
+ my_arena->my_exit_monitors.cancel_wait(waiter);
+ break;
+ }
+ else if( !__TBB_load_with_acquire(my_arena->my_slots[0].my_scheduler) // TODO: refactor into a function?
+ && as_atomic(my_arena->my_slots[0].my_scheduler).compare_and_swap(s, NULL ) == NULL ) {
+ my_arena->my_exit_monitors.cancel_wait(waiter);
+ s->nested_arena_execute<const internal::delegate_base>(my_arena, s->my_dummy_task, !my_master_slots, arena_join_body(s, &root));
+ __TBB_ASSERT( root.prefix().ref_count == 0, NULL );
+ } else {
+ my_arena->my_exit_monitors.commit_wait(waiter);
+ }
+ } while( __TBB_load_with_acquire(root.prefix().ref_count) == 2 );
+ }
+}
+
+// this wait task is a temporary approach to wait for arena emptiness for masters without slots
+// TODO: it will be rather reworked for one source of notification from is_out_of_work
+class wait_task : public task {
+ binary_semaphore & my_signal;
+ /*override*/ task* execute() {
+ generic_scheduler& s = *governor::local_scheduler_if_initialized();
+ if( s.my_arena_index && s.worker_outermost_level() ) // on outermost level of workers only
+ s.local_wait_for_all( *s.my_dummy_task, NULL ); // run remaining tasks
+ else s.my_arena->is_out_of_work(); // avoids starvation of internal_wait: issuing this task makes arena full
+ my_signal.V();
+ return NULL;
+ }
+public:
+ wait_task ( binary_semaphore & s ) : my_signal(s) {}
+};
+
+struct wait_body : internal::delegate_base {
+ generic_scheduler *my_scheduler;
+ wait_body(generic_scheduler *s) : my_scheduler(s) {}
+ /*override*/ void operator()() const {
+ my_scheduler->my_dummy_task->prefix().ref_count++; // force stealing
+ while( my_scheduler->my_arena->my_pool_state != arena::SNAPSHOT_EMPTY )
+ my_scheduler->local_wait_for_all(*my_scheduler->my_dummy_task, NULL);
+ my_scheduler->my_dummy_task->prefix().ref_count--;
+ }
+};
+
+// todo: merge with internal_execute()
+void task_arena::internal_wait() const {
+ __TBB_ASSERT(my_arena, NULL);
+ generic_scheduler* s = governor::local_scheduler();
+ __TBB_ASSERT(s, "Scheduler is not initialized");
+ __TBB_ASSERT(s->my_arena != my_arena || s->my_arena_index == 0, "task_arena::wait_until_empty() is not supported within a worker context" );
+ for(;;) {
+ while( my_arena->my_pool_state != arena::SNAPSHOT_EMPTY ) {
+ if( s->my_arena == my_arena )
+ while( my_arena->my_pool_state != arena::SNAPSHOT_EMPTY )
+ s->local_wait_for_all( *s->my_dummy_task, NULL ); //TODO: check dummy_task logic inside
+ else if( !__TBB_load_with_acquire(my_arena->my_slots[0].my_scheduler) // TODO TEMP: one master, make more masters
+ && as_atomic(my_arena->my_slots[0].my_scheduler).compare_and_swap(s, NULL) == NULL ) {
+ s->nested_arena_execute<const internal::delegate_base>(my_arena, NULL, !my_master_slots, wait_body(s));
+ } else {
+ binary_semaphore waiter; // TODO: replace by a single event notification from is_out_of_work
+ internal_enqueue( *new( task::allocate_root() ) wait_task(waiter), 0 ); // TODO: priority?
+ waiter.P(); // TODO: concurrent_monitor
+ }
+ }
+ if( (!my_arena->num_workers_active() && !my_arena->my_slots[0].my_scheduler) // no activity
+ || (s->my_arena == my_arena && s->my_arena_index ) ) // or improper worker context
+ break; // spin until workers active but avoid spinning in a worker
+ __TBB_Yield(); // wait until workers and master leave
+ }
+}
+
+/*static*/ int task_arena::current_slot() {
+ generic_scheduler* s = governor::local_scheduler(); // TODO: return a special value if the thread has no slot
+ return s->my_arena_index;
+}
+
+
+} // tbb::interfaceX
+} // tbb
+#endif /* __TBB_TASK_ARENA */
diff --git a/src/tbb/arena.h b/src/tbb/arena.h
index 485b532..6bf7822 100644
--- a/src/tbb/arena.h
+++ b/src/tbb/arena.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -44,22 +44,26 @@
#include "task_stream.h"
#include "../rml/include/rml_tbb.h"
#include "mailbox.h"
+#include "observer_proxy.h"
+#if __TBB_TASK_ARENA
+#include "concurrent_monitor.h"
+#endif
namespace tbb {
+namespace interface6 {
+class task_arena;
+}
class task_group_context;
class allocate_root_with_context_proxy;
namespace internal {
+class task_scheduler_observer_v3;
class governor;
class arena;
template<typename SchedulerTraits> class custom_scheduler;
-//------------------------------------------------------------------------
-// arena
-//------------------------------------------------------------------------
-
class market;
//! arena data except the array of slots
@@ -84,10 +88,10 @@ struct arena_base : intrusive_list_node {
//! Number of workers that have been marked out by the resource manager to service the arena
unsigned my_num_workers_allotted;
- //! Number of threads in the arena at the moment
- /** Consists of the workers servicing the arena and one master until it starts
- arena shutdown and detaches from it. Plays the role of the arena's ref count. **/
- atomic<unsigned> my_num_threads_active;
+ //! References of the arena
+ /** Counts workers and master references separately. Bit 0 indicates reference from implicit
+ master or explicit task_arena; the next bits contain number of workers servicing the arena.*/
+ atomic<unsigned> my_references;
//! ABA prevention marker
uintptr_t my_aba_epoch;
@@ -110,7 +114,7 @@ struct arena_base : intrusive_list_node {
//! Default task group context.
/** Used by root tasks allocated directly by the master thread (not from inside
a TBB task) without explicit context specification. **/
- task_group_context* my_master_default_ctx;
+ task_group_context* my_default_ctx;
#endif /* __TBB_TASK_GROUP_CONTEXT */
#if __TBB_TASK_PRIORITY
@@ -153,9 +157,19 @@ struct arena_base : intrusive_list_node {
task_stream my_task_stream;
#endif /* !__TBB_TASK_PRIORITY */
+#if __TBB_SCHEDULER_OBSERVER
+ //! List of local observers attached to this arena.
+ observer_list my_observers;
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
//! Indicates if there is an oversubscribing worker created to service enqueued tasks.
bool my_mandatory_concurrency;
+#if __TBB_TASK_ARENA
+ //! exit notifications after arena slot is released
+ concurrent_monitor my_exit_monitors;
+#endif
+
#if TBB_USE_ASSERT
//! Used to trap accesses to the object after its destruction.
uintptr_t my_guard;
@@ -173,11 +187,17 @@ private:
friend class generic_scheduler;
template<typename SchedulerTraits> friend class custom_scheduler;
friend class governor;
-
+ friend class task_scheduler_observer_v3;
friend class market;
friend class tbb::task_group_context;
friend class allocate_root_with_context_proxy;
friend class intrusive_list<arena>;
+#if __TBB_TASK_ARENA
+ friend class tbb::interface6::task_arena; // included through in scheduler_common.h
+ friend class interface6::delegated_task;
+ friend class interface6::wait_task;
+ friend struct interface6::wait_body;
+#endif //__TBB_TASK_ARENA
typedef padded<arena_base> base_type;
@@ -229,7 +249,7 @@ private:
//! The number of workers active in the arena.
unsigned num_workers_active( ) {
- return my_num_threads_active - (my_slots[0].my_scheduler? 1 : 0);
+ return my_references >> 1;
}
//! If necessary, raise a flag that there is new job in arena.
@@ -239,11 +259,15 @@ private:
/** Return true if no job or if arena is being cleaned up. */
bool is_out_of_work();
+ //! enqueue a task into starvation-resistance queue
+ void enqueue_task( task&, intptr_t, unsigned & );
+
//! Registers the worker with the arena and enters TBB scheduler dispatch loop
void process( generic_scheduler& );
//! Notification that worker or master leaves its arena
- inline void on_thread_leaving ( bool master = false );
+ template<bool is_master>
+ inline void on_thread_leaving ( );
#if __TBB_STATISTICS
//! Outputs internal statistics accumulated by the arena
@@ -270,11 +294,13 @@ private:
#include "market.h"
#include "scheduler_common.h"
+#include "governor.h"
namespace tbb {
namespace internal {
-inline void arena::on_thread_leaving ( bool master ) {
+template<bool is_master>
+inline void arena::on_thread_leaving ( ) {
//
// Implementation of arena destruction synchronization logic contained various
// bugs/flaws at the different stages of its evolution, so below is a detailed
@@ -326,15 +352,18 @@ inline void arena::on_thread_leaving ( bool master ) {
//
uintptr_t aba_epoch = my_aba_epoch;
market* m = my_market;
- if ( !--my_num_threads_active )
- market::try_destroy_arena( m, this, aba_epoch, master );
+ __TBB_ASSERT(my_references > int(!is_master), "broken arena reference counter");
+ if ( (my_references -= is_master? 1:2 ) == 0 ) // worker's counter starts from bit 1
+ market::try_destroy_arena( m, this, aba_epoch, is_master );
}
template<bool Spawned> void arena::advertise_new_work() {
if( !Spawned ) { // i.e. the work was enqueued
if( my_max_num_workers==0 ) {
my_max_num_workers = 1;
+ __TBB_ASSERT(!my_mandatory_concurrency, "");
my_mandatory_concurrency = true;
+ __TBB_ASSERT(!num_workers_active(), "");
my_pool_state = SNAPSHOT_FULL;
my_market->adjust_demand( *this, 1 );
return;
@@ -369,6 +398,7 @@ template<bool Spawned> void arena::advertise_new_work() {
if( Spawned ) {
if( my_mandatory_concurrency ) {
__TBB_ASSERT(my_max_num_workers==1, "");
+ __TBB_ASSERT(!governor::local_scheduler()->is_worker(), "");
// There was deliberate oversubscription on 1 core for sake of starvation-resistant tasks.
// Now a single active thread (must be the master) supposedly starts a new parallel region
// with relaxed sequential semantics, and oversubscription should be avoided.
diff --git a/src/tbb/cache_aligned_allocator.cpp b/src/tbb/cache_aligned_allocator.cpp
index 148abef..11a1e4f 100644
--- a/src/tbb/cache_aligned_allocator.cpp
+++ b/src/tbb/cache_aligned_allocator.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+#include "tbb/tbb_config.h"
#include "tbb/cache_aligned_allocator.h"
#include "tbb/tbb_allocator.h"
#include "tbb/tbb_exception.h"
@@ -41,7 +42,7 @@
using namespace std;
-#if __TBB_WEAK_SYMBOLS
+#if __TBB_WEAK_SYMBOLS_PRESENT
#pragma weak scalable_malloc
#pragma weak scalable_free
@@ -55,7 +56,7 @@ extern "C" {
void scalable_aligned_free( void* );
}
-#endif /* __TBB_WEAK_SYMBOLS */
+#endif /* __TBB_WEAK_SYMBOLS_PRESENT */
namespace tbb {
@@ -111,10 +112,10 @@ static const dynamic_link_descriptor MallocLinkTable[] = {
#define MALLOCLIB_NAME "tbbmalloc" DEBUG_SUFFIX ".dll"
#elif __APPLE__
#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX ".dylib"
-#elif __linux__
-#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION)
-#elif __FreeBSD__ || __NetBSD__ || __sun || _AIX
+#elif __FreeBSD__ || __NetBSD__ || __sun || _AIX || __ANDROID__
#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX ".so"
+#elif __linux__ // Note that order of these #elif's is important!
+#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION)
#else
#error Unknown OS
#endif
diff --git a/src/tbb/cilk-tbb-interop.h b/src/tbb/cilk-tbb-interop.h
index 43caf24..9cd1a21 100644
--- a/src/tbb/cilk-tbb-interop.h
+++ b/src/tbb/cilk-tbb-interop.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/concurrent_hash_map.cpp b/src/tbb/concurrent_hash_map.cpp
index 571ad96..9431afd 100644
--- a/src/tbb/concurrent_hash_map.cpp
+++ b/src/tbb/concurrent_hash_map.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/concurrent_monitor.cpp b/src/tbb/concurrent_monitor.cpp
index 829efdf..8964881 100644
--- a/src/tbb/concurrent_monitor.cpp
+++ b/src/tbb/concurrent_monitor.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/concurrent_monitor.h b/src/tbb/concurrent_monitor.h
index cf42742..3d0ac55 100644
--- a/src/tbb/concurrent_monitor.h
+++ b/src/tbb/concurrent_monitor.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/concurrent_queue.cpp b/src/tbb/concurrent_queue.cpp
index fcf6e16..6c7750b 100644
--- a/src/tbb/concurrent_queue.cpp
+++ b/src/tbb/concurrent_queue.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -181,7 +181,7 @@ void micro_queue::push( const void* item, ticket k, concurrent_queue_base& base
k &= -concurrent_queue_rep::n_queue;
page* p = NULL;
// find index on page where we would put the data
- size_t index = k/concurrent_queue_rep::n_queue & (base.items_per_page-1);
+ size_t index = modulo_power_of_two( k/concurrent_queue_rep::n_queue, base.items_per_page );
if( !index ) { // make a new page
__TBB_TRY {
p = base.allocate_page();
@@ -246,7 +246,7 @@ bool micro_queue::pop( void* dst, ticket k, concurrent_queue_base& base ) {
spin_wait_while_eq( tail_counter, k );
page& p = *head_page;
__TBB_ASSERT( &p, NULL );
- size_t index = k/concurrent_queue_rep::n_queue & (base.items_per_page-1);
+ size_t index = modulo_power_of_two( k/concurrent_queue_rep::n_queue, base.items_per_page );
bool success = false;
{
micro_queue_pop_finalizer finalizer( *this, base, k+concurrent_queue_rep::n_queue, index==base.items_per_page-1 ? &p : NULL );
@@ -274,7 +274,7 @@ micro_queue& micro_queue::assign( const micro_queue& src, concurrent_queue_base&
ticket g_index = head_counter;
__TBB_TRY {
size_t n_items = (tail_counter-head_counter)/concurrent_queue_rep::n_queue;
- size_t index = head_counter/concurrent_queue_rep::n_queue & (base.items_per_page-1);
+ size_t index = modulo_power_of_two( head_counter/concurrent_queue_rep::n_queue, base.items_per_page );
size_t end_in_first_page = (index+n_items<base.items_per_page)?(index+n_items):base.items_per_page;
head_page = make_copy( base, srcp, index, end_in_first_page, g_index );
@@ -288,7 +288,7 @@ micro_queue& micro_queue::assign( const micro_queue& src, concurrent_queue_base&
__TBB_ASSERT( srcp==src.tail_page, NULL );
- size_t last_index = tail_counter/concurrent_queue_rep::n_queue & (base.items_per_page-1);
+ size_t last_index = modulo_power_of_two( tail_counter/concurrent_queue_rep::n_queue, base.items_per_page );
if( last_index==0 ) last_index = base.items_per_page;
cur_page->next = make_copy( base, srcp, 0, last_index, g_index );
@@ -569,7 +569,7 @@ public:
} else {
concurrent_queue_base::page* p = array[concurrent_queue_rep::index(k)];
__TBB_ASSERT(p,NULL);
- size_t i = k/concurrent_queue_rep::n_queue & (my_queue.items_per_page-1);
+ size_t i = modulo_power_of_two( k/concurrent_queue_rep::n_queue, my_queue.items_per_page );
item = static_cast<unsigned char*>(static_cast<void*>(p)) + offset_of_last + my_queue.item_size*i;
return (p->mask & uintptr_t(1)<<i)!=0;
}
@@ -618,7 +618,7 @@ void concurrent_queue_iterator_base_v3::advance() {
my_rep->get_item(tmp,k);
__TBB_ASSERT( my_item==tmp, NULL );
#endif /* TBB_USE_ASSERT */
- size_t i = k/concurrent_queue_rep::n_queue & (queue.items_per_page-1);
+ size_t i = modulo_power_of_two( k/concurrent_queue_rep::n_queue, queue.items_per_page );
if( i==queue.items_per_page-1 ) {
concurrent_queue_base::page*& root = my_rep->array[concurrent_queue_rep::index(k)];
root = root->next;
diff --git a/src/tbb/concurrent_vector.cpp b/src/tbb/concurrent_vector.cpp
index 1c2d707..4a4dea3 100644
--- a/src/tbb/concurrent_vector.cpp
+++ b/src/tbb/concurrent_vector.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+//this is the change
#include "tbb/concurrent_vector.h"
#include "tbb/cache_aligned_allocator.h"
#include "tbb/tbb_exception.h"
diff --git a/src/tbb/condition_variable.cpp b/src/tbb/condition_variable.cpp
index e757a16..b660e25 100644
--- a/src/tbb/condition_variable.cpp
+++ b/src/tbb/condition_variable.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+#include "tbb/tbb_config.h"
#include "tbb/compat/condition_variable"
#include "tbb/atomic.h"
#include "tbb_misc.h"
@@ -44,8 +45,9 @@ static atomic<do_once_state> condvar_api_state;
void WINAPI init_condvar_using_event( condition_variable_using_event* cv_event )
{
- cv_event->event = CreateEvent( NULL, TRUE/*manual reset*/, FALSE/*not signalled initially*/, NULL);
- InitializeCriticalSection( &cv_event->mutex );
+ // TODO: For Metro port, we can always use the API for condition variables, without dynamic_link etc.
+ cv_event->event = CreateEventEx(NULL, NULL, 0x1 /*CREATE_EVENT_MANUAL_RESET*/, EVENT_ALL_ACCESS );
+ InitializeCriticalSectionEx( &cv_event->mutex, 4000, 0 );
cv_event->n_waiters = 0;
cv_event->release_count = 0;
cv_event->epoch = 0;
@@ -60,7 +62,7 @@ BOOL WINAPI sleep_condition_variable_cs_using_event( condition_variable_using_ev
LeaveCriticalSection( cs );
for (;;) {
// should come here at least once
- DWORD rc = WaitForSingleObject( cv_event->event, dwMilliseconds );
+ DWORD rc = WaitForSingleObjectEx( cv_event->event, dwMilliseconds, FALSE );
EnterCriticalSection( &cv_event->mutex );
if( rc!=WAIT_OBJECT_0 ) {
--cv_event->n_waiters;
@@ -147,7 +149,7 @@ static const dynamic_link_descriptor CondVarLinkTable[] = {
void init_condvar_module()
{
__TBB_ASSERT( (uintptr_t)__TBB_init_condvar==(uintptr_t)&init_condvar_using_event, NULL );
- if( dynamic_link( GetModuleHandle( "Kernel32.dll" ), CondVarLinkTable, 4 ) )
+ if( dynamic_link( "Kernel32.dll", CondVarLinkTable, 4 ) )
__TBB_destroy_condvar = (void (WINAPI *)(PCONDITION_VARIABLE))&destroy_condvar_noop;
}
#endif /* _WIN32||_WIN64 */
diff --git a/src/tbb/critical_section.cpp b/src/tbb/critical_section.cpp
index 83deebe..4a8964f 100644
--- a/src/tbb/critical_section.cpp
+++ b/src/tbb/critical_section.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/custom_scheduler.h b/src/tbb/custom_scheduler.h
index b0ec8e8..7bcdd2b 100644
--- a/src/tbb/custom_scheduler.h
+++ b/src/tbb/custom_scheduler.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -39,7 +39,9 @@ namespace internal {
//! Amount of time to pause between steals.
/** The default values below were found to be best empirically for K-Means
on the 32-way Altix and 4-way (*2 for HT) fxqlin04. */
-#if __TBB_ipf
+#ifdef __TBB_STEALING_PAUSE
+static const long PauseTime = __TBB_STEALING_PAUSE;
+#elif __TBB_ipf
static const long PauseTime = 1500;
#else
static const long PauseTime = 80;
@@ -111,6 +113,13 @@ class custom_scheduler: private generic_scheduler {
p.extra_state &= ~es_ref_count_active;
#endif /* TBB_USE_ASSERT */
+#if __TBB_RECYCLE_TO_ENQUEUE
+ if (p.state==task::to_enqueue) {
+ // related to __TBB_TASK_ARENA TODO: try keep priority of the task
+ // e.g. rework task_prefix to remember priority of received task and use here
+ my_arena->enqueue_task(s, 0, hint_for_push );
+ } else
+#endif /*__TBB_RECYCLE_TO_ENQUEUE*/
if( bypass_slot==NULL )
bypass_slot = &s;
else
@@ -119,7 +128,7 @@ class custom_scheduler: private generic_scheduler {
public:
static generic_scheduler* allocate_scheduler( arena* a, size_t index ) {
- scheduler_type* s = (scheduler_type*)NFS_Allocate(sizeof(scheduler_type),1,NULL);
+ scheduler_type* s = (scheduler_type*)NFS_Allocate(1,sizeof(scheduler_type),NULL);
new( s ) scheduler_type( a, index );
s->assert_task_pool_valid();
ITT_SYNC_CREATE(s, SyncType_Scheduler, SyncObj_TaskPoolSpinning);
@@ -155,6 +164,7 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( __TBB_atomic ref
}
}
#endif /* __TBB_TASK_PRIORITY */
+ int yield_count = 0;
// The state "failure_count==-1" is used only when itt_possible is true,
// and denotes that a sync_prepare has not yet been issued.
for( int failure_count = -static_cast<int>(SchedulerTraits::itt_possible);; ++failure_count) {
@@ -174,77 +184,69 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( __TBB_atomic ref
__TBB_ASSERT( my_arena->my_limit > 0, NULL );
size_t n = my_arena->my_limit;
__TBB_ASSERT( my_arena_index < n, NULL );
- if ( n > 1 ) {
- // Check if the resource manager requires our arena to relinquish some threads
- if ( return_if_no_work && my_arena->my_num_workers_allotted < my_arena->num_workers_active() ) {
- __TBB_ASSERT( is_worker(), NULL );
- if( SchedulerTraits::itt_possible && failure_count != -1 )
- ITT_NOTIFY(sync_cancel, this);
- return NULL;
- }
- // Check if there are tasks mailed to this thread via task-to-thread affinity mechanism.
- if ( my_affinity_id && (t=get_mailbox_task()) ) {
- GATHER_STATISTIC( ++my_counters.mails_received );
- }
- // Check if there are tasks in starvation-resistant stream.
- // Only allowed for workers with empty stack, which is identified by return_if_no_work.
- else if ( outermost_dispatch_level && (t = dequeue_task()) ) {
- // just proceed with the obtained task
- }
+ // Check if the resource manager requires our arena to relinquish some threads
+ if ( return_if_no_work && my_arena->my_num_workers_allotted < my_arena->num_workers_active() ) {
+#if !__TBB_TASK_ARENA
+ __TBB_ASSERT( is_worker(), NULL );
+#endif
+ if( SchedulerTraits::itt_possible && failure_count != -1 )
+ ITT_NOTIFY(sync_cancel, this);
+ return NULL;
+ }
+ // Check if there are tasks mailed to this thread via task-to-thread affinity mechanism.
+ __TBB_ASSERT(my_affinity_id, NULL);
+ if ( n > 1 && (t=get_mailbox_task()) ) {
+ GATHER_STATISTIC( ++my_counters.mails_received );
+ }
+ // Check if there are tasks in starvation-resistant stream.
+ // Only allowed for workers with empty stack, which is identified by return_if_no_work.
+ else if ( outermost_dispatch_level && (t = dequeue_task()) ) {
+ // just proceed with the obtained task
+ }
#if __TBB_TASK_PRIORITY
- // Check if any earlier offloaded non-top priority tasks become returned to the top level
- else if ( my_offloaded_tasks && (t=reload_tasks()) ) {
- // just proceed with the obtained task
- }
+ // Check if any earlier offloaded non-top priority tasks become returned to the top level
+ else if ( my_offloaded_tasks && (t=reload_tasks()) ) {
+ // just proceed with the obtained task
+ }
#endif /* __TBB_TASK_PRIORITY */
- else if ( can_steal() && n > 1 ) {
- // Try to steal a task from a random victim.
- size_t k = my_random.get() % (n - 1);
- arena_slot* victim = &my_arena->my_slots[k];
- // The following condition excludes the master that might have
- // already taken our previous place in the arena from the list .
- // of potential victims. But since such a situation can take
- // place only in case of significant oversubscription, keeping
- // the checks simple seems to be preferable to complicating the code.
- if( k >= my_arena_index )
- ++victim; // Adjusts random distribution to exclude self
- t = steal_task( *victim );
- if( !t ) goto fail;
- if( is_proxy(*t) ) {
- task_proxy &tp = *(task_proxy*)t;
- t = tp.extract_task<task_proxy::pool_bit>();
- if ( !t ) {
- // Proxy was empty, so it's our responsibility to free it
- free_task<small_task>(tp);
- goto fail;
- }
- GATHER_STATISTIC( ++my_counters.proxies_stolen );
+ else if ( can_steal() && n > 1 ) {
+ // Try to steal a task from a random victim.
+ size_t k = my_random.get() % (n - 1);
+ arena_slot* victim = &my_arena->my_slots[k];
+ // The following condition excludes the master that might have
+ // already taken our previous place in the arena from the list .
+ // of potential victims. But since such a situation can take
+ // place only in case of significant oversubscription, keeping
+ // the checks simple seems to be preferable to complicating the code.
+ if( k >= my_arena_index )
+ ++victim; // Adjusts random distribution to exclude self
+ t = steal_task( *victim );
+ if( !t ) goto fail;
+ if( is_proxy(*t) ) {
+ task_proxy &tp = *(task_proxy*)t;
+ t = tp.extract_task<task_proxy::pool_bit>();
+ if ( !t ) {
+ // Proxy was empty, so it's our responsibility to free it
+ free_task<small_task>(tp);
+ goto fail;
}
- t->prefix().extra_state |= es_task_is_stolen;
- if( is_version_3_task(*t) ) {
- my_innermost_running_task = t;
- t->prefix().owner = this;
- t->note_affinity( my_affinity_id );
- }
- GATHER_STATISTIC( ++my_counters.steals_committed );
- } // end of stealing branch
- else
- goto fail;
- } // end of nonlocal retrieval branch
- else {
- // This is the only thread in this arena, so nowhere to steal
-#if __TBB_TASK_PRIORITY
- if ( !my_offloaded_tasks || !(t = reload_tasks()) )
-#endif /* __TBB_TASK_PRIORITY */
- goto fail;
- }
+ GATHER_STATISTIC( ++my_counters.proxies_stolen );
+ }
+ t->prefix().extra_state |= es_task_is_stolen;
+ if( is_version_3_task(*t) ) {
+ my_innermost_running_task = t;
+ t->prefix().owner = this;
+ t->note_affinity( my_affinity_id );
+ }
+ GATHER_STATISTIC( ++my_counters.steals_committed );
+ } // end of stealing branch
+ else
+ goto fail;
// A task was successfully obtained somewhere
__TBB_ASSERT(t,NULL);
#if __TBB_SCHEDULER_OBSERVER
- // No memory fence required for read of global_last_observer_proxy, because prior fence on steal/mailbox suffices.
- if( my_local_last_observer_proxy!=global_last_observer_proxy ) {
- notify_entry_observers();
- }
+ my_arena->my_observers.notify_entry_observers( my_last_local_observer, is_worker() );
+ the_global_observer_list.notify_entry_observers( my_last_global_observer, is_worker() );
#endif /* __TBB_SCHEDULER_OBSERVER */
if ( SchedulerTraits::itt_possible && failure_count != -1 ) {
// FIXME - might be victim, or might be selected from a mailbox
@@ -264,8 +266,13 @@ fail:
}
// Pause, even if we are going to yield, because the yield might return immediately.
__TBB_Pause(PauseTime);
- int yield_threshold = 2*int(n);
- if( failure_count>=yield_threshold ) {
+ const int failure_threshold = 2*int(n);
+ if( failure_count>=failure_threshold ) {
+#if __TBB_YIELD2P
+ failure_count = 0;
+#else
+ failure_count = failure_threshold;
+#endif
__TBB_Yield();
#if __TBB_TASK_PRIORITY
// Check if there are tasks abandoned by other workers
@@ -293,7 +300,8 @@ fail:
}
}
#endif /* __TBB_TASK_PRIORITY */
- if( failure_count>=yield_threshold+100 ) {
+ const int yield_threshold = 100;
+ if( yield_count++ >= yield_threshold ) {
// When a worker thread has nothing to do, return it to RML.
// For purposes of affinity support, the thread is considered idle while in RML.
#if __TBB_TASK_PRIORITY
@@ -323,7 +331,6 @@ fail:
}
}
#endif /* __TBB_TASK_PRIORITY */
- failure_count = yield_threshold;
} // end of arena snapshot branch
} // end of yielding branch
} // end of nonlocal task retrieval loop
@@ -363,8 +370,8 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
task* old_dispatching_task = my_dispatching_task;
my_dispatching_task = my_innermost_running_task;
if( master_outermost_level() ) {
- // We are in the outermost task dispatch loop of a master thread,
- __TBB_ASSERT( !is_worker(), NULL );
+ // We are in the outermost task dispatch loop of a master thread or a worker which mimics master
+ __TBB_ASSERT( !is_worker() || my_dispatching_task != old_dispatching_task, NULL );
quit_point = &parent == my_dummy_task ? all_local_work_done : parents_work_done;
} else {
quit_point = parents_work_done;
@@ -438,7 +445,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
#endif
{
GATHER_STATISTIC( ++my_counters.tasks_executed );
- GATHER_STATISTIC( my_counters.avg_arena_concurrency += my_arena->my_num_threads_active );
+ GATHER_STATISTIC( my_counters.avg_arena_concurrency += my_arena->num_workers_active() );
GATHER_STATISTIC( my_counters.avg_assigned_workers += my_arena->my_num_workers_allotted );
#if __TBB_TASK_PRIORITY
GATHER_STATISTIC( my_counters.avg_arena_prio += p );
@@ -474,6 +481,9 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
case task::recycle: // set by recycle_as_safe_continuation()
t->prefix().state = task::allocated;
+#if __TBB_RECYCLE_TO_ENQUEUE
+ case task::to_enqueue: // set by recycle_to_enqueue()
+#endif
__TBB_ASSERT( t_next != t, "a task returned from method execute() can not be recycled in another way" );
reset_extra_state(t);
// for safe continuation, need atomically decrement ref_count;
@@ -511,6 +521,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
if ( parent.prefix().ref_count == quit_point ) {
__TBB_ASSERT( quit_point != all_local_work_done, NULL );
__TBB_control_consistency_helper(); // on ref_count
+ ITT_NOTIFY(sync_acquired, &parent.prefix().ref_count);
goto done;
}
if ( in_arena() ) {
@@ -527,6 +538,13 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
#if __TBB_TASK_PRIORITY
stealing_ground:
#endif /* __TBB_TASK_PRIORITY */
+#if __TBB_HOARD_NONLOCAL_TASKS
+ // before stealing, previously stolen task objects are returned
+ for (; my_nonlocal_free_list; my_nonlocal_free_list = t ) {
+ t = my_nonlocal_free_list->prefix().next;
+ free_nonlocal_small_task( *my_nonlocal_free_list );
+ }
+#endif
if ( quit_point == all_local_work_done ) {
__TBB_ASSERT( !in_arena() && is_quiescent_local_task_pool_reset(), NULL );
my_innermost_running_task = my_dispatching_task;
@@ -544,7 +562,7 @@ stealing_ground:
// Dispatching task pointer is NULL *iff* this is a worker thread in its outermost
// dispatch loop (i.e. its execution stack is empty). In this case it should exit it
// either when there is no more work in the current arena, or when revoked by the market.
- t = receive_or_steal_task( parent.prefix().ref_count, !my_dispatching_task );
+ t = receive_or_steal_task( parent.prefix().ref_count, worker_outermost_level() );
if ( !t )
goto done;
__TBB_ASSERT(!is_proxy(*t),"unexpected proxy");
@@ -554,10 +572,14 @@ stealing_ground:
} // end of try-block
TbbCatchAll( t->prefix().context );
// Complete post-processing ...
- if( t->state() == task::recycle ) {
- // ... for tasks recycled with recycle_as_safe_continuation
+ if( t->state() == task::recycle
+#if __TBB_RECYCLE_TO_ENQUEUE
+ // TODO: the enqueue semantics gets lost below, consider reimplementing
+ || t->state() == task::to_enqueue
+#endif
+ ) {
+ // ... for recycled tasks to atomically decrement ref_count
t->prefix().state = task::allocated;
- // for safe continuation, need to atomically decrement ref_count;
if( SchedulerTraits::itt_possible )
ITT_NOTIFY(sync_releasing, &t->prefix().ref_count);
if( __TBB_FetchAndDecrementWrelease(&t->prefix().ref_count)==1 ) {
@@ -580,8 +602,13 @@ done:
if ( !ConcurrentWaitsEnabled(parent) ) {
if ( parent.prefix().ref_count != parents_work_done ) {
// This is a worker that was revoked by the market.
- __TBB_ASSERT( is_worker() && !my_dispatching_task,
+#if __TBB_TASK_ARENA
+ __TBB_ASSERT( worker_outermost_level(),
"Worker thread exits nested dispatch loop prematurely" );
+#else
+ __TBB_ASSERT( is_worker() && worker_outermost_level(),
+ "Worker thread exits nested dispatch loop prematurely" );
+#endif
return;
}
parent.prefix().ref_count = 0;
diff --git a/src/tbb/dynamic_link.cpp b/src/tbb/dynamic_link.cpp
index 25698fd..32e9243 100644
--- a/src/tbb/dynamic_link.cpp
+++ b/src/tbb/dynamic_link.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -27,6 +27,7 @@
*/
#include "dynamic_link.h"
+#include "tbb/tbb_config.h"
/*
This file is used by both TBB and OpenMP RTL. Do not use __TBB_ASSERT() macro
@@ -34,42 +35,104 @@
LIBRARY_ASSERT and DYNAMIC_LINK_WARNING instead.
*/
-#ifndef LIBRARY_ASSERT
- #include "tbb/tbb_stddef.h"
- #define LIBRARY_ASSERT(x,y) __TBB_ASSERT(x,y)
-#endif /* !LIBRARY_ASSERT */
-
#include <cstdarg> // va_list etc.
-#if _WIN32||_WIN64
- #include <malloc.h> /* alloca */
-#else
+#if _WIN32
+ #include <malloc.h>
+
+ // Unify system calls
+ #define dlopen( name, flags ) LoadLibrary( name )
+ #define dlsym( handle, name ) GetProcAddress( handle, name )
+ #define dlclose( handle ) ( ! FreeLibrary( handle ) )
+ #define dlerror() GetLastError()
+#ifndef PATH_MAX
+ #define PATH_MAX MAX_PATH
+#endif
+#else /* _WIN32 */
#include <dlfcn.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>
-#if __FreeBSD__ || __NetBSD__
- #include <stdlib.h> /* alloca */
-#else
- #include <alloca.h>
-#endif
-#endif
+ #include <stdlib.h>
+#endif /* _WIN32 */
+
+#if __TBB_WEAK_SYMBOLS_PRESENT
+ //TODO: use function attribute for weak symbols instead of the pragma.
+ #pragma weak dlopen
+ #pragma weak dlsym
+ #pragma weak dlclose
+ #pragma weak dlerror
+ #pragma weak dladdr
+#endif /* __TBB_WEAK_SYMBOLS_PRESENT */
+
+#include "tbb/tbb_misc.h"
-#ifdef __TBB_BUILD
-#include "tbb/atomic.h"
-#endif /* __TBB_BUILD */
+#define __USE_TBB_ATOMICS ( !(__linux__&&__ia64__) || __TBB_BUILD )
+
+#if !__USE_TBB_ATOMICS
+#include <pthread.h>
+#endif
OPEN_INTERNAL_NAMESPACE
-#if !defined(DYNAMIC_LINK_WARNING) && __TBB_DYNAMIC_LOAD_ENABLED
+#if __TBB_WEAK_SYMBOLS_PRESENT || __TBB_DYNAMIC_LOAD_ENABLED
+
+#if !defined(DYNAMIC_LINK_WARNING)
// Report runtime errors and continue.
#define DYNAMIC_LINK_WARNING dynamic_link_warning
static void dynamic_link_warning( dynamic_link_error_t code, ... ) {
(void) code;
} // library_warning
#endif /* DYNAMIC_LINK_WARNING */
+ static bool resolve_symbols( dynamic_link_handle module, const dynamic_link_descriptor descriptors[], size_t required )
+ {
+ LIBRARY_ASSERT( module != NULL, "Module handle is NULL" );
+ if ( module == NULL )
+ return false;
+
+ #if __TBB_WEAK_SYMBOLS_PRESENT
+ if ( !dlsym ) return false;
+ #endif /* __TBB_WEAK_SYMBOLS_PRESENT */
-#if __TBB_DYNAMIC_LOAD_ENABLED
-#if _WIN32 || _WIN64
+ const size_t n_desc=20; // Usually we don't have more than 20 descriptors per library
+ LIBRARY_ASSERT( required <= n_desc, "Too many descriptors is required" );
+ if ( required > n_desc ) return false;
+ pointer_to_handler h[n_desc];
+
+ for ( size_t k = 0; k < required; ++k ) {
+ dynamic_link_descriptor const & desc = descriptors[k];
+ pointer_to_handler addr = (pointer_to_handler)dlsym( module, desc.name );
+ if ( !addr ) {
+ DYNAMIC_LINK_WARNING( dl_sym_not_found, desc.name, dlerror() );
+ return false;
+ }
+ h[k] = addr;
+ }
+
+ // Commit the entry points.
+ // Cannot use memset here, because the writes must be atomic.
+ for( size_t k = 0; k < required; ++k )
+ *descriptors[k].handler = h[k];
+ return true;
+ }
+
+#if __TBB_WIN8UI_SUPPORT
+ bool dynamic_link( const char* library, const dynamic_link_descriptor descriptors[], size_t required, dynamic_link_handle*, int flags ) {
+ dynamic_link_handle tmp_handle = NULL;
+ TCHAR wlibrary[256];
+ if ( MultiByteToWideChar(CP_UTF8, 0, library, -1, wlibrary, 255) == 0 ) return false;
+ if ( flags & DYNAMIC_LINK_LOAD )
+ tmp_handle = LoadPackagedLibrary( wlibrary, 0 );
+ if (tmp_handle != NULL){
+ return resolve_symbols(tmp_handle, descriptors, required);
+ }else{
+ return false;
+ }
+ }
+ void dynamic_unlink( dynamic_link_handle ) {
+ }
+ void dynamic_unlink_all() {
+ }
+#else
/*
There is a security issue on Windows: LoadLibrary() may load and execute malicious code.
See http://www.microsoft.com/technet/security/advisory/2269637.mspx for details.
@@ -85,404 +148,370 @@ OPEN_INTERNAL_NAMESPACE
absolute path of tbb library is "c:\program files\common\intel\tbb.dll". Absolute path for
"tbbmalloc.dll" would be "c:\program files\common\intel\tbbmalloc.dll". Absolute path for
"malloc\tbbmalloc.dll" would be "c:\program files\common\intel\malloc\tbbmalloc.dll".
-
- Arguments:
- in name -- Name of a file (may be with relative path; it must not be an absolute one).
- out path -- Buffer to save result (absolute path) to.
- in len -- Size of buffer.
- ret -- 0 -- Error occurred.
- > len -- Buffer too short, required size returned.
- otherwise -- Ok, number of characters (not counting terminating null) written to
- buffer.
*/
-static size_t abs_path( char const * name, char * path, size_t len ) {
- // Get handle of our DLL first.
- HMODULE handle;
- BOOL brc =
- GetModuleHandleEx(
- GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
- (LPCSTR)( & abs_path ),
- & handle
- );
- if ( ! brc ) { // Error occurred.
- int err = GetLastError();
- DYNAMIC_LINK_WARNING( dl_sys_fail, "GetModuleHandleEx", err );
- return 0;
- } // if
-
- // Now get path to our DLL.
- DWORD drc = GetModuleFileName( handle, path, static_cast< DWORD >( len ) );
- if ( drc == 0 ) { // Error occurred.
- int err = GetLastError();
- DYNAMIC_LINK_WARNING( dl_sys_fail, "GetModuleFileName", err );
- return drc;
- } // if
- if ( drc >= len ) { // Buffer too short.
- DYNAMIC_LINK_WARNING( dl_buff_too_small );
- return drc;
- } // if
-
- // Find the position of the last backslash.
- char * backslash = path + drc; // backslash points behind the path.
- LIBRARY_ASSERT( * backslash == 0, NULL );
- while ( backslash > path && * backslash != '\\' ) {
- -- backslash;
- } // while
- if ( backslash <= path ) { // Backslash not found.
- return 0; // Unbelievable.
- } // if
-
- // Now append name to construct the full path.
- LIBRARY_ASSERT( * backslash == '\\', NULL );
- size_t rc = ( backslash + 1 - path ) + strlen( name );
- if ( rc >= len ) {
- DYNAMIC_LINK_WARNING( dl_buff_too_small );
- return rc + 1;
- } // if
- strcpy( backslash + 1, name );
- LIBRARY_ASSERT( rc == strlen( path ), NULL );
- return rc;
-} // abs_path
-#else /* WIN */
- class _abs_path {
- char _path[PATH_MAX+1];
- size_t _len;
- enum {
- ap_invalid = 0,
- ap_only_cwd,
- ap_ready
- } _state;
-
- bool prepare_full_path() {
- LIBRARY_ASSERT( _state==ap_only_cwd, NULL );
-
- Dl_info dlinfo;
- int res = dladdr( (void*)&dynamic_unlink, &dlinfo );
- if ( !res ) {
- char const * err = dlerror();
- DYNAMIC_LINK_WARNING( dl_sys_fail, "dladdr", err );
- return false;
- }
-
- size_t fname_len = strlen( dlinfo.dli_fname );
- // Find the position of the last backslash.
- while ( fname_len>0 && dlinfo.dli_fname[fname_len-1]!='/' ) fname_len-=1;
-
- size_t rc;
-
- if ( dlinfo.dli_fname[0]=='/' ) {
- rc = 0;
- _len = fname_len;
- } else {
- rc = _len;
- _len += fname_len;
- }
- if ( fname_len>0 ) {
- if ( _len>PATH_MAX ) {
- DYNAMIC_LINK_WARNING( dl_buff_too_small );
- return false;
- }
- memcpy( _path+rc, dlinfo.dli_fname, fname_len*sizeof(char) );
- _path[_len]=0;
- }
-
- return true;
- }
- public:
- _abs_path() {
- if ( getcwd( _path, PATH_MAX+1 ) ) {
- _state = ap_only_cwd;
- _len = strlen( _path );
- _path[_len++]='/';
- } else {
- DYNAMIC_LINK_WARNING( dl_buff_too_small );
- _state = ap_invalid;
- }
+ // Struct handle_storage is used by dynamic_link routine to store handles of
+ // all loaded or pinned dynamic libraries. When TBB is shut down, it calls
+ // dynamic_unlink_all() that unloads modules referenced by handle_storage.
+ // This struct should not have any constructors since it may be used before
+ // the constructor is called.
+ #define MAX_LOADED_MODULES 8 // The number of maximum possible modules which can be loaded
+
+ struct handle_storage {
+ #if __USE_TBB_ATOMICS
+ ::tbb::atomic<size_t> my_size;
+ #else
+ size_t my_size;
+ pthread_spinlock_t my_lock;
+ #endif
+ dynamic_link_handle my_handles[MAX_LOADED_MODULES];
+
+ void add_handle(const dynamic_link_handle &handle) {
+ #if !__USE_TBB_ATOMICS
+ int res = pthread_spin_lock( &my_lock );
+ LIBRARY_ASSERT( res==0, "pthread_spin_lock failed" );
+ #endif
+ const size_t ind = my_size++;
+ #if !__USE_TBB_ATOMICS
+ res = pthread_spin_unlock( &my_lock );
+ LIBRARY_ASSERT( res==0, "pthread_spin_unlock failed" );
+ #endif
+ LIBRARY_ASSERT( ind < MAX_LOADED_MODULES, "Too many modules are loaded" );
+ my_handles[ind] = handle;
}
- /*
- The function constructs absolute path for given relative path. Important: Base directory is not
- current one, it is the directory libtbb.so loaded from.
-
- Arguments:
- in name -- Name of a file (may be with relative path; it must not be an absolute one).
- out path -- Buffer to save result (absolute path) to.
- in len -- Size of buffer.
- ret -- 0 -- Error occured.
- > len -- Buffer too short, required size returned.
- otherwise -- Ok, number of characters (not counting terminating null) written to
- buffer.
- */
- size_t operator ()( char const * name, char * path, size_t len ) {
- switch ( _state ) {
- case ap_only_cwd:
- if ( !prepare_full_path() ) {
- _state = ap_invalid;
- return 0;
- }
- _state = ap_ready;
- // 'break' is missed since we really want to do next case.
- case ap_ready: {
- size_t name_len = strlen( name );
- size_t full_len = name_len+_len;
- if ( full_len+_len < len ) {
- memcpy( path, _path, _len );
- memcpy( path+_len, name, name_len );
- path[full_len] = 0;
- }
- return full_len;
- }
- default:
- return 0;
- }
+ void free_handles() {
+ const size_t size = my_size;
+ for (size_t i=0; i<size; ++i)
+ dynamic_unlink( my_handles[i] );
}
-
};
-_abs_path abs_path;
-#endif /* WIN */
-#endif /* __TBB_DYNAMIC_LOAD_ENABLED */
-
-#if __TBB_WEAK_SYMBOLS
-
-bool dynamic_link( dynamic_link_handle, const dynamic_link_descriptor descriptors[], size_t n, size_t required )
-{
- if ( required == ~(size_t)0 )
- required = n;
- LIBRARY_ASSERT( required<=n, "Number of required entry points exceeds their total number" );
- size_t k = 0;
- // Check if the first required entries are present in what was loaded into our process
- while ( k < required && descriptors[k].ptr )
- ++k;
- if ( k < required )
- return false;
- // Commit all the entry points.
- for ( k = 0; k < n; ++k )
- *descriptors[k].handler = (pointer_to_handler) descriptors[k].ptr;
- return true;
-}
-
-#else /* !__TBB_WEAK_SYMBOLS */
-
-bool dynamic_link( dynamic_link_handle module, const dynamic_link_descriptor descriptors[], size_t n, size_t required )
-{
- LIBRARY_ASSERT( module != NULL, "Module handle is NULL" );
- if ( module == NULL ) {
- return false;
- } // if
- pointer_to_handler *h = (pointer_to_handler*)alloca(n * sizeof(pointer_to_handler));
- if ( required == ~(size_t)0 )
- required = n;
- LIBRARY_ASSERT( required<=n, "Number of required entry points exceeds their total number" );
- size_t k = 0;
- for ( ; k < n; ++k ) {
- dynamic_link_descriptor const & desc = descriptors[k];
-#if _WIN32||_WIN64
- FARPROC addr = GetProcAddress( module, desc.name );
- if ( addr == NULL ) {
- int err = GetLastError();
- DYNAMIC_LINK_WARNING( dl_sym_not_found, desc.name, err );
- } // if
- h[k] = pointer_to_handler( addr );
-#else /* !WIN */
- void * addr = dlsym( module, desc.name );
- if ( addr == NULL ) {
- char const * err = dlerror();
- DYNAMIC_LINK_WARNING( dl_sym_not_found, desc.name, err );
- } // if
- // Lvalue casting is used; this way icc -strict-ansi does not warn about nonstandard pointer conversion
- (void *&)h[k] = addr;
-#endif /* !WIN */
- if ( !h[k] && k < required )
- return false;
+ handle_storage handles;
+
+#if __USE_TBB_ATOMICS
+ static void atomic_once ( void (*func) (void), tbb::atomic< tbb::internal::do_once_state > &once_state ) {
+ tbb::internal::atomic_do_once( func, once_state );
}
- LIBRARY_ASSERT( k == n, "if required entries are initialized, all entries are expected to be walked");
- // Commit the entry points.
- // Cannot use memset here, because the writes must be atomic.
- for( k = 0; k < n; ++k )
- *descriptors[k].handler = h[k];
- return true;
-}
-
-#endif /* !__TBB_WEAK_SYMBOLS */
-
-void dynamic_unlink( dynamic_link_handle handle ) {
- if ( handle ) {
-#if __TBB_DYNAMIC_LOAD_ENABLED
-#if _WIN32||_WIN64
- FreeLibrary( handle );
+#define ATOMIC_ONCE_DECL( var ) tbb::atomic< tbb::internal::do_once_state > var
#else
- dlclose( handle );
-#endif
- (void)handle;
-#endif /* __TBB_DYNAMIC_LOAD_ENABLED */
+ static void atomic_once ( void (*func) (), pthread_once_t &once_state ) {
+ pthread_once( &once_state, func );
}
-}
+#define ATOMIC_ONCE_DECL( var ) pthread_once_t var = PTHREAD_ONCE_INIT
+#endif
-#if __TBB_BUILD
+ ATOMIC_ONCE_DECL( init_dl_data_state );
-// Class handle_storage is used by dynamic_link routine to store handles of
-// all loaded or pinned dynamic libraries. When TBB is shut down, it calls
-// dynamic_unlink_all() that unloads modules referenced by handle_storage.
-// This functionality is only used by TBB. It should not be used by other
-// libraries reusing this source file to avoid dependency on tbb::atomic<>.
+ static struct _ap_data {
+ char _path[PATH_MAX+1];
+ size_t _len;
+ } ap_data;
-#define MAX_LOADED_MODULES 8 // The number of maximum possible modules which can be loaded
+ static void init_ap_data() {
+ #if _WIN32
+ // Get handle of our DLL first.
+ HMODULE handle;
+ BOOL brc = GetModuleHandleEx(
+ GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
+ (LPCSTR)( & dynamic_link ), // any function inside the library can be used for the address
+ & handle
+ );
+ if ( !brc ) { // Error occurred.
+ int err = GetLastError();
+ DYNAMIC_LINK_WARNING( dl_sys_fail, "GetModuleHandleEx", err );
+ return;
+ }
+ // Now get path to our DLL.
+ DWORD drc = GetModuleFileName( handle, ap_data._path, static_cast< DWORD >( PATH_MAX ) );
+ if ( drc == 0 ) { // Error occurred.
+ int err = GetLastError();
+ DYNAMIC_LINK_WARNING( dl_sys_fail, "GetModuleFileName", err );
+ return;
+ }
+ if ( drc >= PATH_MAX ) { // Buffer too short.
+ DYNAMIC_LINK_WARNING( dl_buff_too_small );
+ return;
+ }
+ // Find the position of the last backslash.
+ char *backslash = strrchr( ap_data._path, '\\' );
-class handle_storage {
- tbb::atomic<size_t> my_size;
- dynamic_link_handle my_handles[MAX_LOADED_MODULES];
-public:
+ if ( !backslash ) { // Backslash not found.
+ LIBRARY_ASSERT( backslash!=NULL, "Unbelievable.");
+ return;
+ }
+ LIBRARY_ASSERT( backslash >= ap_data._path, "Unbelievable.");
+ ap_data._len = (size_t)(backslash - ap_data._path) + 1;
+ *(backslash+1) = 0;
+ #else
+ // Get the library path
+ #if __TBB_WEAK_SYMBOLS_PRESENT
+ if ( !dladdr || !dlerror ) return;
+ #endif /* __TBB_WEAK_SYMBOLS_PRESENT */
+ Dl_info dlinfo;
+ int res = dladdr( (void*)&dynamic_link, &dlinfo ); // any function inside the library can be used for the address
+ if ( !res ) {
+ char const * err = dlerror();
+ DYNAMIC_LINK_WARNING( dl_sys_fail, "dladdr", err );
+ return;
+ } else {
+ LIBRARY_ASSERT( dlinfo.dli_fname!=NULL, "Unbelievable." );
+ }
- handle_storage() {
- my_size = 0;
- }
+ char const *slash = strrchr( dlinfo.dli_fname, '/' );
+ size_t fname_len=0;
+ if ( slash ) {
+ LIBRARY_ASSERT( slash >= dlinfo.dli_fname, "Unbelievable.");
+ fname_len = (size_t)(slash - dlinfo.dli_fname) + 1;
+ }
+
+ size_t rc;
+ if ( dlinfo.dli_fname[0]=='/' ) {
+ // The library path is absolute
+ rc = 0;
+ ap_data._len = 0;
+ } else {
+ // The library path is relative so get the current working directory
+ if ( !getcwd( ap_data._path, sizeof(ap_data._path)/sizeof(ap_data._path[0]) ) ) {
+ DYNAMIC_LINK_WARNING( dl_buff_too_small );
+ return;
+ }
+ ap_data._len = strlen( ap_data._path );
+ ap_data._path[ap_data._len++]='/';
+ rc = ap_data._len;
+ }
- void add_handle(dynamic_link_handle &handle) {
- const size_t ind = my_size++;
- LIBRARY_ASSERT( ind < MAX_LOADED_MODULES, "Too many modules are loaded" );
- my_handles[ind] = handle;
+ if ( fname_len>0 ) {
+ if ( ap_data._len>PATH_MAX ) {
+ DYNAMIC_LINK_WARNING( dl_buff_too_small );
+ ap_data._len=0;
+ return;
+ }
+ strncpy( ap_data._path+rc, dlinfo.dli_fname, fname_len );
+ ap_data._len += fname_len;
+ ap_data._path[ap_data._len]=0;
+ }
+ #endif /* _WIN32 */
}
- void free_handles() {
- const size_t size = my_size.fetch_and_store( 0 );
- for (size_t i=0; i<size; ++i)
- dynamic_unlink( my_handles[i] );
+ static void init_dl_data() {
+ init_ap_data();
+ #if !__USE_TBB_ATOMICS
+ int res;
+ res = pthread_spin_init( &handles.my_lock, PTHREAD_PROCESS_SHARED );
+ LIBRARY_ASSERT( res==0, "pthread_spin_init failed" );
+ #endif
}
-} handles;
-#endif /* __TBB_BUILD */
+ // ap_data structure is initialized with current directory on Linux.
+ // So it should be initialized as soon as possible since the current directory may be changed.
+ // static_init_ap_data object provides this initialization during library loading.
+ static class _static_init_dl_data {
+ public:
+ _static_init_dl_data() {
+ atomic_once( &init_dl_data, init_dl_data_state );
+ }
+ #if !__USE_TBB_ATOMICS
+ ~_static_init_dl_data() {
+ int res;
+ res = pthread_spin_destroy( &handles.my_lock );
+ LIBRARY_ASSERT( res==0, "pthread_spin_destroy failed" );
+ }
+ #endif
+ } static_init_dl_data;
-bool dynamic_link( const char* library, const dynamic_link_descriptor descriptors[], size_t n, size_t required, dynamic_link_handle *handle ) {
- // Get library handle in case it is already loaded into the current process
-#if ! __TBB_DYNAMIC_LOAD_ENABLED
- dynamic_link_handle library_handle = NULL;
- __TBB_ASSERT_EX( library, "library name must be provided");
-#elif _WIN32||_WIN64
- dynamic_link_handle library_handle = GetModuleHandle( library );
-#else
- dynamic_link_handle library_handle = dlopen( NULL, RTLD_LAZY );
-#endif /* _WIN32||_WIN64 */
+ /*
+ The function constructs absolute path for given relative path. Important: Base directory is not
+ current one, it is the directory libtbb.so loaded from.
- // Get descriptors from the library
- if ( library_handle && dynamic_link( library_handle, descriptors, n, required ) ) {
-#if !__TBB_DYNAMIC_LOAD_ENABLED
+ Arguments:
+ in name -- Name of a file (may be with relative path; it must not be an absolute one).
+ out path -- Buffer to save result (absolute path) to.
+ in len -- Size of buffer.
+ ret -- 0 -- Error occurred.
+ > len -- Buffer too short, required size returned.
+ otherwise -- Ok, number of characters (not counting terminating null) written to
+ buffer.
+ */
+ #if __TBB_DYNAMIC_LOAD_ENABLED
+ static size_t abs_path( char const * name, char * path, size_t len ) {
+ atomic_once( &init_dl_data, init_dl_data_state );
+
+ if ( !ap_data._len )
+ return 0;
+
+ size_t name_len = strlen( name );
+ size_t full_len = name_len+ap_data._len;
+ if ( full_len < len ) {
+ strncpy( path, ap_data._path, ap_data._len );
+ strncpy( path+ap_data._len, name, name_len );
+ path[full_len] = 0;
+ }
+ return full_len;
+ }
+ #endif // __TBB_DYNAMIC_LOAD_ENABLED
+
+ #if __TBB_WEAK_SYMBOLS_PRESENT
+ static bool weak_symbol_link( const dynamic_link_descriptor descriptors[], size_t required )
+ {
+ // Check if the required entries are present in what was loaded into our process.
+ for ( size_t k = 0; k < required; ++k )
+ if ( !descriptors[k].ptr )
+ return false;
+ // Commit the entry points.
+ for ( size_t k = 0; k < required; ++k )
+ *descriptors[k].handler = (pointer_to_handler) descriptors[k].ptr;
return true;
-#else
- // The library has been loaded by another module and contains requested symbols.
- // But after we obtained the library's handle it can be unloaded by another thread
- // invalidating our handle copy. Therefore we need to pin the library in memory.
-#if _WIN32||_WIN64
- char library_full_name[ MAX_PATH+1 ];
- // Get library's name from earlier found handle
- if ( GetModuleFileName( library_handle, library_full_name, MAX_PATH+1 ) ) {
- // Pin the library
- library_handle = LoadLibrary( library_full_name );
- if ( library_handle == NULL ) {
- int err = GetLastError();
- DYNAMIC_LINK_WARNING( dl_lib_not_found, library_full_name, err );
- } // if
- } // if
-#else /* !WIN */
+ }
+ #else
+ static bool weak_symbol_link( const dynamic_link_descriptor[], size_t ) {
+ return false;
+ }
+ #endif /* __TBB_WEAK_SYMBOLS_PRESENT */
+
+ void dynamic_unlink( dynamic_link_handle handle ) {
+ if ( handle ) {
+ #if __TBB_WEAK_SYMBOLS_PRESENT
+ LIBRARY_ASSERT( dlclose != NULL, "dlopen is present but dlclose is NOT present!?" );
+ #endif /* __TBB_WEAK_SYMBOLS_PRESENT */
+ #if __TBB_DYNAMIC_LOAD_ENABLED
+ dlclose( handle );
+ #endif /* __TBB_DYNAMIC_LOAD_ENABLED */
+ }
+ }
+
+ void dynamic_unlink_all() {
+ handles.free_handles();
+ }
+
+ #if !_WIN32
+ // It is supposed that all symbols are from the only one library
+ static dynamic_link_handle pin_symbols( dynamic_link_descriptor desc, const dynamic_link_descriptor descriptors[], size_t required ) {
+ // The library has been loaded by another module and contains at least one requested symbol.
+ // But after we obtained the symbol the library can be unloaded by another thread
+ // invalidating our symbol. Therefore we need to pin the library in memory.
+ dynamic_link_handle library_handle;
Dl_info info;
// Get library's name from earlier found symbol
- if ( dladdr( (void*)*descriptors[0].handler, &info ) ) {
+ if ( dladdr( (void*)*desc.handler, &info ) ) {
// Pin the library
library_handle = dlopen( info.dli_fname, RTLD_LAZY );
- if ( library_handle == NULL ) {
+ if ( library_handle ) {
+ // If original library was unloaded before we pinned it
+ // and then another module loaded in its place, the earlier
+ // found symbol would become invalid. So revalidate them.
+ if ( !resolve_symbols( library_handle, descriptors, required ) ) {
+ // Wrong library.
+ dynamic_unlink(library_handle);
+ library_handle = 0;
+ }
+ } else {
char const * err = dlerror();
DYNAMIC_LINK_WARNING( dl_lib_not_found, info.dli_fname, err );
- } // if
- } // if
-#endif /* !WIN */
+ }
+ }
else {
// The library have been unloaded by another thread
library_handle = 0;
}
- if ( library_handle ) {
- // If original library was unloaded before we pinned it
- // and then another module loaded in its place, the earlier
- // found symbols would become invalid. So revalidate them.
- if ( !dynamic_link( library_handle, descriptors, n, required ) ) {
- // Wrong library.
- dynamic_unlink(library_handle);
- library_handle = 0;
- }
- }
- if ( !library_handle ) {
- // Failed to pin the library, so clear the descriptors too.
- for( size_t i=0; i<n; ++i )
- *descriptors[i].handler = 0;
+ return library_handle;
+ }
+ #endif /* _WIN32 */
+
+ static dynamic_link_handle global_symbols_link( const char* library, const dynamic_link_descriptor descriptors[], size_t required ) {
+ #if _WIN32
+ dynamic_link_handle library_handle;
+ if ( GetModuleHandleEx( 0, library, &library_handle ) ) {
+ if ( resolve_symbols( library_handle, descriptors, required ) )
+ return library_handle;
+ else
+ FreeLibrary( library_handle );
}
-#endif /* __TBB_DYNAMIC_LOAD_ENABLED */
- } else {
- library_handle = 0;
+ #else /* _WIN32 */
+ #if __TBB_WEAK_SYMBOLS_PRESENT
+ if ( !dlopen ) return 0;
+ #endif /* __TBB_WEAK_SYMBOLS_PRESENT */
+ dynamic_link_handle library_handle = dlopen( NULL, RTLD_LAZY );
+ // Check existence of only the first symbol, then use it to find the library and load all necessary symbols
+ dynamic_link_descriptor desc = descriptors[0];
+ if ( resolve_symbols( library_handle, &desc, 1 ) )
+ return pin_symbols( desc, descriptors, required );
+ #endif /* _WIN32 */
+ return 0;
}
-#if __TBB_DYNAMIC_LOAD_ENABLED
- if ( !library_handle ) {
-#if _WIN32||_WIN64
-#if _XBOX
- library_handle = LoadLibrary (library);
-#else
- library_handle = NULL;
- // Construct absolute path to the library to avoid security issue.
- size_t const len = MAX_PATH + 1;
+ static void save_library_handle( dynamic_link_handle src, dynamic_link_handle *dst ) {
+ if ( dst )
+ *dst = src;
+ else
+ handles.add_handle( src );
+ }
+
+ dynamic_link_handle dynamic_load( const char* library, const dynamic_link_descriptor descriptors[], size_t required ) {
+ #if __TBB_DYNAMIC_LOAD_ENABLED
+ #if _XBOX
+ return LoadLibrary (library);
+ #else /* _XBOX */
+ size_t const len = PATH_MAX + 1;
char path[ len ];
size_t rc = abs_path( library, path, len );
if ( 0 < rc && rc < len ) {
+ #if _WIN32
// Prevent Windows from displaying silly message boxes if it fails to load library
// (e.g. because of MS runtime problems - one of those crazy manifest related ones)
UINT prev_mode = SetErrorMode (SEM_FAILCRITICALERRORS);
- library_handle = LoadLibrary (path);
+ #endif /* _WIN32 */
+ #if __TBB_WEAK_SYMBOLS_PRESENT
+ if ( !dlopen ) return 0;
+ #endif /* __TBB_WEAK_SYMBOLS_PRESENT */
+ dynamic_link_handle library_handle = dlopen( path, RTLD_LAZY );
+ #if _WIN32
SetErrorMode (prev_mode);
- if ( library_handle == NULL ) {
- int err = GetLastError();
- DYNAMIC_LINK_WARNING( dl_lib_not_found, path, err );
- } // if
- } // if
-#endif /* !_XBOX */
-#else /* !WIN */
- library_handle = NULL;
- // Construct absolute path to the library.
- size_t const len = PATH_MAX + 1;
- char path[ len ];
- size_t rc = abs_path( library, path, len );
- if ( 0 < rc && rc < len ) {
- library_handle = dlopen( path, RTLD_LAZY );
- if ( library_handle == NULL ) {
- char const * err = dlerror();
- DYNAMIC_LINK_WARNING( dl_lib_not_found, library, err );
- } // if
- } // if
-#endif /* !WIN */
- if( library_handle ) {
- if( !dynamic_link( library_handle, descriptors, n, required ) ) {
- // The loaded library does not contain all the expected entry points
- dynamic_unlink( library_handle );
- library_handle = NULL;
- }
- }
+ #endif /* _WIN32 */
+ if( library_handle ) {
+ if( !resolve_symbols( library_handle, descriptors, required ) ) {
+ // The loaded library does not contain all the expected entry points
+ dynamic_unlink( library_handle );
+ library_handle = NULL;
+ }
+ } else
+ DYNAMIC_LINK_WARNING( dl_lib_not_found, path, dlerror() );
+ return library_handle;
+ } else if ( rc>=len )
+ DYNAMIC_LINK_WARNING( dl_buff_too_small );
+ // rc == 0 means failing of init_ap_data so the warning has already been issued.
+ #endif /* _XBOX */
+ #endif /* __TBB_DYNAMIC_LOAD_ENABLED */
+ return 0;
}
-#endif /* __TBB_DYNAMIC_LOAD_ENABLED */
- if ( library_handle ) {
- if ( handle )
- *handle = library_handle;
-#if __TBB_BUILD
- else
- handles.add_handle( library_handle );
-#endif /* __TBB_BUILD */
+ bool dynamic_link( const char* library, const dynamic_link_descriptor descriptors[], size_t required, dynamic_link_handle *handle, int flags ) {
+ // TODO: May global_symbols_link find weak symbols?
+ dynamic_link_handle library_handle = ( flags & DYNAMIC_LINK_GLOBAL ) ? global_symbols_link( library, descriptors, required ) : 0;
+
+ if ( !library_handle && ( flags & DYNAMIC_LINK_LOAD ) )
+ library_handle = dynamic_load( library, descriptors, required );
+
+ if ( !library_handle && ( flags & DYNAMIC_LINK_WEAK ) )
+ return weak_symbol_link( descriptors, required );
+
+ save_library_handle( library_handle, handle );
return true;
}
- return false;
-}
-
-#if __TBB_BUILD
-void dynamic_unlink_all() {
- handles.free_handles();
-}
-#endif /* __TBB_BUILD */
+
+#endif /*__TBB_WIN8UI_SUPPORT*/
+#else /* __TBB_WEAK_SYMBOLS_PRESENT || __TBB_DYNAMIC_LOAD_ENABLED */
+ bool dynamic_link( const char*, const dynamic_link_descriptor*, size_t, dynamic_link_handle *handle, int ) {
+ if ( handle )
+ *handle=0;
+ return false;
+ }
+
+ void dynamic_unlink( dynamic_link_handle ) {
+ }
+
+ void dynamic_unlink_all() {
+ }
+#endif /* __TBB_WEAK_SYMBOLS_PRESENT || __TBB_DYNAMIC_LOAD_ENABLED */
CLOSE_INTERNAL_NAMESPACE
diff --git a/src/tbb/dynamic_link.h b/src/tbb/dynamic_link.h
index fb69cd6..00d7618 100644
--- a/src/tbb/dynamic_link.h
+++ b/src/tbb/dynamic_link.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -31,8 +31,10 @@
// Support for dynamic loading entry points from other shared libraries.
+#include "tbb/tbb_stddef.h"
+
#ifndef LIBRARY_ASSERT
- #include "tbb/tbb_config.h"
+ #define LIBRARY_ASSERT(x,y) __TBB_ASSERT_EX(x,y)
#endif /* !LIBRARY_ASSERT */
/** By default, symbols declared and defined here go into namespace tbb::internal.
@@ -44,70 +46,66 @@
#endif /* OPEN_INTERNAL_NAMESPACE */
#include <stddef.h>
-#if _WIN32||_WIN64
+#if _WIN32
#include "tbb/machine/windows_api.h"
-#endif /* _WIN32||_WIN64 */
+#endif /* _WIN32 */
OPEN_INTERNAL_NAMESPACE
//! Type definition for a pointer to a void somefunc(void)
typedef void (*pointer_to_handler)();
-// Double cast through the void* from func_ptr in DLD macro is necessary to
+//! The helper to construct dynamic_link_descriptor structure
+// Double cast through the void* in DLD macro is necessary to
// prevent warnings from some compilers (g++ 4.1)
-#if __TBB_WEAK_SYMBOLS
-
-#define DLD(s,h) {(pointer_to_handler)&s, (pointer_to_handler*)(void*)(&h)}
-//! Association between a handler name and location of pointer to it.
-struct dynamic_link_descriptor {
- //! pointer to the handler
- pointer_to_handler ptr;
- //! Pointer to the handler
- pointer_to_handler* handler;
-};
-
-#else /* !__TBB_WEAK_SYMBOLS */
-
+#if __TBB_WEAK_SYMBOLS_PRESENT
+#define DLD(s,h) {#s, (pointer_to_handler*)(void*)(&h), (pointer_to_handler)&s}
+#else
#define DLD(s,h) {#s, (pointer_to_handler*)(void*)(&h)}
+#endif /* __TBB_WEAK_SYMBOLS_PRESENT */
//! Association between a handler name and location of pointer to it.
struct dynamic_link_descriptor {
//! Name of the handler
const char* name;
//! Pointer to the handler
pointer_to_handler* handler;
+#if __TBB_WEAK_SYMBOLS_PRESENT
+ //! Weak symbol
+ pointer_to_handler ptr;
+#endif
};
-#endif /* !__TBB_WEAK_SYMBOLS */
-
-#if _WIN32||_WIN64
+#if _WIN32
typedef HMODULE dynamic_link_handle;
#else
typedef void* dynamic_link_handle;
-#endif /* _WIN32||_WIN64 */
+#endif /* _WIN32 */
+
+const int DYNAMIC_LINK_GLOBAL = 0x01;
+const int DYNAMIC_LINK_LOAD = 0x02;
+const int DYNAMIC_LINK_WEAK = 0x04;
+const int DYNAMIC_LINK_ALL = DYNAMIC_LINK_GLOBAL | DYNAMIC_LINK_LOAD | DYNAMIC_LINK_WEAK;
//! Fill in dynamically linked handlers.
-/** 'n' is the length of the array descriptors[].
- 'required' is the number of the initial entries in the array descriptors[]
+/** 'required' is the number of the initial entries in the array descriptors[]
that have to be found in order for the call to succeed. If the library and
all the required handlers are found, then the corresponding handler pointers
are set, and the return value is true. Otherwise the original array of
- descriptors is left untouched and the return value is false. **/
-bool dynamic_link( const char* libraryname,
- const dynamic_link_descriptor descriptors[],
- size_t n,
- size_t required = ~(size_t)0,
- dynamic_link_handle* handle = 0 );
-
-bool dynamic_link( dynamic_link_handle module,
+ descriptors is left untouched and the return value is false. 'required' is
+ limited by 20 (exceeding of this value will result in failure to load the
+ symbols and the return value will be false).
+ 'dl_allowed' flag allows dynamic library loading if the global symbols
+ searching mechanism has failed.
+**/
+bool dynamic_link( const char* library,
const dynamic_link_descriptor descriptors[],
- size_t n,
- size_t required = ~(size_t)0 );
+ size_t required,
+ dynamic_link_handle* handle = 0,
+ int flags = DYNAMIC_LINK_ALL );
void dynamic_unlink( dynamic_link_handle handle );
-#if __TBB_BUILD
void dynamic_unlink_all();
-#endif /* __TBB_BUILD */
enum dynamic_link_error_t {
dl_success = 0,
diff --git a/src/tbb/governor.cpp b/src/tbb/governor.cpp
index 03b2e64..0f2b469 100644
--- a/src/tbb/governor.cpp
+++ b/src/tbb/governor.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,8 @@
the GNU General Public License.
*/
+#include <stdio.h>
+#include <stdlib.h>
#include "governor.h"
#include "tbb_main.h"
#include "scheduler.h"
@@ -52,17 +54,13 @@ namespace internal {
#define CILKLIB_NAME "libcilkrts.so"
#endif
-//! Handler for memory allocation
+//! Handler for interoperation with cilkrts library.
static __cilk_tbb_retcode (*watch_stack_handler)(struct __cilk_tbb_unwatch_thunk* u,
struct __cilk_tbb_stack_op_thunk o);
-#if __TBB_WEAK_SYMBOLS
- #pragma weak __cilkrts_watch_stack
-#endif
-
//! Table describing how to link the handlers.
static const dynamic_link_descriptor CilkLinkTable[] = {
- DLD(__cilkrts_watch_stack, watch_stack_handler)
+ { "__cilkrts_watch_stack", (pointer_to_handler*)(void*)(&watch_stack_handler) }
};
static atomic<do_once_state> cilkrts_load_state;
@@ -70,7 +68,7 @@ static atomic<do_once_state> cilkrts_load_state;
bool initialize_cilk_interop() {
// Pinning can fail. This is a normal situation, and means that the current
// thread does not use cilkrts and consequently does not need interop.
- return dynamic_link( CILKLIB_NAME, CilkLinkTable, 1 );
+ return dynamic_link( CILKLIB_NAME, CilkLinkTable, 1, /*handle=*/0, DYNAMIC_LINK_GLOBAL );
}
#endif /* __TBB_SURVIVE_THREAD_SWITCH */
@@ -148,6 +146,13 @@ void governor::sign_off(generic_scheduler* s) {
#endif /* __TBB_SURVIVE_THREAD_SWITCH */
}
+void governor::setBlockingTerminate(const task_scheduler_init *tsi) {
+ __TBB_ASSERT(!IsBlockingTermiantionInProgress, "It's impossible to create task_scheduler_init while blocking termination is in progress.");
+ if (BlockingTSI)
+ throw_exception(eid_blocking_sch_init);
+ BlockingTSI = tsi;
+}
+
generic_scheduler* governor::init_scheduler( unsigned num_threads, stack_size_type stack_size, bool auto_init ) {
if( !__TBB_InitOnce::initialization_done() )
DoOneTimeInitializations();
@@ -168,20 +173,39 @@ generic_scheduler* governor::init_scheduler( unsigned num_threads, stack_size_ty
return s;
}
-void governor::terminate_scheduler( generic_scheduler* s ) {
+void governor::terminate_scheduler( generic_scheduler* s, const task_scheduler_init* tsi_ptr ) {
__TBB_ASSERT( s == theTLS.get(), "Attempt to terminate non-local scheduler instance" );
- if( !--(s->my_ref_count) )
+ if (--(s->my_ref_count)) {
+ if (BlockingTSI && BlockingTSI==tsi_ptr) {
+ // can't throw exception, because this is on dtor's call chain
+ fprintf(stderr, "Attempt to terminate nested scheduler in blocking mode\n");
+ exit(1);
+ }
+ } else {
+#if TBB_USE_ASSERT
+ if (BlockingTSI) {
+ __TBB_ASSERT( BlockingTSI == tsi_ptr, "For blocking termiantion last terminate_scheduler must be blocking." );
+ IsBlockingTermiantionInProgress = true;
+ }
+#endif
s->cleanup_master();
+ BlockingTSI = NULL;
+#if TBB_USE_ASSERT
+ IsBlockingTermiantionInProgress = false;
+#endif
+ }
}
void governor::auto_terminate(void* arg){
generic_scheduler* s = static_cast<generic_scheduler*>(arg);
if( s && s->my_auto_initialized ) {
if( !--(s->my_ref_count) ) {
+ __TBB_ASSERT( !BlockingTSI, "Blocking auto-termiante is not supported." );
// If the TLS slot is already cleared by OS or underlying concurrency
// runtime, restore its value.
if ( !theTLS.get() )
theTLS.set(s);
+ else __TBB_ASSERT( s == theTLS.get(), NULL );
s->cleanup_master();
__TBB_ASSERT( !theTLS.get(), "cleanup_master has not cleared its TLS slot" );
}
@@ -274,10 +298,17 @@ void task_scheduler_init::initialize( int number_of_threads, stack_size_type thr
#endif
thread_stack_size &= ~(stack_size_type)propagation_mode_mask;
if( number_of_threads!=deferred ) {
+ bool blocking_terminate = false;
+ if (my_scheduler == (scheduler*)wait_workers_in_terminate_flag) {
+ blocking_terminate = true;
+ my_scheduler = NULL;
+ }
__TBB_ASSERT( !my_scheduler, "task_scheduler_init already initialized" );
__TBB_ASSERT( number_of_threads==-1 || number_of_threads>=1,
"number_of_threads for task_scheduler_init must be -1 or positive" );
- internal::generic_scheduler *s = governor::init_scheduler( number_of_threads, thread_stack_size );
+ if (blocking_terminate)
+ governor::setBlockingTerminate(this);
+ internal::generic_scheduler *s = governor::init_scheduler( number_of_threads, thread_stack_size, /*auto_init=*/false );
#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS
if ( s->master_outermost_level() ) {
uintptr_t &vt = s->default_context()->my_version_and_traits;
@@ -312,7 +343,7 @@ void task_scheduler_init::terminate() {
: vt & ~task_group_context::exact_exception;
}
#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */
- governor::terminate_scheduler(s);
+ governor::terminate_scheduler(s, this);
}
int task_scheduler_init::default_num_threads() {
diff --git a/src/tbb/governor.h b/src/tbb/governor.h
index b2a4cd2..1c643aa 100644
--- a/src/tbb/governor.h
+++ b/src/tbb/governor.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -60,13 +60,20 @@ class governor {
//! TLS for scheduler instances associated with individual threads
static basic_tls<generic_scheduler*> theTLS;
- //! Caches the maximal level of paralellism supported by the hardware
+ //! Caches the maximal level of parallelism supported by the hardware
static unsigned DefaultNumberOfThreads;
static rml::tbb_factory theRMLServerFactory;
static bool UsePrivateRML;
+ //! Instance of task_scheduler_init that requested blocking termination.
+ static const task_scheduler_init *BlockingTSI;
+
+#if TBB_USE_ASSERT
+ static bool IsBlockingTermiantionInProgress;
+#endif
+
//! Create key for thread-local storage and initialize RML.
static void acquire_resources ();
@@ -92,7 +99,7 @@ public:
static generic_scheduler* init_scheduler( unsigned num_threads, stack_size_type stack_size, bool auto_init = false );
//! Processes scheduler termination request (possibly nested) in a master thread
- static void terminate_scheduler( generic_scheduler* s );
+ static void terminate_scheduler( generic_scheduler* s, const task_scheduler_init *tsi_ptr );
//! Returns number of worker threads in the currently active arena.
inline static unsigned max_number_of_workers ();
@@ -130,6 +137,11 @@ public:
static void initialize_rml_factory ();
+ static bool needsWaitWorkers () { return BlockingTSI!=NULL; }
+
+ //! Must be called before init_scheduler
+ static void setBlockingTerminate(const task_scheduler_init *tsi);
+
#if __TBB_SURVIVE_THREAD_SWITCH
static __cilk_tbb_retcode stack_op_handler( __cilk_tbb_stack_op op, void* );
#endif /* __TBB_SURVIVE_THREAD_SWITCH */
diff --git a/src/tbb/ia32-masm/atomic_support.asm b/src/tbb/ia32-masm/atomic_support.asm
index a87cf74..a9fadf5 100644
--- a/src/tbb/ia32-masm/atomic_support.asm
+++ b/src/tbb/ia32-masm/atomic_support.asm
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
diff --git a/src/tbb/ia32-masm/lock_byte.asm b/src/tbb/ia32-masm/lock_byte.asm
index 0e9a24a..67e834e 100644
--- a/src/tbb/ia32-masm/lock_byte.asm
+++ b/src/tbb/ia32-masm/lock_byte.asm
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
diff --git a/src/tbb/ia64-gas/atomic_support.s b/src/tbb/ia64-gas/atomic_support.s
index 5d0f943..cf49dce 100644
--- a/src/tbb/ia64-gas/atomic_support.s
+++ b/src/tbb/ia64-gas/atomic_support.s
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
diff --git a/src/tbb/ia64-gas/ia64_misc.s b/src/tbb/ia64-gas/ia64_misc.s
index 2f5889a..e36938d 100644
--- a/src/tbb/ia64-gas/ia64_misc.s
+++ b/src/tbb/ia64-gas/ia64_misc.s
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
diff --git a/src/tbb/ia64-gas/lock_byte.s b/src/tbb/ia64-gas/lock_byte.s
index 377fc80..7629532 100644
--- a/src/tbb/ia64-gas/lock_byte.s
+++ b/src/tbb/ia64-gas/lock_byte.s
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
diff --git a/src/tbb/ia64-gas/log2.s b/src/tbb/ia64-gas/log2.s
index 7cef1c5..433229f 100644
--- a/src/tbb/ia64-gas/log2.s
+++ b/src/tbb/ia64-gas/log2.s
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
diff --git a/src/tbb/ia64-gas/pause.s b/src/tbb/ia64-gas/pause.s
index 97e1cc0..7f10947 100644
--- a/src/tbb/ia64-gas/pause.s
+++ b/src/tbb/ia64-gas/pause.s
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
diff --git a/src/tbb/ibm_aix51/atomic_support.c b/src/tbb/ibm_aix51/atomic_support.c
index 9001cd2..e680580 100644
--- a/src/tbb/ibm_aix51/atomic_support.c
+++ b/src/tbb/ibm_aix51/atomic_support.c
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/index.html b/src/tbb/index.html
index 6da0f26..d1bf5a7 100644
--- a/src/tbb/index.html
+++ b/src/tbb/index.html
@@ -21,7 +21,7 @@ This directory contains the source code of the TBB core components.
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
-Copyright © 2005-2012 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2013 Intel Corporation. All Rights Reserved.
<P></P>
Intel is a registered trademark or trademark of Intel Corporation
or its subsidiaries in the United States and other countries.
diff --git a/src/tbb/intel64-masm/atomic_support.asm b/src/tbb/intel64-masm/atomic_support.asm
index b46af21..1488d68 100644
--- a/src/tbb/intel64-masm/atomic_support.asm
+++ b/src/tbb/intel64-masm/atomic_support.asm
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
diff --git a/src/tbb/intel64-masm/intel64_misc.asm b/src/tbb/intel64-masm/intel64_misc.asm
index e9fb3d6..171a0d7 100644
--- a/src/tbb/intel64-masm/intel64_misc.asm
+++ b/src/tbb/intel64-masm/intel64_misc.asm
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
diff --git a/src/tbb/intrusive_list.h b/src/tbb/intrusive_list.h
index d9eb8bc..ebaecbd 100644
--- a/src/tbb/intrusive_list.h
+++ b/src/tbb/intrusive_list.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -65,24 +65,20 @@ class intrusive_list_base {
class iterator_impl {
Iterator& self () { return *static_cast<Iterator*>(this); }
- //! Pointer to the head of the list being iterated
- intrusive_list_node *my_list_head;
-
//! Node the iterator points to at the moment
intrusive_list_node *my_pos;
protected:
- iterator_impl ( intrusive_list_node* head, intrusive_list_node* pos )
- : my_list_head(head), my_pos(pos)
+ iterator_impl (intrusive_list_node* pos )
+ : my_pos(pos)
{}
T& item () const {
- //return *reinterpret_cast<T*>((char*)my_pos - ((ptrdiff_t)&(reinterpret_cast<T*>(0x1000)->*NodePtr) - 0x1000));
return intrusive_list_base::item(my_pos);
}
public:
- iterator_impl () : my_list_head(NULL), my_pos(NULL) {}
+ iterator_impl () : my_pos(NULL) {}
bool operator == ( const Iterator& it ) const {
return my_pos == it.my_pos;
@@ -130,8 +126,8 @@ public:
class iterator : public iterator_impl<iterator> {
template <class U, class V> friend class intrusive_list_base;
- iterator ( intrusive_list_node* head, intrusive_list_node* pos )
- : iterator_impl<iterator>( head, pos )
+ iterator (intrusive_list_node* pos )
+ : iterator_impl<iterator>(pos )
{}
public:
iterator () {}
@@ -144,8 +140,8 @@ public:
class const_iterator : public iterator_impl<const_iterator> {
template <class U, class V> friend class intrusive_list_base;
- const_iterator ( const intrusive_list_node* head, const intrusive_list_node* pos )
- : iterator_impl<const_iterator>( const_cast<intrusive_list_node*>(head), const_cast<intrusive_list_node*>(pos) )
+ const_iterator (const intrusive_list_node* pos )
+ : iterator_impl<const_iterator>(const_cast<intrusive_list_node*>(pos) )
{}
public:
const_iterator () {}
@@ -164,13 +160,13 @@ public:
size_t size () const { return my_size; }
- iterator begin () { return iterator(&my_head, my_head.my_next_node); }
+ iterator begin () { return iterator(my_head.my_next_node); }
- iterator end () { return iterator(&my_head, &my_head); }
+ iterator end () { return iterator(&my_head); }
- const_iterator begin () const { return const_iterator(&my_head, my_head.my_next_node); }
+ const_iterator begin () const { return const_iterator(my_head.my_next_node); }
- const_iterator end () const { return const_iterator(&my_head, &my_head); }
+ const_iterator end () const { return const_iterator(&my_head); }
void push_front ( T& val ) {
__TBB_ASSERT( node(val).my_prev_node == &node(val) && node(val).my_next_node == &node(val),
diff --git a/src/tbb/itt_notify.cpp b/src/tbb/itt_notify.cpp
index b8c31d9..55f8fe2 100644
--- a/src/tbb/itt_notify.cpp
+++ b/src/tbb/itt_notify.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/itt_notify.h b/src/tbb/itt_notify.h
index 830cd14..455bf20 100644
--- a/src/tbb/itt_notify.h
+++ b/src/tbb/itt_notify.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/lin32-tbb-export.def b/src/tbb/lin32-tbb-export.def
index 6440ddc..9835ad4 100644
--- a/src/tbb/lin32-tbb-export.def
+++ b/src/tbb/lin32-tbb-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/lin32-tbb-export.lst b/src/tbb/lin32-tbb-export.lst
index 15a5ff1..2538c92 100644
--- a/src/tbb/lin32-tbb-export.lst
+++ b/src/tbb/lin32-tbb-export.lst
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -60,7 +60,9 @@ __TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEij )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )
+#if __TBB_SCHEDULER_OBSERVER
__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )
+#endif /* __TBB_SCHEDULER_OBSERVER */
__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )
__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )
__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )
@@ -68,6 +70,16 @@ __TBB_SYMBOL( _ZTIN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )
+#if __TBB_TASK_ARENA
+/* arena.cpp */
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena18internal_terminateEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena13internal_waitEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_enqueueERNS_4taskEi )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_executeERNS0_8internal13delegate_baseE )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena19internal_initializeEv )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena12current_slotEv )
+#endif /* __TBB_TASK_ARENA */
+
#if !TBB_NO_LEGACY
/* task_v2.cpp */
__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
@@ -149,8 +161,10 @@ __TBB_SYMBOL( _ZN3tbb21set_assertion_handlerEPFvPKciS1_S1_E )
__TBB_SYMBOL( _ZN3tbb8internal36get_initial_auto_partitioner_divisorEv )
__TBB_SYMBOL( _ZN3tbb8internal13handle_perrorEiPKc )
__TBB_SYMBOL( _ZN3tbb8internal15runtime_warningEPKcz )
+#if __TBB_x86_32
__TBB_SYMBOL( __TBB_machine_store8_slow_perf_warning )
__TBB_SYMBOL( __TBB_machine_store8_slow )
+#endif
__TBB_SYMBOL( TBB_runtime_interface_version )
/* tbb_main.cpp */
diff --git a/src/tbb/lin64-tbb-export.def b/src/tbb/lin64-tbb-export.def
index 0c6e09a..13cc7a7 100644
--- a/src/tbb/lin64-tbb-export.def
+++ b/src/tbb/lin64-tbb-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/lin64-tbb-export.lst b/src/tbb/lin64-tbb-export.lst
index e35a655..e7324f5 100644
--- a/src/tbb/lin64-tbb-export.lst
+++ b/src/tbb/lin64-tbb-export.lst
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -60,7 +60,9 @@ __TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEim )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )
+#if __TBB_SCHEDULER_OBSERVER
__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )
+#endif /* __TBB_SCHEDULER_OBSERVER */
__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )
__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )
__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )
@@ -68,6 +70,16 @@ __TBB_SYMBOL( _ZTIN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )
+#if __TBB_TASK_ARENA
+/* arena.cpp */
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena18internal_terminateEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_enqueueERNS_4taskEl )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_executeERNS0_8internal13delegate_baseE )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena19internal_initializeEv )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena12current_slotEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena13internal_waitEv )
+#endif /* __TBB_TASK_ARENA */
+
#if !TBB_NO_LEGACY
/* task_v2.cpp */
__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
diff --git a/src/tbb/lin64ipf-tbb-export.def b/src/tbb/lin64ipf-tbb-export.def
index 7629551..5869539 100644
--- a/src/tbb/lin64ipf-tbb-export.def
+++ b/src/tbb/lin64ipf-tbb-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/lin64ipf-tbb-export.lst b/src/tbb/lin64ipf-tbb-export.lst
index 694235b..05debd2 100644
--- a/src/tbb/lin64ipf-tbb-export.lst
+++ b/src/tbb/lin64ipf-tbb-export.lst
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -60,7 +60,9 @@ __TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEim )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )
+#if __TBB_SCHEDULER_OBSERVER
__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )
+#endif /* __TBB_SCHEDULER_OBSERVER */
__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )
__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )
__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )
@@ -68,6 +70,16 @@ __TBB_SYMBOL( _ZTIN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )
+#if __TBB_TASK_ARENA
+/* arena.cpp */
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena18internal_terminateEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_enqueueERNS_4taskEl )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_executeERNS0_8internal13delegate_baseE )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena19internal_initializeEv )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena12current_slotEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena13internal_waitEv )
+#endif /* __TBB_TASK_ARENA */
+
#if !TBB_NO_LEGACY
/* task_v2.cpp */
__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
diff --git a/src/tbb/mac32-tbb-export.def b/src/tbb/mac32-tbb-export.def
index 33b5c4c..b9371ed 100644
--- a/src/tbb/mac32-tbb-export.def
+++ b/src/tbb/mac32-tbb-export.def
@@ -1,21 +1,29 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
+ This file is part of Threading Building Blocks.
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
*/
#define __TBB_SYMBOL( sym ) _##sym
diff --git a/src/tbb/mac32-tbb-export.lst b/src/tbb/mac32-tbb-export.lst
index c459860..d5b2aa3 100644
--- a/src/tbb/mac32-tbb-export.lst
+++ b/src/tbb/mac32-tbb-export.lst
@@ -1,21 +1,29 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
*/
#include "tbb/tbb_config.h"
@@ -60,7 +68,9 @@ __TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEim )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )
+#if __TBB_SCHEDULER_OBSERVER
__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )
+#endif /* __TBB_SCHEDULER_OBSERVER */
__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )
__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )
__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )
@@ -68,6 +78,16 @@ __TBB_SYMBOL( _ZTIN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )
+#if __TBB_TASK_ARENA
+/* arena.cpp */
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena18internal_terminateEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena13internal_waitEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_enqueueERNS_4taskEl )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_executeERNS0_8internal13delegate_baseE )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena19internal_initializeEv )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena12current_slotEv )
+#endif /* __TBB_TASK_ARENA */
+
#if !TBB_NO_LEGACY
// task_v2.cpp
__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
@@ -162,7 +182,7 @@ __TBB_SYMBOL( _ZN3tbb17assertion_failureEPKciS1_S1_ )
__TBB_SYMBOL( _ZN3tbb21set_assertion_handlerEPFvPKciS1_S1_E )
__TBB_SYMBOL( _ZN3tbb8internal13handle_perrorEiPKc )
__TBB_SYMBOL( _ZN3tbb8internal15runtime_warningEPKcz )
-#ifndef __POWERPC__
+#if __TBB_x86_32
__TBB_SYMBOL( __TBB_machine_store8_slow_perf_warning )
__TBB_SYMBOL( __TBB_machine_store8_slow )
#endif
diff --git a/src/tbb/mac64-tbb-export.def b/src/tbb/mac64-tbb-export.def
index 6bef209..a9b6188 100644
--- a/src/tbb/mac64-tbb-export.def
+++ b/src/tbb/mac64-tbb-export.def
@@ -1,21 +1,29 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
+ This file is part of Threading Building Blocks.
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
*/
#define __TBB_SYMBOL( sym ) _##sym
diff --git a/src/tbb/mac64-tbb-export.lst b/src/tbb/mac64-tbb-export.lst
index 7c573e5..27237a7 100644
--- a/src/tbb/mac64-tbb-export.lst
+++ b/src/tbb/mac64-tbb-export.lst
@@ -1,21 +1,29 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
*/
#include "tbb/tbb_config.h"
@@ -60,7 +68,9 @@ __TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEim )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )
+#if __TBB_SCHEDULER_OBSERVER
__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )
+#endif /* __TBB_SCHEDULER_OBSERVER */
__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )
__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )
__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )
@@ -68,6 +78,16 @@ __TBB_SYMBOL( _ZTIN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )
+#if __TBB_TASK_ARENA
+/* arena.cpp */
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena18internal_terminateEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_enqueueERNS_4taskEl )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_executeERNS0_8internal13delegate_baseE )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena19internal_initializeEv )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena12current_slotEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena13internal_waitEv )
+#endif /* __TBB_TASK_ARENA */
+
#if !TBB_NO_LEGACY
// task_v2.cpp
__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
diff --git a/src/tbb/mailbox.h b/src/tbb/mailbox.h
index 00e1785..4d5feef 100644
--- a/src/tbb/mailbox.h
+++ b/src/tbb/mailbox.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -33,6 +33,7 @@
#include "tbb/cache_aligned_allocator.h"
#include "scheduler_common.h"
+#include "tbb/atomic.h"
namespace tbb {
namespace internal {
@@ -79,7 +80,7 @@ struct task_proxy : public task {
// Attempt to transition the proxy to the "empty" state with
// cleaner_bit specifying entity responsible for its eventual freeing.
// Explicit cast to void* is to work around a seeming ICC 11.1 bug.
- if ( __TBB_CompareAndSwapW( (void*)&task_and_tag, cleaner_bit, tat ) == tat ) {
+ if ( as_atomic(task_and_tag).compare_and_swap(cleaner_bit, tat) == tat ) {
// Successfully grabbed the task, and left new owner with the job of freeing the proxy
return task_ptr(tat);
}
@@ -125,8 +126,7 @@ class mail_outbox : unpadded_mail_outbox {
} else {
// There is only one item. Some care is required to pop it.
my_first = NULL;
- if( (proxy_ptr*)__TBB_CompareAndSwapW(&my_last, (intptr_t)&my_first,
- (intptr_t)&first->next_in_mailbox) == &first->next_in_mailbox )
+ if( as_atomic(my_last).compare_and_swap(&my_first,&first->next_in_mailbox) == &first->next_in_mailbox )
{
// Successfully transitioned mailbox from having one item to having none.
__TBB_ASSERT(!first->next_in_mailbox,NULL);
@@ -163,6 +163,7 @@ public:
__TBB_ASSERT( !my_last, NULL );
__TBB_ASSERT( !my_is_idle, NULL );
my_last=&my_first;
+ suppress_unused_warning(pad);
}
//! Drain the mailbox
diff --git a/src/tbb/market.cpp b/src/tbb/market.cpp
index aaec6a5..b88fcb6 100644
--- a/src/tbb/market.cpp
+++ b/src/tbb/market.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -113,7 +113,7 @@ market& market::global_market ( unsigned max_num_workers, size_t stack_size ) {
size += sizeof(generic_scheduler*) * (max_num_workers - 1);
#endif /* __TBB_TASK_GROUP_CONTEXT */
__TBB_InitOnce::add_ref();
- void* storage = NFS_Allocate(size, 1, NULL);
+ void* storage = NFS_Allocate(1, size, NULL);
memset( storage, 0, size );
// Initialize and publish global market
m = new (storage) market( max_num_workers, stack_size );
@@ -146,11 +146,27 @@ void market::release () {
my_server->request_close_connection();
}
+void market::wait_workers () {
+ // usable for this kind of scheduler only
+ __TBB_ASSERT(governor::needsWaitWorkers(), NULL);
+ // wait till terminating last worker decresed my_ref_count
+ while (__TBB_load_with_acquire(my_ref_count) > 1)
+ __TBB_Yield();
+ __TBB_ASSERT(1 == my_ref_count, NULL);
+ release();
+}
+
arena& market::create_arena ( unsigned max_num_workers, size_t stack_size ) {
market &m = global_market( max_num_workers, stack_size ); // increases market's ref count
+#if __TBB_TASK_ARENA
+ // Prevent cutting an extra slot for task_arena(p,0) with default market (p-1 worketrs).
+ // This is a temporary workaround for 1968 until (TODO:) master slot reservation is reworked
+ arena& a = arena::allocate_arena( m, min(max_num_workers, m.my_max_num_workers+1) );
+#else
arena& a = arena::allocate_arena( m, min(max_num_workers, m.my_max_num_workers) );
+#endif
// Add newly created arena into the existing market's list.
- spin_mutex::scoped_lock lock(m.my_arenas_list_mutex);
+ arenas_list_mutex_type::scoped_lock lock(m.my_arenas_list_mutex);
m.insert_arena_into_list(a);
return a;
}
@@ -169,7 +185,7 @@ void market::detach_arena ( arena& a ) {
void market::try_destroy_arena ( arena* a, uintptr_t aba_epoch ) {
__TBB_ASSERT ( a, NULL );
- spin_mutex::scoped_lock lock(my_arenas_list_mutex);
+ arenas_list_mutex_type::scoped_lock lock(my_arenas_list_mutex);
assert_market_valid();
#if __TBB_TASK_PRIORITY
for ( int p = my_global_top_priority; p >= my_global_bottom_priority; --p ) {
@@ -181,7 +197,7 @@ void market::try_destroy_arena ( arena* a, uintptr_t aba_epoch ) {
if ( a == &*it ) {
if ( it->my_aba_epoch == aba_epoch ) {
// Arena is alive
- if ( !a->my_num_workers_requested && !a->my_num_threads_active ) {
+ if ( !a->my_num_workers_requested && !a->my_references ) {
__TBB_ASSERT( !a->my_num_workers_allotted && (a->my_pool_state == arena::SNAPSHOT_EMPTY || !a->my_max_num_workers), "Inconsistent arena state" );
// Arena is abandoned. Destroy it.
detach_arena( *a );
@@ -230,7 +246,7 @@ arena* market::arena_in_need ( arena_list_type &arenas, arena_list_type::iterato
if ( ++it == arenas.end() )
it = arenas.begin();
if ( a.num_workers_active() < a.my_num_workers_allotted ) {
- ++a.my_num_threads_active;
+ a.my_references+=2; // add a worker
#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
++a.my_num_workers_present;
++my_priority_levels[a.my_top_priority].workers_present;
@@ -290,14 +306,14 @@ arena* market::arena_in_need (
#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
)
{
- spin_mutex::scoped_lock lock(my_arenas_list_mutex);
+ arenas_list_mutex_type::scoped_lock lock(my_arenas_list_mutex);
assert_market_valid();
#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
if ( prev_arena ) {
priority_level_info &pl = my_priority_levels[prev_arena->my_top_priority];
--prev_arena->my_num_workers_present;
--pl.workers_present;
- if ( !--prev_arena->my_num_threads_active && !prev_arena->my_num_workers_requested ) {
+ if ( !--prev_arena->my_references && !prev_arena->my_num_workers_requested ) {
detach_arena( *a );
lock.release();
a->free_arena();
@@ -368,13 +384,23 @@ void market::adjust_demand ( arena& a, int delta ) {
}
delta = -prev_req;
}
+#if __TBB_TASK_ARENA
+ else if ( prev_req < 0 ) {
+ delta = a.my_num_workers_requested;
+ }
+#else /* __TBB_TASK_ARENA */
__TBB_ASSERT( prev_req >= 0, "Part-size request to RML?" );
+#endif /* __TBB_TASK_ARENA */
#if __TBB_TASK_PRIORITY
intptr_t p = a.my_top_priority;
priority_level_info &pl = my_priority_levels[p];
pl.workers_requested += delta;
__TBB_ASSERT( pl.workers_requested >= 0, NULL );
+#if !__TBB_TASK_ARENA
__TBB_ASSERT( a.my_num_workers_requested >= 0, NULL );
+#else
+ //TODO: understand the assertion and modify
+#endif
if ( a.my_num_workers_requested <= 0 ) {
if ( a.my_top_priority != normalized_normal_priority ) {
GATHER_STATISTIC( ++governor::local_scheduler_if_initialized()->my_counters.arena_prio_resets );
@@ -394,7 +420,11 @@ void market::adjust_demand ( arena& a, int delta ) {
update_allotment( my_global_top_priority );
}
else if ( p > my_global_top_priority ) {
+#if !__TBB_TASK_ARENA
__TBB_ASSERT( pl.workers_requested > 0, NULL );
+#else
+ //TODO: understand the assertion and modify
+#endif
update_global_top_priority(p);
a.my_num_workers_allotted = min( (int)my_max_num_workers, a.my_num_workers_requested );
my_priority_levels[p - 1].workers_available = my_max_num_workers - a.my_num_workers_allotted;
@@ -505,7 +535,7 @@ void market::update_arena_top_priority ( arena& a, intptr_t new_priority ) {
}
bool market::lower_arena_priority ( arena& a, intptr_t new_priority, intptr_t old_priority ) {
- spin_mutex::scoped_lock lock(my_arenas_list_mutex);
+ arenas_list_mutex_type::scoped_lock lock(my_arenas_list_mutex);
if ( a.my_top_priority != old_priority ) {
assert_market_valid();
return false;
@@ -531,7 +561,7 @@ bool market::lower_arena_priority ( arena& a, intptr_t new_priority, intptr_t ol
}
bool market::update_arena_priority ( arena& a, intptr_t new_priority ) {
- spin_mutex::scoped_lock lock(my_arenas_list_mutex);
+ arenas_list_mutex_type::scoped_lock lock(my_arenas_list_mutex);
if ( a.my_top_priority == new_priority ) {
assert_market_valid();
return false;
diff --git a/src/tbb/market.h b/src/tbb/market.h
index 5873e44..6f51715 100644
--- a/src/tbb/market.h
+++ b/src/tbb/market.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -71,7 +71,7 @@ private:
//! Currently active global market
static market* theMarket;
- typedef spin_mutex global_market_mutex_type;
+ typedef scheduler_mutex_type global_market_mutex_type;
//! Mutex guarding creation/destruction of theMarket, insertions/deletions in my_arenas, and cancellation propagation
static global_market_mutex_type theMarketMutex;
@@ -80,7 +80,8 @@ private:
intptr_t my_ref_count;
//! Lightweight mutex guarding accounting operations with arenas list
- spin_mutex my_arenas_list_mutex;
+ typedef scheduler_mutex_type arenas_list_mutex_type;
+ arenas_list_mutex_type my_arenas_list_mutex;
//! Pointer to the RML server object that services this TBB instance.
rml::tbb_server* my_server;
@@ -280,6 +281,13 @@ public:
/** Concurrent invocations are possible only on behalf of different arenas. **/
void adjust_demand ( arena&, int delta );
+ //! Guarantee that request_close_connection() is called by master, not some worker
+ /** Must be called before arena::on_thread_leaving() **/
+ void prepare_wait_workers() { ++my_ref_count; }
+
+ //! Wait workers termiantion
+ void wait_workers ();
+
//! Returns the requested stack size of worker threads.
size_t worker_stack_size () const { return my_stack_size; }
@@ -338,9 +346,9 @@ public:
#if __TBB_TASK_PRIORITY
#define BeginForEachArena(a) \
- spin_mutex::scoped_lock arena_list_lock(my_arenas_list_mutex); \
+ arenas_list_mutex_type::scoped_lock arena_list_lock(my_arenas_list_mutex); \
for ( intptr_t i = my_global_top_priority; i >= my_global_bottom_priority; --i ) { \
- /*spin_mutex::scoped_lock arena_list_lock(my_priority_levels[i].my_arenas_list_mutex);*/ \
+ /*arenas_list_mutex_type::scoped_lock arena_list_lock(my_priority_levels[i].my_arenas_list_mutex);*/ \
arena_list_type &arenas = my_priority_levels[i].arenas;
#else /* !__TBB_TASK_PRIORITY */
#define BeginForEachArena(a) \
diff --git a/src/tbb/mutex.cpp b/src/tbb/mutex.cpp
index 139163c..7e97a0c 100644
--- a/src/tbb/mutex.cpp
+++ b/src/tbb/mutex.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -115,7 +115,7 @@ bool mutex::scoped_lock::internal_try_acquire( mutex& m ) {
void mutex::internal_construct() {
#if _WIN32||_WIN64
- InitializeCriticalSection(&impl);
+ InitializeCriticalSectionEx(&impl, 4000, 0);
state = INITIALIZED;
#else
int error_code = pthread_mutex_init(&impl,NULL);
diff --git a/src/tbb/observer_proxy.cpp b/src/tbb/observer_proxy.cpp
index a08e347..19287bb 100644
--- a/src/tbb/observer_proxy.cpp
+++ b/src/tbb/observer_proxy.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -27,27 +27,22 @@
*/
#include "tbb/tbb_config.h"
+#if !TBB_PREVIEW_LOCAL_OBSERVER
+ #error TBB_PREVIEW_LOCAL_OBSERVER must be defined
+#endif
#if __TBB_SCHEDULER_OBSERVER
-#include "tbb/spin_rw_mutex.h"
-#include "tbb/aligned_space.h"
-
#include "observer_proxy.h"
#include "tbb_main.h"
#include "governor.h"
#include "scheduler.h"
+#include "arena.h"
namespace tbb {
namespace internal {
-typedef spin_rw_mutex::scoped_lock task_scheduler_observer_mutex_scoped_lock;
-
-/** aligned_space used here to shut up warnings when mutex destructor is called while threads are still using it. */
-static aligned_space<spin_rw_mutex,1> the_task_scheduler_observer_mutex;
-static observer_proxy* global_first_observer_proxy;
-observer_proxy* global_last_observer_proxy;
-
+observer_list the_global_observer_list;
#if TBB_USE_ASSERT
static atomic<int> observer_proxy_count;
@@ -63,170 +58,360 @@ struct check_observer_proxy_count {
static check_observer_proxy_count the_check_observer_proxy_count;
#endif /* TBB_USE_ASSERT */
-observer_proxy::observer_proxy( task_scheduler_observer_v3& tso ) : next(NULL), observer(&tso) {
+interface6::task_scheduler_observer* observer_proxy::get_v6_observer() {
+ __TBB_ASSERT(my_version == 6, NULL);
+ return static_cast<interface6::task_scheduler_observer*>(my_observer);
+}
+
+bool observer_proxy::is_global() {
+ return my_version < 6 || get_v6_observer()->my_context_tag == interface6::task_scheduler_observer::global_tag;
+}
+
+observer_proxy::observer_proxy( task_scheduler_observer_v3& tso )
+ : my_list(NULL), my_next(NULL), my_prev(NULL), my_observer(&tso)
+{
#if TBB_USE_ASSERT
++observer_proxy_count;
#endif /* TBB_USE_ASSERT */
// 1 for observer
- gc_ref_count = 1;
- {
- // Append to the global list
- task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/true);
- observer_proxy* p = global_last_observer_proxy;
- prev = p;
- if( p )
- p->next=this;
- else
- global_first_observer_proxy = this;
- global_last_observer_proxy = this;
- }
+ my_ref_count = 1;
+ my_version = load<relaxed>(my_observer->my_busy_count)
+ == interface6::task_scheduler_observer::v6_trait ? 6 : 0;
+ __TBB_ASSERT( my_version >= 6 || !load<relaxed>(my_observer->my_busy_count), NULL );
}
-void observer_proxy::remove_from_list() {
- // Take myself off the global list.
- if( next )
- next->prev = prev;
- else
- global_last_observer_proxy = prev;
- if( prev )
- prev->next = next;
- else
- global_first_observer_proxy = next;
#if TBB_USE_ASSERT
- poison_pointer(prev);
- poison_pointer(next);
- gc_ref_count = -666;
+observer_proxy::~observer_proxy () {
+ __TBB_ASSERT( !my_ref_count, "Attempt to destroy proxy still in use" );
+ poison_value(my_ref_count);
+ poison_pointer(my_prev);
+ poison_pointer(my_next);
+ --observer_proxy_count;
+}
#endif /* TBB_USE_ASSERT */
+
+template<memory_semantics M, class T, class V>
+T atomic_fetch_and_store ( T* addr, const V& val ) {
+ return (T)atomic_traits<sizeof(T), M>::fetch_and_store( addr, (T)val );
}
-void observer_proxy::remove_ref_slow() {
- int r = gc_ref_count;
+void observer_list::clear () {
+ __TBB_ASSERT( this != &the_global_observer_list, "Method clear() cannot be used on the list of global observers" );
+ // Though the method will work fine for the empty list, we require the caller
+ // to check for the list emptiness before invoking it to avoid extra overhead.
+ __TBB_ASSERT( !empty(), NULL );
+ {
+ scoped_lock lock(mutex(), /*is_writer=*/true);
+ observer_proxy *next = my_head;
+ while ( observer_proxy *p = next ) {
+ __TBB_ASSERT( p->my_version >= 6, NULL );
+ next = p->my_next;
+ // Both proxy p and observer p->my_observer (if non-null) are guaranteed
+ // to be alive while the list is locked.
+ task_scheduler_observer_v3 *obs = p->my_observer;
+ // Make sure that possible concurrent observer destruction does not
+ // conflict with the proxy list cleanup.
+ if ( !obs || !(p = (observer_proxy*)__TBB_FetchAndStoreW(&obs->my_proxy, 0)) )
+ continue;
+ __TBB_ASSERT( !next || p == next->my_prev, NULL );
+ __TBB_ASSERT( is_alive(p->my_ref_count), "Observer's proxy died prematurely" );
+ __TBB_ASSERT( p->my_ref_count == 1, "Reference for observer is missing" );
+ __TBB_ASSERT( !obs->my_busy_count, "Local observer in an empty arena cannot be marked as busy" );
+ store<relaxed>( obs->my_busy_count, interface6::task_scheduler_observer::v6_trait );
+#if TBB_USE_ASSERT
+ p->my_observer = NULL;
+ p->my_ref_count = 0;
+#endif /* TBB_USE_ASSERT */
+ remove(p);
+ delete p;
+ }
+ }
+ while( my_head )
+ __TBB_Yield();
+}
+
+void observer_list::insert ( observer_proxy* p ) {
+ scoped_lock lock(mutex(), /*is_writer=*/true);
+ if ( my_head ) {
+ p->my_prev = my_tail;
+ my_tail->my_next = p;
+ }
+ else
+ my_head = p;
+ my_tail = p;
+}
+
+void observer_list::remove ( observer_proxy* p ) {
+ __TBB_ASSERT( my_head, "Attempt to remove an item from an empty list" );
+ __TBB_ASSERT( !my_tail->my_next, "Last item's my_next must be NULL" );
+ if( p == my_tail ) {
+ __TBB_ASSERT( !p->my_next, NULL );
+ my_tail = p->my_prev;
+ }
+ else {
+ __TBB_ASSERT( p->my_next, NULL );
+ p->my_next->my_prev = p->my_prev;
+ }
+ if ( p == my_head ) {
+ __TBB_ASSERT( !p->my_prev, NULL );
+ my_head = p->my_next;
+ }
+ else {
+ __TBB_ASSERT( p->my_prev, NULL );
+ p->my_prev->my_next = p->my_next;
+ }
+ __TBB_ASSERT( (my_head && my_tail) || (!my_head && !my_tail), NULL );
+}
+
+void observer_list::remove_ref( observer_proxy* p ) {
+ int r = p->my_ref_count;
+ __TBB_ASSERT( is_alive(r), NULL );
while(r>1) {
__TBB_ASSERT( r!=0, NULL );
- int r_old = gc_ref_count.compare_and_swap(r-1,r);
+ int r_old = p->my_ref_count.compare_and_swap(r-1,r);
if( r_old==r ) {
// Successfully decremented count.
return;
- }
+ }
r = r_old;
- }
+ }
__TBB_ASSERT( r==1, NULL );
// Reference count might go to zero
{
- task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/true);
- r = --gc_ref_count;
- if( !r ) {
- remove_from_list();
- }
- }
- if( !r ) {
- __TBB_ASSERT( gc_ref_count == -666, NULL );
-#if TBB_USE_ASSERT
- --observer_proxy_count;
-#endif /* TBB_USE_ASSERT */
- delete this;
+ // Use lock to avoid resurrection by a thread concurrently walking the list
+ observer_list::scoped_lock lock(mutex(), /*is_writer=*/true);
+ r = --p->my_ref_count;
+ if( !r )
+ remove(p);
}
+ if( !r )
+ delete p;
}
-observer_proxy* observer_proxy::process_list( observer_proxy* local_last, bool is_worker, bool is_entry ) {
- // Pointer p marches though the list.
- // If is_entry, start with our previous list position, otherwise start at beginning of list.
- observer_proxy* p = is_entry ? local_last : NULL;
- for(;;) {
- task_scheduler_observer* tso=NULL;
- // Hold lock on list only long enough to advance to next proxy in list.
- {
- task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/false);
+void observer_list::do_notify_entry_observers( observer_proxy*& last, bool worker ) {
+ // Pointer p marches though the list from last (exclusively) to the end.
+ observer_proxy *p = last, *prev = p;
+ for(;;) {
+ task_scheduler_observer_v3* tso=NULL;
+ // Hold lock on list only long enough to advance to the next proxy in the list.
+ {
+ scoped_lock lock(mutex(), /*is_writer=*/false);
do {
- if( local_last && local_last->observer ) {
- // 2 = 1 for observer and 1 for local_last
- __TBB_ASSERT( local_last->gc_ref_count>=2, NULL );
- // Can decrement count quickly, because it cannot become zero here.
- --local_last->gc_ref_count;
- local_last = NULL;
+ if( p ) {
+ // We were already processing the list.
+ if( observer_proxy* q = p->my_next ) {
+ if( p == prev )
+ remove_ref_fast(prev); // sets prev to NULL if successful
+ p = q;
+ }
+ else {
+ // Reached the end of the list.
+ if( p == prev ) {
+ // Keep the reference as we store the 'last' pointer in scheduler
+ } else {
+ // The last few proxies were empty
+ ++p->my_ref_count;
+ if( prev ) {
+ lock.release();
+ remove_ref(prev);
+ }
+ }
+ last = p;
+ return;
+ }
} else {
- // Use slow form of decrementing the reference count, after lock is released.
- }
+ // Starting pass through the list
+ p = my_head;
+ if( !p )
+ return;
+ }
+ tso = p->my_observer;
+ } while( !tso );
+ ++p->my_ref_count;
+ ++tso->my_busy_count;
+ }
+ __TBB_ASSERT( !prev || p!=prev, NULL );
+ // Release the proxy pinned before p
+ if( prev )
+ remove_ref(prev);
+ // Do not hold any locks on the list while calling user's code.
+ // Do not intercept any exceptions that may escape the callback so that
+ // they are either handled by the TBB scheduler or passed to the debugger.
+ tso->on_scheduler_entry(worker);
+ intptr_t bc = --tso->my_busy_count;
+ __TBB_ASSERT_EX( bc>=0, "my_busy_count underflowed" );
+ prev = p;
+ }
+}
+
+void observer_list::do_notify_exit_observers( observer_proxy* last, bool worker ) {
+ // Pointer p marches though the list from the beginning to last (inclusively).
+ observer_proxy *p = NULL, *prev = NULL;
+ for(;;) {
+ task_scheduler_observer_v3* tso=NULL;
+ // Hold lock on list only long enough to advance to the next proxy in the list.
+ {
+ scoped_lock lock(mutex(), /*is_writer=*/false);
+ do {
if( p ) {
// We were already processing the list.
- if( observer_proxy* q = p->next ) {
- // Step to next item in list.
- p=q;
+ if( p != last ) {
+ __TBB_ASSERT( p->my_next, "List items before 'prev' must have valid my_next pointer" );
+ if( p == prev )
+ remove_ref_fast(prev); // sets prev to NULL if successful
+ p = p->my_next;
} else {
- // At end of list.
- if( is_entry ) {
- // Remember current position in the list, so we can start at on the next call.
- ++p->gc_ref_count;
- } else {
- // Finishin running off the end of the list
- p=NULL;
+ // remove the reference from the last item
+ remove_ref_fast(p);
+ if( p ) {
+ lock.release();
+ remove_ref(p);
}
- goto done;
+ return;
}
} else {
// Starting pass through the list
- p = global_first_observer_proxy;
- if( !p )
- goto done;
- }
- tso = p->observer;
+ p = my_head;
+ __TBB_ASSERT( p, "Nonzero 'last' must guarantee that the global list is non-empty" );
+ }
+ tso = p->my_observer;
} while( !tso );
- ++p->gc_ref_count;
+ // The item is already refcounted
+ if ( p != last ) // the last is already referenced since entry notification
+ ++p->my_ref_count;
++tso->my_busy_count;
}
- __TBB_ASSERT( !local_last || p!=local_last, NULL );
- if( local_last )
- local_last->remove_ref_slow();
+ __TBB_ASSERT( !prev || p!=prev, NULL );
+ if( prev )
+ remove_ref(prev);
// Do not hold any locks on the list while calling user's code.
- __TBB_TRY {
- if( is_entry )
- tso->on_scheduler_entry( is_worker );
- else
- tso->on_scheduler_exit( is_worker );
- } __TBB_CATCH(...) {
- // Suppress exception, because user routines are supposed to be observing, not changing
- // behavior of a master or worker thread.
-#if TBB_USE_ASSERT
- runtime_warning( "%s threw exception\n", is_entry ? "on_scheduler_entry" : "on_scheduler_exit");
-#endif /* TBB_USE_ASSERT */
+ // Do not intercept any exceptions that may escape the callback so that
+ // they are either handled by the TBB scheduler or passed to the debugger.
+ tso->on_scheduler_exit(worker);
+ intptr_t bc = --tso->my_busy_count;
+ __TBB_ASSERT_EX( bc>=0, "my_busy_count underflowed" );
+ prev = p;
+ }
+}
+
+#if __TBB_TASK_ARENA
+// TODO: merge with do_notify_.. methods
+bool observer_list::ask_permission_to_leave() {
+ __TBB_ASSERT( this != &the_global_observer_list, "This method cannot be used on the list of global observers" );
+ if( !my_head ) return true;
+ // Pointer p marches though the list
+ observer_proxy *p = NULL, *prev = NULL;
+ bool result = true;
+ while( result ) {
+ task_scheduler_observer* tso = NULL;
+ // Hold lock on list only long enough to advance to the next proxy in the list.
+ {
+ scoped_lock lock(mutex(), /*is_writer=*/false);
+ do {
+ if( p ) {
+ // We were already processing the list.
+ observer_proxy* q = p->my_next;
+ // read next, remove the previous reference
+ if( p == prev )
+ remove_ref_fast(prev); // sets prev to NULL if successful
+ if( q ) p = q;
+ else {
+ // Reached the end of the list.
+ if( prev ) {
+ lock.release();
+ remove_ref(p);
+ }
+ return result;
+ }
+ } else {
+ // Starting pass through the list
+ p = my_head;
+ if( !p )
+ return result;
+ }
+ tso = p->get_v6_observer(); // all local observers are v6
+ } while( !tso );
+ ++p->my_ref_count;
+ ++tso->my_busy_count;
}
+ __TBB_ASSERT( !prev || p!=prev, NULL );
+ // Release the proxy pinned before p
+ if( prev )
+ remove_ref(prev);
+ // Do not hold any locks on the list while calling user's code.
+ // Do not intercept any exceptions that may escape the callback so that
+ // they are either handled by the TBB scheduler or passed to the debugger.
+ result = tso->on_scheduler_leaving();
intptr_t bc = --tso->my_busy_count;
__TBB_ASSERT_EX( bc>=0, "my_busy_count underflowed" );
- local_last = p;
+ prev = p;
}
-done:
- // Return new value to be used as local_last next time.
- if( local_last )
- local_last->remove_ref_slow();
- __TBB_ASSERT( !p || is_entry, NULL );
- return p;
+ if( prev )
+ remove_ref(prev);
+ return result;
}
+#endif //__TBB_TASK_ARENA
-void task_scheduler_observer_v3::observe( bool state ) {
- if( state ) {
+void task_scheduler_observer_v3::observe( bool enable ) {
+ if( enable ) {
if( !my_proxy ) {
- if( !__TBB_InitOnce::initialization_done() )
- DoOneTimeInitializations();
- my_busy_count = 0;
- my_proxy = new observer_proxy(*this);
- if( generic_scheduler* s = governor::local_scheduler_if_initialized() ) {
- // Notify newly created observer of its own thread.
- // Any other pending observers are notified too.
- s->notify_entry_observers();
+ my_proxy = new observer_proxy( *this );
+ if ( !my_proxy->is_global() ) {
+ // Local observer activation
+ generic_scheduler* s = governor::local_scheduler_if_initialized();
+#if __TBB_TASK_ARENA
+ intptr_t tag = my_proxy->get_v6_observer()->my_context_tag;
+ if( tag != interface6::task_scheduler_observer::implicit_tag ) { // explicit arena
+ task_arena *a = reinterpret_cast<task_arena*>(tag);
+ a->initialize();
+ my_proxy->my_list = &a->my_arena->my_observers;
+ } else
+#endif
+ {
+ if( !s ) s = governor::init_scheduler( (unsigned)task_scheduler_init::automatic, 0, true );
+ __TBB_ASSERT( __TBB_InitOnce::initialization_done(), NULL );
+ __TBB_ASSERT( s && s->my_arena, NULL );
+ my_proxy->my_list = &s->my_arena->my_observers;
+ }
+ my_proxy->my_list->insert(my_proxy);
+ my_busy_count = 0;
+ // Notify newly activated observer and other pending ones if it belongs to current arena
+ if(s && &s->my_arena->my_observers == my_proxy->my_list )
+ my_proxy->my_list->notify_entry_observers( s->my_last_local_observer, s->is_worker() );
+ } else {
+ // Obsolete. Global observer activation
+ if( !__TBB_InitOnce::initialization_done() )
+ DoOneTimeInitializations();
+ my_busy_count = 0;
+ my_proxy->my_list = &the_global_observer_list;
+ my_proxy->my_list->insert(my_proxy);
+ if( generic_scheduler* s = governor::local_scheduler_if_initialized() ) {
+ // Notify newly created observer of its own thread.
+ // Any other pending observers are notified too.
+ the_global_observer_list.notify_entry_observers( s->my_last_global_observer, s->is_worker() );
+ }
}
- }
+ }
} else {
- if( observer_proxy* proxy = my_proxy ) {
- my_proxy = NULL;
- __TBB_ASSERT( proxy->gc_ref_count>=1, "reference for observer missing" );
+ // Make sure that possible concurrent proxy list cleanup does not conflict
+ // with the observer destruction here.
+ if ( observer_proxy* proxy = (observer_proxy*)__TBB_FetchAndStoreW(&my_proxy, 0) ) {
+ // List destruction should not touch this proxy after we've won the above interlocked exchange.
+ __TBB_ASSERT( proxy->my_observer == this, NULL );
+ __TBB_ASSERT( is_alive(proxy->my_ref_count), "Observer's proxy died prematurely" );
+ __TBB_ASSERT( proxy->my_ref_count >= 1, "reference for observer missing" );
+ observer_list &list = *proxy->my_list;
{
- task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/true);
- proxy->observer = NULL;
+ // Ensure that none of the list walkers relies on observer pointer validity
+ observer_list::scoped_lock lock(list.mutex(), /*is_writer=*/true);
+ proxy->my_observer = NULL;
}
- proxy->remove_ref_slow();
- while( my_busy_count ) {
+ intptr_t trait = proxy->my_version == 6 ? interface6::task_scheduler_observer::v6_trait : 0;
+ // Proxy may still be held by other threads (to track the last notified observer)
+ list.remove_ref(proxy);
+ while( my_busy_count )
__TBB_Yield();
- }
+ store<relaxed>( my_busy_count, trait );
}
}
}
diff --git a/src/tbb/observer_proxy.h b/src/tbb/observer_proxy.h
index 0b8fe8e..522c003 100644
--- a/src/tbb/observer_proxy.h
+++ b/src/tbb/observer_proxy.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -31,35 +31,147 @@
#if __TBB_SCHEDULER_OBSERVER
+#include "scheduler_common.h" // to include task.h
#include "tbb/task_scheduler_observer.h"
+#include "tbb/spin_rw_mutex.h"
+#include "tbb/aligned_space.h"
namespace tbb {
namespace internal {
+class arena;
+class observer_proxy;
+
+class observer_list {
+ friend class arena;
+
+ // Mutex is wrapped with aligned_space to shut up warnings when its destructor
+ // is called while threads are still using it.
+ typedef aligned_space<spin_rw_mutex,1> my_mutex_type;
+
+ //! Pointer to the head of this list.
+ observer_proxy* my_head;
+
+ //! Pointer to the tail of this list.
+ observer_proxy* my_tail;
+
+ //! Mutex protecting this list.
+ my_mutex_type my_mutex;
+
+ //! Back-pointer to the arena this list belongs to.
+ arena* my_arena;
+
+ //! Decrement refcount of the proxy p if there are other outstanding references.
+ /** In case of success sets p to NULL. Must be invoked from under the list lock. **/
+ inline static void remove_ref_fast( observer_proxy*& p );
+
+ //! Implements notify_entry_observers functionality.
+ void do_notify_entry_observers( observer_proxy*& last, bool worker );
+
+ //! Implements notify_exit_observers functionality.
+ void do_notify_exit_observers( observer_proxy* last, bool worker );
+
+public:
+ observer_list () : my_head(NULL), my_tail(NULL) {}
+
+ //! Removes and destroys all observer proxies from the list.
+ /** Cannot be used concurrently with other methods. **/
+ void clear ();
+
+ //! Add observer proxy to the tail of the list.
+ void insert ( observer_proxy* p );
+
+ //! Remove observer proxy from the list.
+ void remove ( observer_proxy* p );
+
+ //! Decrement refcount of the proxy and destroy it if necessary.
+ /** When refcount reaches zero removes the proxy from the list and destructs it. **/
+ void remove_ref( observer_proxy* p );
+
+ //! Type of the scoped lock for the reader-writer mutex associated with the list.
+ typedef spin_rw_mutex::scoped_lock scoped_lock;
+
+ //! Accessor to the reader-writer mutex associated with the list.
+ spin_rw_mutex& mutex () { return my_mutex.begin()[0]; }
+
+ bool empty () const { return my_head == NULL; }
+
+ //! Call entry notifications on observers added after last was notified.
+ /** Updates last to become the last notified observer proxy (in the global list)
+ or leaves it to be NULL. The proxy has its refcount incremented. **/
+ inline void notify_entry_observers( observer_proxy*& last, bool worker );
+
+ //! Call exit notifications on last and observers added before it.
+ inline void notify_exit_observers( observer_proxy* last, bool worker );
+
+ //! Call on_scheduler_leaving callbacks to ask for permission for a worker thread to leave an arena
+ bool ask_permission_to_leave();
+}; // class observer_list
+
+//! Wrapper for an observer object
+/** To maintain shared lists of observers the scheduler first wraps each observer
+ object into a proxy so that a list item remained valid even after the corresponding
+ proxy object is destroyed by the user code. **/
class observer_proxy {
friend class task_scheduler_observer_v3;
+ friend class observer_list;
//! Reference count used for garbage collection.
/** 1 for reference from my task_scheduler_observer.
- 1 for each my_local_last_observer_proxy that points to me.
- No accounting for predecessor in the global list.
- No accounting for global_last_observer_proxy that points to me. */
- atomic<int> gc_ref_count;
- //! Pointer to next task_scheduler_observer
- /** Valid even when *this has been removed from the global list. */
- observer_proxy* next;
- //! Pointer to previous task_scheduler_observer in global list.
- observer_proxy* prev;
+ 1 for each task dispatcher's last observer pointer.
+ No accounting for neighbors in the shared list. */
+ atomic<int> my_ref_count;
+ //! Reference to the list this observer belongs to.
+ observer_list* my_list;
+ //! Pointer to next observer in the list specified by my_head.
+ /** NULL for the last item in the list. **/
+ observer_proxy* my_next;
+ //! Pointer to the previous observer in the list specified by my_head.
+ /** For the head of the list points to the last item. **/
+ observer_proxy* my_prev;
//! Associated observer
- task_scheduler_observer* observer;
- //! Account for removing reference from p. No effect if p is NULL.
- void remove_ref_slow();
- void remove_from_list();
- observer_proxy( task_scheduler_observer_v3& wo );
-public:
- static observer_proxy* process_list( observer_proxy* local_last, bool is_worker, bool is_entry );
-};
+ task_scheduler_observer_v3* my_observer;
+ //! Version
+ char my_version;
+
+ interface6::task_scheduler_observer* get_v6_observer();
+ bool is_global(); //TODO: move them back inline when un-CPF'ing
+
+ //! Constructs proxy for the given observer and adds it to the specified list.
+ observer_proxy( task_scheduler_observer_v3& );
+
+#if TBB_USE_ASSERT
+ ~observer_proxy();
+#endif /* TBB_USE_ASSERT */
+
+ //! Shut up the warning
+ observer_proxy& operator = ( const observer_proxy& );
+}; // class observer_proxy
+
+inline void observer_list::remove_ref_fast( observer_proxy*& p ) {
+ if( p->my_observer ) {
+ // 2 = 1 for observer and 1 for last
+ __TBB_ASSERT( p->my_ref_count>=2, NULL );
+ // Can decrement refcount quickly, as it cannot drop to zero while under the lock.
+ --p->my_ref_count;
+ p = NULL;
+ } else {
+ // Use slow form of refcount decrementing, after the lock is released.
+ }
+}
+
+inline void observer_list::notify_entry_observers( observer_proxy*& last, bool worker ) {
+ if ( last == my_tail )
+ return;
+ do_notify_entry_observers( last, worker );
+}
+
+inline void observer_list::notify_exit_observers( observer_proxy* last, bool worker ) {
+ if ( !last )
+ return;
+ do_notify_exit_observers( last, worker );
+}
-extern observer_proxy* global_last_observer_proxy;
+extern observer_list the_global_observer_list;
} // namespace internal
} // namespace tbb
diff --git a/src/tbb/pipeline.cpp b/src/tbb/pipeline.cpp
index 2cb0629..7789388 100644
--- a/src/tbb/pipeline.cpp
+++ b/src/tbb/pipeline.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -57,7 +57,7 @@ struct task_info {
};
//! A buffer of input items for a filter.
/** Each item is a task_info, inserted into a position in the buffer corresponding to a Token. */
-class input_buffer {
+class input_buffer : no_copy {
friend class tbb::internal::pipeline_root_task;
friend class tbb::filter;
friend class tbb::thread_bound_filter;
@@ -728,6 +728,7 @@ thread_bound_filter::result_type thread_bound_filter::try_process_item() {
}
thread_bound_filter::result_type thread_bound_filter::internal_process_item(bool is_blocking) {
+ __TBB_ASSERT(my_pipeline != NULL,"It's not supposed that process_item is called for a filter that is not in a pipeline.");
internal::task_info info;
info.reset();
diff --git a/src/tbb/private_server.cpp b/src/tbb/private_server.cpp
index dce544f..5322de3 100644
--- a/src/tbb/private_server.cpp
+++ b/src/tbb/private_server.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,7 +30,7 @@
#include "../server/thread_monitor.h"
#include "tbb/atomic.h"
#include "tbb/cache_aligned_allocator.h"
-#include "tbb/spin_mutex.h"
+#include "scheduler_common.h"
#include "governor.h"
#include "tbb_misc.h"
@@ -40,6 +40,8 @@ namespace tbb {
namespace internal {
namespace rml {
+typedef thread_monitor::handle_type thread_handle;
+
class private_server;
class private_worker: no_copy {
@@ -81,6 +83,11 @@ class private_worker: no_copy {
"my_slack<=0 && my_state==st_normal && I am on server's list of asleep threads" */
thread_monitor my_thread_monitor;
+ //! Handle of the OS thread associated with this worker
+ thread_handle my_handle;
+
+ atomic<bool> my_handle_ready; // make atomic to add fences
+
//! Link for list of workers that are sleeping or have no associated thread.
private_worker* my_next;
@@ -103,9 +110,9 @@ protected:
my_client(client),
my_index(i)
{
+ my_handle_ready = false;
my_state = st_init;
}
-
};
static const size_t cache_line_size = tbb::internal::NFS_MaxLineSize;
@@ -119,7 +126,8 @@ static const size_t cache_line_size = tbb::internal::NFS_MaxLineSize;
class padded_private_worker: public private_worker {
char pad[cache_line_size - sizeof(private_worker)%cache_line_size];
public:
- padded_private_worker( private_server& server, tbb_client& client, const size_t i ) : private_worker(server,client,i) {}
+ padded_private_worker( private_server& server, tbb_client& client, const size_t i )
+ : private_worker(server,client,i) { suppress_unused_warning(pad); }
};
#if _MSC_VER && !defined(__INTEL_COMPILER)
#pragma warning(pop)
@@ -150,7 +158,8 @@ class private_server: public tbb_server, no_copy {
tbb::atomic<private_worker*> my_asleep_list_root;
//! Protects my_asleep_list_root
- tbb::spin_mutex my_asleep_list_mutex;
+ typedef scheduler_mutex_type asleep_list_mutex_type;
+ asleep_list_mutex_type my_asleep_list_mutex;
#if TBB_USE_ASSERT
atomic<int> my_net_slack_requests;
@@ -251,6 +260,17 @@ void private_worker::start_shutdown() {
// Perform action that otherwise would be performed by associated thread when it quits.
my_server.remove_server_ref();
}
+ // Do not need join for st_init state,
+ // because in this case the thread wasn't started yet.
+ if (s!=st_init) {
+ while (!my_handle_ready)
+ __TBB_Yield();
+ // my_handle is valid at this point
+ if (governor::needsWaitWorkers())
+ thread_monitor::join(my_handle);
+ else
+ thread_monitor::detach_thread(my_handle);
+ }
}
void private_worker::run() {
@@ -287,15 +307,16 @@ void private_worker::run() {
inline void private_worker::wake_or_launch() {
if( my_state==st_init && my_state.compare_and_swap( st_starting, st_init )==st_init ) {
#if USE_WINTHREAD
- thread_monitor::launch( thread_routine, this, my_server.my_stack_size, &this->my_index );
+ my_handle = thread_monitor::launch( thread_routine, this, my_server.my_stack_size, &this->my_index );
#elif USE_PTHREAD
{
affinity_helper fpa;
fpa.protect_affinity_mask();
- thread_monitor::launch( thread_routine, this, my_server.my_stack_size );
+ my_handle = thread_monitor::launch( thread_routine, this, my_server.my_stack_size );
// Implicit destruction of fpa resets original affinity mask.
}
#endif /* USE_PTHREAD */
+ my_handle_ready = true;
}
else
my_thread_monitor.notify();
@@ -334,7 +355,7 @@ private_server::~private_server() {
}
inline bool private_server::try_insert_in_asleep_list( private_worker& t ) {
- tbb::spin_mutex::scoped_lock lock(my_asleep_list_mutex);
+ asleep_list_mutex_type::scoped_lock lock(my_asleep_list_mutex);
// Contribute to slack under lock so that if another takes that unit of slack,
// it sees us sleeping on the list and wakes us up.
int k = ++my_slack;
@@ -353,7 +374,7 @@ void private_server::wake_some( int additional_slack ) {
private_worker* wakee[2];
private_worker**w = wakee;
{
- tbb::spin_mutex::scoped_lock lock(my_asleep_list_mutex);
+ asleep_list_mutex_type::scoped_lock lock(my_asleep_list_mutex);
while( my_asleep_list_root && w<wakee+2 ) {
if( additional_slack>0 ) {
if (additional_slack+my_slack<=0) // additional demand does not exceed surplus supply
@@ -398,4 +419,5 @@ tbb_server* make_private_server( tbb_client& client ) {
} // namespace rml
} // namespace internal
+
} // namespace tbb
diff --git a/src/tbb/queuing_mutex.cpp b/src/tbb/queuing_mutex.cpp
index 0d4f578..5d102c0 100644
--- a/src/tbb/queuing_mutex.cpp
+++ b/src/tbb/queuing_mutex.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/queuing_rw_mutex.cpp b/src/tbb/queuing_rw_mutex.cpp
index 25eabfa..78a1c60 100644
--- a/src/tbb/queuing_rw_mutex.cpp
+++ b/src/tbb/queuing_rw_mutex.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/reader_writer_lock.cpp b/src/tbb/reader_writer_lock.cpp
index 78c6177..019dad0 100644
--- a/src/tbb/reader_writer_lock.cpp
+++ b/src/tbb/reader_writer_lock.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/recursive_mutex.cpp b/src/tbb/recursive_mutex.cpp
index 2c848b6..977ae50 100644
--- a/src/tbb/recursive_mutex.cpp
+++ b/src/tbb/recursive_mutex.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -103,7 +103,7 @@ bool recursive_mutex::scoped_lock::internal_try_acquire( recursive_mutex& m ) {
void recursive_mutex::internal_construct() {
#if _WIN32||_WIN64
- InitializeCriticalSection(&impl);
+ InitializeCriticalSectionEx(&impl, 4000, 0);
state = INITIALIZED;
#else
pthread_mutexattr_t mtx_attr;
diff --git a/src/tbb/scheduler.cpp b/src/tbb/scheduler.cpp
index bea35a0..f2ed613 100644
--- a/src/tbb/scheduler.cpp
+++ b/src/tbb/scheduler.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,8 +26,6 @@
the GNU General Public License.
*/
-#include "tbb/tbb_machine.h"
-
#include "custom_scheduler.h"
#include "scheduler_utility.h"
#include "governor.h"
@@ -35,6 +33,8 @@
#include "arena.h"
#include "mailbox.h"
#include "observer_proxy.h"
+#include "tbb/tbb_machine.h"
+#include "tbb/atomic.h"
namespace tbb {
namespace internal {
@@ -51,7 +51,7 @@ inline generic_scheduler* allocate_scheduler ( arena* a, size_t index ) {
}
#if __TBB_TASK_GROUP_CONTEXT
-spin_mutex the_context_state_propagation_mutex;
+context_state_propagation_mutex_type the_context_state_propagation_mutex;
uintptr_t the_context_state_propagation_epoch = 0;
@@ -91,21 +91,15 @@ scheduler::~scheduler( ) {}
generic_scheduler::generic_scheduler( arena* a, size_t index )
: my_stealing_threshold(0)
- , my_arena_index(index)
- , my_task_pool_size(0)
- , my_arena_slot(&my_dummy_slot)
, my_market(NULL)
- , my_arena(a)
- , my_random( unsigned(this-(generic_scheduler*)NULL) )
+ , my_random( this )
, my_free_list(NULL)
- , my_innermost_running_task(NULL)
+#if __TBB_HOARD_NONLOCAL_TASKS
+ , my_nonlocal_free_list(NULL)
+#endif
, my_dummy_task(NULL)
, my_ref_count(1)
- , my_affinity_id(0)
, my_auto_initialized(false)
-#if __TBB_SCHEDULER_OBSERVER
- , my_local_last_observer_proxy(NULL)
-#endif /* __TBB_SCHEDULER_OBSERVER */
#if __TBB_COUNT_TASK_NODES
, my_task_node_count(0)
#endif /* __TBB_COUNT_TASK_NODES */
@@ -114,7 +108,6 @@ generic_scheduler::generic_scheduler( arena* a, size_t index )
#if __TBB_TASK_GROUP_CONTEXT
, my_local_ctx_list_update(make_atomic(uintptr_t(0)))
#endif /* __TBB_TASK_GROUP_CONTEXT */
- , my_dispatching_task(NULL)
#if __TBB_TASK_PRIORITY
, my_ref_top_priority(NULL)
, my_offloaded_tasks(NULL)
@@ -130,12 +123,18 @@ generic_scheduler::generic_scheduler( arena* a, size_t index )
, my_cilk_state(cs_none)
#endif /* __TBB_SURVIVE_THREAD_SWITCH && TBB_USE_ASSERT */
{
- my_dummy_slot.task_pool = allocate_task_pool(min_task_pool_size);
- my_dummy_slot.hint_for_push = index ^ unsigned(this-(generic_scheduler*)NULL)>>16; // randomizer seed
- my_dummy_slot.hint_for_pop = index; // initial value for round-robin
- __TBB_ASSERT( my_task_pool_size == min_task_pool_size, NULL );
- __TBB_store_relaxed(my_dummy_slot.head, 0);
- __TBB_store_relaxed(my_dummy_slot.tail, 0);
+ my_arena_index = index;
+ my_arena_slot = 0;
+ my_arena = a;
+ my_innermost_running_task = NULL;
+ my_dispatching_task = NULL;
+ my_affinity_id = 0;
+#if __TBB_SCHEDULER_OBSERVER
+ my_last_global_observer = NULL;
+ my_last_local_observer = NULL;
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+ hint_for_push = index ^ my_random.get(); // randomizer seed
my_dummy_task = &allocate_task( sizeof(task), __TBB_CONTEXT_ARG(NULL, NULL) );
#if __TBB_TASK_GROUP_CONTEXT
my_context_list_head.my_prev = &my_context_list_head;
@@ -158,8 +157,8 @@ generic_scheduler::generic_scheduler( arena* a, size_t index )
#if TBB_USE_ASSERT > 1
void generic_scheduler::assert_task_pool_valid() const {
acquire_task_pool();
- task** tp = my_dummy_slot.task_pool;
- __TBB_ASSERT( my_task_pool_size >= min_task_pool_size, NULL );
+ task** tp = my_arena_slot->task_pool_ptr;
+ __TBB_ASSERT( my_arena_slot->my_task_pool_size >= min_task_pool_size, NULL );
const size_t H = __TBB_load_relaxed(my_arena_slot->head); // mirror
const size_t T = __TBB_load_relaxed(my_arena_slot->tail); // mirror
__TBB_ASSERT( H <= T, NULL );
@@ -170,19 +169,12 @@ void generic_scheduler::assert_task_pool_valid() const {
__TBB_ASSERT( tp[i]->prefix().state == task::ready ||
tp[i]->prefix().extra_state == es_task_proxy, "task in the deque has invalid state" );
}
- for ( size_t i = T; i < my_task_pool_size; ++i )
+ for ( size_t i = T; i < my_arena_slot->my_task_pool_size; ++i )
__TBB_ASSERT( tp[i] == poisoned_ptr, "Task pool corrupted" );
release_task_pool();
}
#endif /* TBB_USE_ASSERT > 1 */
-#if TBB_USE_ASSERT
-void generic_scheduler::fill_with_canary_pattern ( task** task_pool, size_t first, size_t last ) {
- for ( size_t i = first; i < last; ++i )
- poison_pointer(task_pool[i]);
-}
-#endif /* TBB_USE_ASSERT */
-
void generic_scheduler::init_stack_info () {
// Stacks are growing top-down. Highest address is called "stack base",
// and the lowest is "stack limit".
@@ -277,7 +269,7 @@ void generic_scheduler::cleanup_local_context_list () {
// Full fence prevents reordering of store to my_local_ctx_list_update with
// load from my_nonlocal_ctx_list_update.
atomic_fence();
- // Check for the conflict with concurrent destroyer or cancelation propagator
+ // Check for the conflict with concurrent destroyer or cancellation propagator
if ( my_nonlocal_ctx_list_update.load<relaxed>() || local_count_snapshot != the_context_state_propagation_epoch )
lock.acquire(my_context_list_mutex);
// No acquire fence is necessary for loading my_context_list_head.my_next,
@@ -302,12 +294,20 @@ void generic_scheduler::cleanup_local_context_list () {
#endif /* __TBB_TASK_GROUP_CONTEXT */
void generic_scheduler::free_scheduler() {
- __TBB_ASSERT( !in_arena(), NULL );
+ __TBB_ASSERT( !my_arena_slot, NULL );
#if __TBB_TASK_GROUP_CONTEXT
cleanup_local_context_list();
#endif /* __TBB_TASK_GROUP_CONTEXT */
free_task<small_local_task>( *my_dummy_task );
+#if __TBB_HOARD_NONLOCAL_TASKS
+ while( task* t = my_nonlocal_free_list ) {
+ task_prefix& p = t->prefix();
+ my_nonlocal_free_list = p.next;
+ __TBB_ASSERT( p.origin && p.origin!=this, NULL );
+ free_nonlocal_small_task(*t);
+ }
+#endif
// k accounts for a guard reference and each task that we deallocate.
intptr_t k = 1;
for(;;) {
@@ -323,8 +323,6 @@ void generic_scheduler::free_scheduler() {
#if __TBB_COUNT_TASK_NODES
my_market->update_task_node_count( my_task_node_count );
#endif /* __TBB_COUNT_TASK_NODES */
- free_task_pool( my_dummy_slot.task_pool );
- my_dummy_slot.task_pool = NULL;
// Update my_small_task_count last. Doing so sooner might cause another thread to free *this.
__TBB_ASSERT( my_small_task_count>=k, "my_small_task_count corrupted" );
governor::sign_off(this);
@@ -335,9 +333,16 @@ void generic_scheduler::free_scheduler() {
task& generic_scheduler::allocate_task( size_t number_of_bytes,
__TBB_CONTEXT_ARG(task* parent, task_group_context* context) ) {
GATHER_STATISTIC(++my_counters.active_tasks);
- task* t = my_free_list;
+ task *t;
if( number_of_bytes<=quick_task_size ) {
- if( t ) {
+#if __TBB_HOARD_NONLOCAL_TASKS
+ if( (t = my_nonlocal_free_list) ) {
+ GATHER_STATISTIC(--my_counters.free_list_length);
+ __TBB_ASSERT( t->state()==task::freed, "free list of tasks is corrupted" );
+ my_nonlocal_free_list = t->prefix().next;
+ } else
+#endif
+ if( (t = my_free_list) ) {
GATHER_STATISTIC(--my_counters.free_list_length);
__TBB_ASSERT( t->state()==task::freed, "free list of tasks is corrupted" );
my_free_list = t->prefix().next;
@@ -349,16 +354,33 @@ task& generic_scheduler::allocate_task( size_t number_of_bytes,
ITT_NOTIFY( sync_acquired, &my_return_list );
my_free_list = t->prefix().next;
} else {
- t = (task*)((char*)NFS_Allocate( task_prefix_reservation_size+quick_task_size, 1, NULL ) + task_prefix_reservation_size );
+ t = (task*)((char*)NFS_Allocate( 1, task_prefix_reservation_size+quick_task_size, NULL ) + task_prefix_reservation_size );
#if __TBB_COUNT_TASK_NODES
++my_task_node_count;
#endif /* __TBB_COUNT_TASK_NODES */
t->prefix().origin = this;
+ t->prefix().next = 0;
++my_small_task_count;
}
+#if __TBB_PREFETCHING
+ task *t_next = t->prefix().next;
+ if( !t_next ) { // the task was last in the list
+#if __TBB_HOARD_NONLOCAL_TASKS
+ if( my_free_list )
+ t_next = my_free_list;
+ else
+#endif
+ if( my_return_list ) // enable prefetching, gives speedup
+ t_next = my_free_list = (task*)__TBB_FetchAndStoreW( &my_return_list, 0 );
+ }
+ if( t_next ) { // gives speedup for both cache lines
+ __TBB_cl_prefetch(t_next);
+ __TBB_cl_prefetch(&t_next->prefix());
+ }
+#endif /* __TBB_PREFETCHING */
} else {
GATHER_STATISTIC(++my_counters.big_tasks);
- t = (task*)((char*)NFS_Allocate( task_prefix_reservation_size+number_of_bytes, 1, NULL ) + task_prefix_reservation_size );
+ t = (task*)((char*)NFS_Allocate( 1, task_prefix_reservation_size+number_of_bytes, NULL ) + task_prefix_reservation_size );
#if __TBB_COUNT_TASK_NODES
++my_task_node_count;
#endif /* __TBB_COUNT_TASK_NODES */
@@ -393,8 +415,11 @@ void generic_scheduler::free_nonlocal_small_task( task& t ) {
// Atomically insert t at head of s.my_return_list
t.prefix().next = old;
ITT_NOTIFY( sync_releasing, &s.my_return_list );
- if( __TBB_CompareAndSwapW( &s.my_return_list, (intptr_t)&t, (intptr_t)old )==(intptr_t)old ) {
- GATHER_STATISTIC(++my_counters.free_list_length);
+ if( as_atomic(s.my_return_list).compare_and_swap(&t, old )==old ) {
+#if __TBB_PREFETCHING
+ __TBB_cl_evict(&t.prefix());
+ __TBB_cl_evict(&t);
+#endif
return;
}
}
@@ -408,34 +433,39 @@ void generic_scheduler::free_nonlocal_small_task( task& t ) {
size_t generic_scheduler::prepare_task_pool ( size_t num_tasks ) {
size_t T = __TBB_load_relaxed(my_arena_slot->tail); // mirror
- if ( T + num_tasks <= my_task_pool_size )
+ if ( T + num_tasks <= my_arena_slot->my_task_pool_size )
return T;
acquire_task_pool();
- // Below my_dummy_slot.task_pool is used as the lock on the task pool munges
- // my_arena_slot->task_pool pointer
size_t H = __TBB_load_relaxed(my_arena_slot->head); // mirror
T -= H;
size_t new_size = T + num_tasks;
+ __TBB_ASSERT(!my_arena_slot->my_task_pool_size || my_arena_slot->my_task_pool_size >= min_task_pool_size, NULL);
+ if( !my_arena_slot->my_task_pool_size ) {
+ __TBB_ASSERT( !in_arena() && !my_arena_slot->task_pool_ptr, NULL );
+ if( new_size < min_task_pool_size ) new_size = min_task_pool_size;
+ my_arena_slot->allocate_task_pool( new_size );
+ }
// If the free space at the beginning of the task pool is too short, we
// are likely facing a pathological single-producer-multiple-consumers
// scenario, and thus it's better to expand the task pool
- if ( new_size <= my_task_pool_size - min_task_pool_size/4 ) {
+ else if ( new_size <= my_arena_slot->my_task_pool_size - min_task_pool_size/4 ) {
// Relocate the busy part to the beginning of the deque
- memmove( my_dummy_slot.task_pool, my_dummy_slot.task_pool + H, T * sizeof(task*) );
- fill_with_canary_pattern( my_dummy_slot.task_pool, T, my_arena_slot->tail );
+ memmove( my_arena_slot->task_pool_ptr, my_arena_slot->task_pool_ptr + H, T * sizeof(task*) );
+ my_arena_slot->fill_with_canary_pattern( T, my_arena_slot->tail );
commit_relocated_tasks(T);
}
else {
// Grow task pool. As this operation is rare, and its cost is asymptotically
// amortizable, we can tolerate new task pool allocation done under the lock.
- if ( new_size < 2 * my_task_pool_size )
- new_size = 2 * my_task_pool_size;
- task** old_pool = my_dummy_slot.task_pool;
- my_dummy_slot.task_pool = allocate_task_pool( new_size ); // updates my_task_pool_size
- __TBB_ASSERT( T <= my_task_pool_size, "new task pool is too short" );
- memcpy( my_dummy_slot.task_pool, old_pool + H, T * sizeof(task*) );
+ if ( new_size < 2 * my_arena_slot->my_task_pool_size )
+ new_size = 2 * my_arena_slot->my_task_pool_size;
+ task** old_pool = my_arena_slot->task_pool_ptr;
+ my_arena_slot->allocate_task_pool( new_size ); // updates my_task_pool_size
+ __TBB_ASSERT( T <= my_arena_slot->my_task_pool_size, "new task pool is too short" );
+ memcpy( my_arena_slot->task_pool_ptr, old_pool + H, T * sizeof(task*) );
commit_relocated_tasks(T);
- free_task_pool( old_pool );
+ __TBB_ASSERT( old_pool, "attempt to free NULL TaskPool" );
+ NFS_Free( old_pool );
}
assert_task_pool_valid();
return T;
@@ -457,11 +487,10 @@ inline void generic_scheduler::acquire_task_pool() const {
// Local copy of the arena slot task pool pointer is necessary for the next
// assertion to work correctly to exclude asynchronous state transition effect.
task** tp = my_arena_slot->task_pool;
- __TBB_ASSERT( tp == LockedTaskPool || tp == my_dummy_slot.task_pool, "slot ownership corrupt?" );
+ __TBB_ASSERT( tp == LockedTaskPool || tp == my_arena_slot->task_pool_ptr, "slot ownership corrupt?" );
#endif
if( my_arena_slot->task_pool != LockedTaskPool &&
- __TBB_CompareAndSwapW( &my_arena_slot->task_pool, (intptr_t)LockedTaskPool,
- (intptr_t)my_dummy_slot.task_pool ) == (intptr_t)my_dummy_slot.task_pool )
+ as_atomic(my_arena_slot->task_pool).compare_and_swap(LockedTaskPool, my_arena_slot->task_pool_ptr ) == my_arena_slot->task_pool_ptr )
{
// We acquired our own slot
ITT_NOTIFY(sync_acquired, my_arena_slot);
@@ -484,7 +513,7 @@ inline void generic_scheduler::release_task_pool() const {
__TBB_ASSERT( my_arena_slot, "we are not in arena" );
__TBB_ASSERT( my_arena_slot->task_pool == LockedTaskPool, "arena slot is not locked" );
ITT_NOTIFY(sync_releasing, my_arena_slot);
- __TBB_store_with_release( my_arena_slot->task_pool, my_dummy_slot.task_pool );
+ __TBB_store_with_release( my_arena_slot->task_pool, my_arena_slot->task_pool_ptr );
}
/** ATTENTION:
@@ -509,8 +538,7 @@ inline task** generic_scheduler::lock_task_pool( arena_slot* victim_arena_slot )
break;
}
if( victim_task_pool != LockedTaskPool &&
- __TBB_CompareAndSwapW( &victim_arena_slot->task_pool,
- (intptr_t)LockedTaskPool, (intptr_t)victim_task_pool ) == (intptr_t)victim_task_pool )
+ as_atomic(victim_arena_slot->task_pool).compare_and_swap(LockedTaskPool, victim_task_pool ) == victim_task_pool )
{
// We've locked victim's task pool
ITT_NOTIFY(sync_acquired, victim_arena_slot);
@@ -523,7 +551,20 @@ inline task** generic_scheduler::lock_task_pool( arena_slot* victim_arena_slot )
}
GATHER_STATISTIC( ++my_counters.thieves_conflicts );
// Someone else acquired a lock, so pause and do exponential backoff.
+#if __TBB_STEALING_ABORT_ON_CONTENTION
+ if(!backoff.bounded_pause()) {
+ // the 16 was acquired empirically and a theory behind it supposes
+ // that number of threads becomes much bigger than number of
+ // tasks which can be spawned by one thread causing excessive contention.
+ // TODO: However even small arenas can benefit from the abort on contention
+ // if preemption of a thief is a problem
+ if(my_arena->my_limit >= 16)
+ return EmptyTaskPool;
+ __TBB_Yield();
+ }
+#else
backoff.pause();
+#endif
}
__TBB_ASSERT( victim_task_pool == EmptyTaskPool ||
(victim_arena_slot->task_pool == LockedTaskPool && victim_task_pool != LockedTaskPool),
@@ -580,7 +621,7 @@ void generic_scheduler::local_spawn( task& first, task*& next ) {
if ( &first.prefix().next == &next ) {
// Single task is being spawned
size_t T = prepare_task_pool( 1 );
- my_dummy_slot.task_pool[T] = prepare_for_spawning( &first );
+ my_arena_slot->task_pool_ptr[T] = prepare_for_spawning( &first );
commit_spawned_tasks( T + 1 );
}
else {
@@ -600,7 +641,7 @@ void generic_scheduler::local_spawn( task& first, task*& next ) {
}
size_t num_tasks = tasks.size();
size_t T = prepare_task_pool( num_tasks );
- tasks.copy_memory( my_dummy_slot.task_pool + T );
+ tasks.copy_memory( my_arena_slot->task_pool_ptr + T );
commit_spawned_tasks( T + num_tasks );
}
if ( !in_arena() )
@@ -630,60 +671,19 @@ void generic_scheduler::local_spawn_root_and_wait( task& first, task*& next ) {
local_wait_for_all( dummy, &first );
}
-inline task* generic_scheduler::get_mailbox_task() {
- __TBB_ASSERT( my_affinity_id>0, "not in arena" );
- while ( task_proxy* const tp = my_inbox.pop() ) {
- if ( task* result = tp->extract_task<task_proxy::mailbox_bit>() ) {
- ITT_NOTIFY( sync_acquired, my_inbox.outbox() );
- result->prefix().extra_state |= es_task_is_stolen;
- return result;
- }
- // We have exclusive access to the proxy, and can destroy it.
- free_task<small_task>(*tp);
- }
- return NULL;
+void tbb::internal::generic_scheduler::spawn( task& first, task*& next ) {
+ governor::local_scheduler()->local_spawn( first, next );
}
-void generic_scheduler::local_enqueue( task& t
-#if __TBB_TASK_PRIORITY
- , priority_t prio
-#endif /* __TBB_TASK_PRIORITY */
- )
-{
- __TBB_ASSERT( governor::is_set(this), NULL );
- __TBB_ASSERT( t.state()==task::allocated, "attempt to enqueue task that is not in 'allocated' state" );
- t.prefix().state = task::ready;
- t.prefix().extra_state |= es_task_enqueued; // enqueued task marker
-
-#if TBB_USE_ASSERT
- if( task* parent = t.parent() ) {
- internal::reference_count ref_count = parent->prefix().ref_count;
- __TBB_ASSERT( ref_count>=0, "attempt to enqueue task whose parent has a ref_count<0" );
- __TBB_ASSERT( ref_count!=0, "attempt to enqueue task whose parent has a ref_count==0 (forgot to set_ref_count?)" );
- parent->prefix().extra_state |= es_ref_count_active;
- }
- __TBB_ASSERT(t.prefix().affinity==affinity_id(0), "affinity is ignored for enqueued tasks");
-#endif /* TBB_USE_ASSERT */
+void tbb::internal::generic_scheduler::spawn_root_and_wait( task& first, task*& next ) {
+ governor::local_scheduler()->local_spawn_root_and_wait( first, next );
+}
- __TBB_ASSERT( my_arena, "thread is not in any arena" );
-#if __TBB_TASK_PRIORITY
- intptr_t p = prio ? normalize_priority(prio) : normalized_normal_priority;
- assert_priority_valid(p);
- task_stream &ts = my_arena->my_task_stream[p];
-#else /* !__TBB_TASK_PRIORITY */
- task_stream &ts = my_arena->my_task_stream;
-#endif /* !__TBB_TASK_PRIORITY */
- ITT_NOTIFY(sync_releasing, &ts);
- ts.push( &t, my_arena_slot->hint_for_push );
-#if __TBB_TASK_PRIORITY
- if ( p != my_arena->my_top_priority )
- my_market->update_arena_priority( *my_arena, p );
-#endif /* __TBB_TASK_PRIORITY */
- my_arena->advertise_new_work< /*Spawned=*/ false >();
-#if __TBB_TASK_PRIORITY
- if ( p != my_arena->my_top_priority )
- my_market->update_arena_priority( *my_arena, p );
-#endif /* __TBB_TASK_PRIORITY */
+void tbb::internal::generic_scheduler::enqueue( task& t, void* prio ) {
+ generic_scheduler *s = governor::local_scheduler();
+ // these redirections are due to bw-compatibility, consider reworking some day
+ __TBB_ASSERT( s->my_arena, "thread is not in any arena" );
+ s->my_arena->enqueue_task(t, (intptr_t)prio, s->hint_for_push );
}
inline task* generic_scheduler::dequeue_task() {
@@ -752,7 +752,7 @@ task* generic_scheduler::winnow_task_pool () {
dst = T0;
// Find the first task to offload.
for ( src = H; src < T0; ++src ) {
- task &t = *my_dummy_slot.task_pool[src];
+ task &t = *my_arena_slot->task_pool_ptr[src];
intptr_t p = priority(t);
if ( p < *my_ref_top_priority ) {
// Position of the first offloaded task will be the starting point
@@ -763,31 +763,31 @@ task* generic_scheduler::winnow_task_pool () {
}
}
for ( ++src; src < T0; ++src ) {
- task &t = *my_dummy_slot.task_pool[src];
+ task &t = *my_arena_slot->task_pool_ptr[src];
intptr_t p = priority(t);
if ( p < *my_ref_top_priority )
offload_task( t, p );
else
- my_dummy_slot.task_pool[dst++] = &t;
+ my_arena_slot->task_pool_ptr[dst++] = &t;
}
__TBB_ASSERT( T0 >= dst, NULL );
- task *t = H < dst ? my_dummy_slot.task_pool[--dst] : NULL;
+ task *t = H < dst ? my_arena_slot->task_pool_ptr[--dst] : NULL;
if ( H == dst ) {
// No tasks remain the primary pool
reset_deque_and_leave_arena( acquired );
}
else if ( acquired ) {
- __TBB_ASSERT( !is_poisoned(my_dummy_slot.task_pool[H]), NULL );
+ __TBB_ASSERT( !is_poisoned(my_arena_slot->task_pool_ptr[H]), NULL );
__TBB_store_relaxed( my_arena_slot->tail, dst );
release_task_pool();
}
else {
- __TBB_ASSERT( !is_poisoned(my_dummy_slot.task_pool[H]), NULL );
+ __TBB_ASSERT( !is_poisoned(my_arena_slot->task_pool_ptr[H]), NULL );
// Release fence is necessary to make sure possibly relocated task pointers
// become visible to potential thieves
__TBB_store_with_release( my_arena_slot->tail, dst );
}
- fill_with_canary_pattern( my_dummy_slot.task_pool, dst, T0 );
+ my_arena_slot->fill_with_canary_pattern( dst, T0 );
assert_task_pool_valid();
return t;
}
@@ -831,16 +831,16 @@ task* generic_scheduler::reload_tasks ( task*& offloaded_tasks, task**& offloade
if ( num_tasks ) {
GATHER_STATISTIC( ++my_counters.prio_tasks_reloaded );
size_t T = prepare_task_pool( num_tasks );
- tasks.copy_memory( my_dummy_slot.task_pool + T );
+ tasks.copy_memory( my_arena_slot->task_pool_ptr + T );
if ( --num_tasks ) {
commit_spawned_tasks( T += num_tasks );
enter_arena();
my_arena->advertise_new_work</*Spawned=*/true>();
}
__TBB_ASSERT( T == __TBB_load_relaxed(my_arena_slot->tail), NULL );
- __TBB_ASSERT( T < my_task_pool_size, NULL );
- t = my_dummy_slot.task_pool[T];
- poison_pointer(my_dummy_slot.task_pool[T]);
+ __TBB_ASSERT( T < my_arena_slot->my_task_pool_size, NULL );
+ t = my_arena_slot->task_pool_ptr[T];
+ poison_pointer(my_arena_slot->task_pool_ptr[T]);
assert_task_pool_valid();
}
return t;
@@ -886,10 +886,9 @@ retry:
size_t H = __TBB_load_relaxed(my_arena_slot->head); // mirror
if ( (intptr_t)H <= (intptr_t)T ) {
// The thief backed off - grab the task
- // Task pool pointer from our arena slot is garbled by above taken lock.
- result = my_dummy_slot.task_pool[T];
+ result = my_arena_slot->task_pool_ptr[T];
__TBB_ASSERT( !is_poisoned(result), NULL );
- poison_pointer( my_dummy_slot.task_pool[T] );
+ poison_pointer( my_arena_slot->task_pool_ptr[T] );
}
else {
__TBB_ASSERT ( H == __TBB_load_relaxed(my_arena_slot->head)
@@ -903,9 +902,9 @@ retry:
}
else {
__TBB_control_consistency_helper(); // on my_arena_slot->head
- result = my_dummy_slot.task_pool[T];
+ result = my_arena_slot->task_pool_ptr[T];
__TBB_ASSERT( !is_poisoned(result), NULL );
- poison_pointer( my_dummy_slot.task_pool[T] );
+ poison_pointer( my_arena_slot->task_pool_ptr[T] );
}
if( result && is_proxy(*result) ) {
task_proxy &tp = *(task_proxy*)result;
@@ -964,6 +963,8 @@ retry:
}
}
__TBB_ASSERT( result, NULL );
+ // emit "task was consumed" signal
+ ITT_NOTIFY(sync_acquired, (void*)((uintptr_t)&victim_slot+sizeof(uintptr_t)));
const size_t H1 = H0 + 1;
if ( H1 < H ) {
// Some proxies in the task pool have been bypassed. Need to close
@@ -983,8 +984,13 @@ retry:
}
poison_pointer( victim_pool[H0] );
}
+
unlock_task_pool( &victim_slot, victim_pool );
__TBB_ASSERT( skip_and_bump <= 2, NULL );
+#if __TBB_PREFETCHING
+ __TBB_cl_evict(&victim_slot.head);
+ __TBB_cl_evict(&victim_slot.tail);
+#endif
if( --skip_and_bump > 0 ) { // if both: task skipped and head&tail bumped
// Synchronize with snapshot as we bumped head and tail which can falsely trigger EMPTY state
atomic_fence();
@@ -993,28 +999,31 @@ retry:
return result;
}
-inline void generic_scheduler::do_enter_arena() {
- my_arena_slot = &my_arena->my_slots[my_arena_index];
- __TBB_ASSERT ( is_quiescent_local_task_pool_empty(), "task deque of a free slot must be empty" );
- const size_t H = __TBB_load_relaxed(my_dummy_slot.head); // mirror
- const size_t T = __TBB_load_relaxed(my_dummy_slot.tail); // mirror
- __TBB_ASSERT ( H < T, "entering arena without tasks to share" );
- __TBB_store_relaxed(my_arena_slot->head, H);
- __TBB_store_relaxed(my_arena_slot->tail, T);
- // Release signal on behalf of previously spawned tasks (when this thread was not in arena yet)
- ITT_NOTIFY(sync_releasing, my_arena_slot);
- __TBB_store_with_release( my_arena_slot->task_pool, my_dummy_slot.task_pool );
- // We'll leave arena only when it's empty, so clean up local instances of indices.
- __TBB_store_relaxed(my_dummy_slot.head, /*dead: H =*/ 0);
- __TBB_store_relaxed(my_dummy_slot.tail, /*dead: T =*/ 0);
+inline task* generic_scheduler::get_mailbox_task() {
+ __TBB_ASSERT( my_affinity_id>0, "not in arena" );
+ while ( task_proxy* const tp = my_inbox.pop() ) {
+ if ( task* result = tp->extract_task<task_proxy::mailbox_bit>() ) {
+ ITT_NOTIFY( sync_acquired, my_inbox.outbox() );
+ result->prefix().extra_state |= es_task_is_stolen;
+ return result;
+ }
+ // We have exclusive access to the proxy, and can destroy it.
+ free_task<small_task>(*tp);
+ }
+ return NULL;
}
+// TODO: Rename to publish_task_pool
void generic_scheduler::enter_arena() {
__TBB_ASSERT ( my_arena, "no arena: initialization not completed?" );
- __TBB_ASSERT ( !in_arena(), "Repeated entry into arena attempted" );
__TBB_ASSERT ( my_arena_index < my_arena->my_num_slots, "arena slot index is out-of-bound" );
- __TBB_ASSERT ( my_arena->my_slots[my_arena_index].task_pool == EmptyTaskPool, "someone else grabbed my arena slot?" );
- do_enter_arena();
+ __TBB_ASSERT ( my_arena_slot == &my_arena->my_slots[my_arena_index], NULL);
+ __TBB_ASSERT ( my_arena_slot->task_pool == EmptyTaskPool, "someone else grabbed my arena slot?" );
+ __TBB_ASSERT ( __TBB_load_relaxed(my_arena_slot->head) < __TBB_load_relaxed(my_arena_slot->tail),
+ "entering arena without tasks to share" );
+ // Release signal on behalf of previously spawned tasks (when this thread was not in arena yet)
+ ITT_NOTIFY(sync_releasing, my_arena_slot);
+ __TBB_store_with_release( my_arena_slot->task_pool, my_arena_slot->task_pool_ptr );
}
void generic_scheduler::leave_arena() {
@@ -1028,11 +1037,10 @@ void generic_scheduler::leave_arena() {
// accesses to the local task pool when becomes visible. Thus it is harmless
// if it gets hoisted above preceding local bookkeeping manipulations.
__TBB_store_relaxed( my_arena_slot->task_pool, EmptyTaskPool );
- my_arena_slot = &my_dummy_slot;
}
generic_scheduler* generic_scheduler::create_worker( market& m, size_t index ) {
- generic_scheduler* s = allocate_scheduler( NULL, index );
+ generic_scheduler* s = allocate_scheduler( NULL, index ); // index is not a real slot in arena
#if __TBB_TASK_GROUP_CONTEXT
s->my_dummy_task->prefix().context = &the_dummy_context;
// Sync up the local cancellation state with the global one. No need for fence here.
@@ -1047,6 +1055,7 @@ generic_scheduler* generic_scheduler::create_worker( market& m, size_t index ) {
return s;
}
+// TODO: make it a member method
generic_scheduler* generic_scheduler::create_master( arena& a ) {
generic_scheduler* s = allocate_scheduler( &a, 0 /*Master thread always occupies the first slot*/ );
task& t = *s->my_dummy_task;
@@ -1059,13 +1068,13 @@ generic_scheduler* generic_scheduler::create_master( arena& a ) {
// Context to be used by root tasks by default (if the user has not specified one).
// Allocation is done by NFS allocator because we cannot reuse memory allocated
// for task objects since the free list is empty at the moment.
- t.prefix().context = a.my_master_default_ctx =
- new ( NFS_Allocate(sizeof(task_group_context), 1, NULL) ) task_group_context(task_group_context::isolated);
+ t.prefix().context = a.my_default_ctx;
#endif /* __TBB_TASK_GROUP_CONTEXT */
s->my_market = a.my_market;
__TBB_ASSERT( s->my_arena_index == 0, "Master thread must occupy the first slot in its arena" );
s->attach_mailbox(1);
- a.my_slots[0].my_scheduler = s;
+ s->my_arena_slot = a.my_slots + 0;
+ s->my_arena_slot->my_scheduler = s;
#if _WIN32|_WIN64
__TBB_ASSERT( s->my_market, NULL );
s->my_market->register_master( s->master_exec_resource );
@@ -1086,31 +1095,28 @@ generic_scheduler* generic_scheduler::create_master( arena& a ) {
#endif /* __TBB_TASK_PRIORITY */
#if __TBB_SCHEDULER_OBSERVER
// Process any existing observers.
- s->notify_entry_observers();
+ __TBB_ASSERT( a.my_observers.empty(), "Just created arena cannot have any observers associated with it" );
+ the_global_observer_list.notify_entry_observers( s->my_last_global_observer, /*worker=*/false );
#endif /* __TBB_SCHEDULER_OBSERVER */
return s;
}
void generic_scheduler::cleanup_worker( void* arg, bool worker ) {
generic_scheduler& s = *(generic_scheduler*)arg;
- __TBB_ASSERT( s.my_dummy_slot.task_pool, "cleaning up worker with missing task pool" );
+ __TBB_ASSERT( !s.my_arena_slot, "cleaning up attached worker" );
#if __TBB_SCHEDULER_OBSERVER
- s.notify_exit_observers( worker );
+ if ( worker ) // can be called by master for worker, do not notify master twice
+ the_global_observer_list.notify_exit_observers( s.my_last_global_observer, /*worker=*/true );
#endif /* __TBB_SCHEDULER_OBSERVER */
- // When comparing "head" and "tail" indices ">=" is used because this worker's
- // task pool may still be published in the arena, and thieves can optimistically
- // bump "head" (and then roll back).
- __TBB_ASSERT( s.my_arena_slot->task_pool == EmptyTaskPool
- || __TBB_load_relaxed(s.my_arena_slot->head) >= __TBB_load_relaxed(s.my_arena_slot->tail),
- "worker has unfinished work at run down" );
s.free_scheduler();
}
void generic_scheduler::cleanup_master() {
generic_scheduler& s = *this; // for similarity with cleanup_worker
- __TBB_ASSERT( s.my_dummy_slot.task_pool, "cleaning up master with missing task pool" );
+ __TBB_ASSERT( s.my_arena_slot, NULL);
#if __TBB_SCHEDULER_OBSERVER
- s.notify_exit_observers(/*worker=*/false);
+ s.my_arena->my_observers.notify_exit_observers( s.my_last_local_observer, /*worker=*/false );
+ the_global_observer_list.notify_exit_observers( s.my_last_global_observer, /*worker=*/false );
#endif /* __TBB_SCHEDULER_OBSERVER */
if( in_arena() ) {
acquire_task_pool();
@@ -1129,24 +1135,27 @@ void generic_scheduler::cleanup_master() {
__TBB_ASSERT ( governor::is_set(this), "Other thread reused our TLS key during the task pool cleanup" );
}
}
-#if _WIN32|_WIN64
__TBB_ASSERT( s.my_market, NULL );
+ market *my_market = s.my_market;
+#if _WIN32|_WIN64
s.my_market->unregister_master( s.master_exec_resource );
#endif /* _WIN32|_WIN64 */
arena* a = s.my_arena;
+ __TBB_ASSERT(a->my_slots+0 == my_arena_slot, NULL);
#if __TBB_STATISTICS
- *a->my_slots[0].my_counters += s.my_counters;
+ *my_arena_slot->my_counters += s.my_counters;
#endif /* __TBB_STATISTICS */
#if __TBB_TASK_PRIORITY
- __TBB_ASSERT( a->my_slots[0].my_scheduler, NULL );
+ __TBB_ASSERT( my_arena_slot->my_scheduler, NULL );
// Master's scheduler may be locked by a worker taking arena snapshot or by
// a thread propagating task group state change across the context tree.
- while ( __TBB_CompareAndSwapW(&a->my_slots[0].my_scheduler, 0, (intptr_t)this) != (intptr_t)this )
+ while ( as_atomic(my_arena_slot->my_scheduler).compare_and_swap(NULL, this) != this )
__TBB_Yield();
- __TBB_ASSERT( !a->my_slots[0].my_scheduler, NULL );
+ __TBB_ASSERT( !my_arena_slot->my_scheduler, NULL );
#else /* !__TBB_TASK_PRIORITY */
- a->my_slots[0].my_scheduler = NULL;
+ __TBB_store_with_release(my_arena_slot->my_scheduler, (generic_scheduler*)NULL);
#endif /* __TBB_TASK_PRIORITY */
+ my_arena_slot = NULL; // detached from slot
s.free_scheduler();
// Resetting arena to EMPTY state (as earlier TBB versions did) should not be
// done here (or anywhere else in the master thread to that matter) because
@@ -1157,19 +1166,13 @@ void generic_scheduler::cleanup_master() {
#if __TBB_STATISTICS_EARLY_DUMP
GATHER_STATISTIC( a->dump_arena_statistics() );
#endif
- a->on_thread_leaving( /*is_master*/ true );
+ if (governor::needsWaitWorkers())
+ my_market->prepare_wait_workers();
+ a->on_thread_leaving</*is_master*/true>();
+ if (governor::needsWaitWorkers())
+ my_market->wait_workers();
}
-#if __TBB_SCHEDULER_OBSERVER
- void generic_scheduler::notify_entry_observers() {
- my_local_last_observer_proxy = observer_proxy::process_list(my_local_last_observer_proxy,is_worker(),/*is_entry=*/true);
- }
-
- void generic_scheduler::notify_exit_observers( bool worker ) {
- observer_proxy::process_list(my_local_last_observer_proxy,worker,/*is_entry=*/false);
- }
-#endif /* __TBB_SCHEDULER_OBSERVER */
-
} // namespace internal
} // namespace tbb
diff --git a/src/tbb/scheduler.h b/src/tbb/scheduler.h
index 9260cff..89f08e8 100644
--- a/src/tbb/scheduler.h
+++ b/src/tbb/scheduler.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,6 +30,7 @@
#define _TBB_scheduler_H
#include "scheduler_common.h"
+#include "tbb/spin_mutex.h"
#include "mailbox.h"
#include "tbb_misc.h" // for FastRandom
#include "itt_notify.h"
@@ -69,6 +70,43 @@ class task_scheduler_observer_v3;
class observer_proxy;
#endif /* __TBB_SCHEDULER_OBSERVER */
+struct scheduler_state {
+ //! Index of the arena slot the scheduler occupies now, or occupied last time.
+ size_t my_arena_index;
+
+ //! Pointer to the slot in the arena we own at the moment.
+ arena_slot* my_arena_slot;
+
+ //! The arena that I own (if master) or am servicing at the moment (if worker)
+ arena* my_arena;
+
+ //! Innermost task whose task::execute() is running.
+ task* my_innermost_running_task;
+
+ //! Task, in the context of which the current TBB dispatch loop is running.
+ /** Outside of or in the outermost dispatch loop (not in a nested call to
+ wait_for_all) it is my_dummy_task for master threads, and NULL for workers. **/
+ task* my_dispatching_task;
+
+ mail_inbox my_inbox;
+
+ //! The mailbox id assigned to this scheduler.
+ /** The id is assigned upon first entry into the arena.
+ TODO: how are id's being garbage collected?
+ TODO: master thread may enter arena and leave and then reenter.
+ We want to give it the same affinity_id upon reentry, if practical.
+ */
+ affinity_id my_affinity_id;
+
+#if __TBB_SCHEDULER_OBSERVER
+ //! Last observer in the global observers list processed by this scheduler
+ observer_proxy* my_last_global_observer;
+
+ //! Last observer in the local observers list processed by this scheduler
+ observer_proxy* my_last_local_observer;
+#endif /* __TBB_SCHEDULER_OBSERVER */
+};
+
//! Work stealing task scheduler.
/** None of the fields here are ever read or written by threads other than
the thread that creates the instance.
@@ -76,10 +114,16 @@ class observer_proxy;
Class generic_scheduler is an abstract base class that contains most of the scheduler,
except for tweaks specific to processors and tools (e.g. VTune).
The derived template class custom_scheduler<SchedulerTraits> fills in the tweaks. */
-class generic_scheduler: public scheduler, public ::rml::job {
+class generic_scheduler: public scheduler, public ::rml::job, private scheduler_state {
friend class tbb::task;
friend class market;
friend class arena;
+#if __TBB_TASK_ARENA
+ friend class interface6::task_arena;
+ friend class interface6::delegated_task;
+ friend class interface6::wait_task;
+ friend struct interface6::wait_body;
+#endif //__TBB_TASK_ARENA
friend class allocate_root_proxy;
friend class governor;
#if __TBB_TASK_GROUP_CONTEXT
@@ -108,16 +152,7 @@ class generic_scheduler: public scheduler, public ::rml::job {
static const size_t null_arena_index = ~size_t(0);
- //! Index of the arena slot the scheduler occupies now, or occupied last time.
- size_t my_arena_index;
-
- //! Capacity of the primary task pool (number of elements - pointers to task).
- size_t my_task_pool_size;
-
- //! Pointer to the slot in the arena we own at the moment.
- /** When out of arena it points to this scheduler's my_dummy_slot. **/
- arena_slot* my_arena_slot;
-
+ // TODO: Rename into is_task_pool_published()
inline bool in_arena () const;
inline bool is_local_task_pool_quiescent () const;
@@ -129,18 +164,20 @@ class generic_scheduler: public scheduler, public ::rml::job {
//! The market I am in
market* my_market;
- //! The arena that I own (if master) or am servicing at the moment (if worker)
- arena* my_arena;
-
//! Random number generator used for picking a random victim from which to steal.
FastRandom my_random;
+ //! Hint provided for operations with the container of starvation-resistant tasks.
+ /** Modified by the owner thread (during these operations). **/
+ unsigned hint_for_push; //TODO: Replace by my_random?
+
//! Free list of small tasks that can be reused.
task* my_free_list;
- //! Innermost task whose task::execute() is running.
- task* my_innermost_running_task;
-
+#if __TBB_HOARD_NONLOCAL_TASKS
+ //! Free list of small non-local tasks that should be returned or can be reused.
+ task* my_nonlocal_free_list;
+#endif
//! Fake root task created by slave threads.
/** The task is used as the "parent" argument to method wait_for_all. */
task* my_dummy_task;
@@ -149,34 +186,13 @@ class generic_scheduler: public scheduler, public ::rml::job {
/** Number of task_scheduler_init objects that point to this scheduler */
long my_ref_count;
- mail_inbox my_inbox;
-
inline void attach_mailbox( affinity_id id );
- //! The mailbox id assigned to this scheduler.
- /** The id is assigned upon first entry into the arena.
- TODO: how are id's being garbage collected?
- TODO: master thread may enter arena and leave and then reenter.
- We want to give it the same affinity_id upon reentry, if practical.
- */
- affinity_id my_affinity_id;
-
/* A couple of bools can be located here because space is otherwise just padding after my_affinity_id. */
//! True if *this was created by automatic TBB initialization
bool my_auto_initialized;
-#if __TBB_SCHEDULER_OBSERVER
- //! Last observer_proxy processed by this scheduler
- observer_proxy* my_local_last_observer_proxy;
-
- //! Notify any entry observers that have been created since the last call by this thread.
- void notify_entry_observers();
-
- //! Notify all exit observers that this thread is no longer participating in task scheduling.
- void notify_exit_observers( bool is_worker );
-#endif /* __TBB_SCHEDULER_OBSERVER */
-
#if __TBB_COUNT_TASK_NODES
//! Net number of big task objects that have been allocated but not yet freed.
intptr_t my_task_node_count;
@@ -188,6 +204,7 @@ class generic_scheduler: public scheduler, public ::rml::job {
//! Returns true if stealing is allowed
bool can_steal () {
int anchor;
+ // TODO IDEA: Add performance warning?
#if __TBB_ipf
return my_stealing_threshold < (uintptr_t)&anchor && (uintptr_t)__TBB_get_bsp() < my_rsb_stealing_threshold;
#else
@@ -221,12 +238,12 @@ class generic_scheduler: public scheduler, public ::rml::job {
//! Locks the local task pool
/** Garbles my_arena_slot->task_pool for the duration of the lock. Requires
- correctly set my_dummy_slot.task_pool. **/
+ correctly set my_arena_slot->task_pool_ptr. **/
void acquire_task_pool() const;
//! Unlocks the local task pool
/** Restores my_arena_slot->task_pool munged by acquire_task_pool. Requires
- correctly set my_dummy_slot.task_pool. **/
+ correctly set my_arena_slot->task_pool_ptr. **/
void release_task_pool() const;
//! Checks if t is affinitized to another thread, and if so, bundles it as proxy.
@@ -237,7 +254,7 @@ class generic_scheduler: public scheduler, public ::rml::job {
inline void commit_spawned_tasks( size_t new_tail );
//! Makes relocated tasks visible to thieves and releases the local task pool.
- /** Obviously, the task pool must be locked when caaling this method. **/
+ /** Obviously, the task pool must be locked when calling this method. **/
inline void commit_relocated_tasks( size_t new_tail );
//! Get a task from the local pool.
@@ -272,15 +289,6 @@ class generic_scheduler: public scheduler, public ::rml::job {
4 nested parallel_for calls with iteration space of 65535 grains each. **/
static const size_t min_task_pool_size = 64;
- //! Allocate task pool containing at least n elements.
- inline task** allocate_task_pool( size_t n );
-
- //! Deallocate task pool that was allocated by means of allocate_task_pool.
- static void free_task_pool( task** pool ) {
- __TBB_ASSERT( pool, "attempt to free NULL TaskPool" );
- NFS_Free( pool );
- }
-
//! Makes sure that the task pool can accommodate at least n more elements
/** If necessary relocates existing task pointers or grows the ready task deque.
Returns (possible updated) tail index (not accounting for n). **/
@@ -309,27 +317,20 @@ protected:
void assert_task_pool_valid() const {}
#endif /* TBB_USE_ASSERT <= 1 */
-#if TBB_USE_ASSERT
- static void fill_with_canary_pattern ( task** task_pool, size_t first, size_t last );
-#else
- static void fill_with_canary_pattern ( task**, size_t, size_t ) {}
-#endif /* !TBB_USE_ASSERT */
-
public:
- /*override*/
- inline void spawn( task& first, task*& next );
+#if __TBB_TASK_ARENA
+ template<typename Body>
+ void nested_arena_execute(arena*, task*, bool, Body&);
+#endif
/*override*/
- inline void spawn_root_and_wait( task& first, task*& next );
+ void spawn( task& first, task*& next );
/*override*/
- inline void enqueue( task&, void* reserved );
+ void spawn_root_and_wait( task& first, task*& next );
-#if __TBB_TASK_PRIORITY
- void local_enqueue( task&, priority_t prio );
-#else /* !__TBB_TASK_PRIORITY */
- void local_enqueue( task& );
-#endif /* !__TBB_TASK_PRIORITY */
+ /*override*/
+ void enqueue( task&, void* reserved );
void local_spawn( task& first, task*& next );
void local_spawn_root_and_wait( task& first, task*& next );
@@ -360,11 +361,14 @@ public:
dispatch loop (one of wait_for_all methods) invoked directly from that thread. **/
inline bool master_outermost_level () const;
+ //! True if the scheduler is on the outermost dispatch level in a worker thread.
+ inline bool worker_outermost_level () const;
+
#if __TBB_TASK_GROUP_CONTEXT
//! Returns task group context used by this scheduler instance.
/** This context is associated with root tasks created by a master thread
without explicitly specified context object outside of any running task.
-
+
Note that the default context of a worker thread is never accessed by
user code (directly or indirectly). **/
inline task_group_context* default_context ();
@@ -402,6 +406,7 @@ public:
context_list_node_t my_context_list_head;
//! Mutex protecting access to the list of task group contexts.
+ // TODO: check whether it can be deadly preempted and replace by spinning/sleeping mutex
spin_mutex my_context_list_mutex;
//! Last state propagation epoch known to this thread
@@ -419,15 +424,7 @@ public:
lock-free. **/
tbb::atomic<uintptr_t> my_local_ctx_list_update;
- //! Task, in the context of which the current TBB dispatch loop is running.
- /** Outside of or in the outermost dispatch loop (not in a nested call to
- wait_for_all) it is my_dummy_task for master threads, and NULL for workers. **/
- task* my_dispatching_task;
-
#if __TBB_TASK_PRIORITY
- //! True if the scheduler is on the outermost dispatch level in a worker thread.
- inline bool worker_outermost_level () const;
-
//! Returns reference priority used to decide whether a task should be offloaded.
inline intptr_t effective_reference_priority () const;
@@ -435,7 +432,8 @@ public:
/** Master threads currently tracks only tasks in their arenas, while workers
take into account global top priority (among all arenas in the market). **/
volatile intptr_t *my_ref_top_priority;
-
+
+ // TODO: move into slots and fix is_out_of_work
//! Task pool for offloading tasks with priorities lower than the current top priority.
task* my_offloaded_tasks;
@@ -481,12 +479,6 @@ private:
::rml::server::execution_resource_t master_exec_resource;
#endif /* _WIN32||_WIN64 */
- //! Dummy slot used when scheduler is not in arena
- /** The data structure is heavily padded, therefore it should be placed after
- other data fields used by the owner thread only to allow compiler using
- instructions with short offsets when accessing the majority of data members. **/
- arena_slot my_dummy_slot;
-
#if __TBB_TASK_GROUP_CONTEXT
//! Flag indicating that a context is being destructed by non-owner thread.
/** See also my_local_ctx_list_update. **/
@@ -527,28 +519,15 @@ private:
namespace tbb {
namespace internal {
-inline void tbb::internal::generic_scheduler::spawn( task& first, task*& next ) {
- governor::local_scheduler()->local_spawn( first, next );
-}
-
-inline void tbb::internal::generic_scheduler::spawn_root_and_wait( task& first, task*& next ) {
- governor::local_scheduler()->local_spawn_root_and_wait( first, next );
-}
-
-inline void tbb::internal::generic_scheduler::enqueue( task& t, void* prio ) {
- governor::local_scheduler()->local_enqueue( t
-#if __TBB_TASK_PRIORITY
- , (priority_t)(intptr_t)prio
-#endif /* __TBB_TASK_PRIORITY */
- );
-}
-
inline bool generic_scheduler::in_arena () const {
- return my_arena_slot != &my_dummy_slot;
+ __TBB_ASSERT(my_arena_slot, 0);
+ return my_arena_slot->task_pool != EmptyTaskPool;
}
inline bool generic_scheduler::is_local_task_pool_quiescent () const {
- return !in_arena() || my_arena_slot->task_pool == EmptyTaskPool || my_arena_slot->task_pool == LockedTaskPool;
+ __TBB_ASSERT(my_arena_slot, 0);
+ task** tp = my_arena_slot->task_pool;
+ return tp == EmptyTaskPool || tp == LockedTaskPool;
}
inline bool generic_scheduler::is_quiescent_local_task_pool_empty () const {
@@ -561,11 +540,14 @@ inline bool generic_scheduler::is_quiescent_local_task_pool_reset () const {
return __TBB_load_relaxed(my_arena_slot->head) == 0 && __TBB_load_relaxed(my_arena_slot->tail) == 0;
}
-
inline bool generic_scheduler::master_outermost_level () const {
return my_dispatching_task == my_dummy_task;
}
+inline bool generic_scheduler::worker_outermost_level () const {
+ return !my_dispatching_task;
+}
+
#if __TBB_TASK_GROUP_CONTEXT
inline task_group_context* generic_scheduler::default_context () {
return my_dummy_task->prefix().context;
@@ -579,7 +561,7 @@ inline void generic_scheduler::attach_mailbox( affinity_id id ) {
}
inline bool generic_scheduler::is_worker() {
- return my_arena_index != 0;
+ return my_arena_index != 0; //TODO: rework for multiple master
}
inline unsigned generic_scheduler::number_of_workers_in_my_arena() {
@@ -614,26 +596,18 @@ inline void generic_scheduler::reset_deque_and_leave_arena ( bool locked ) {
leave_arena();
}
-inline task** generic_scheduler::allocate_task_pool( size_t n ) {
- size_t byte_size = ((n * sizeof(task*) + NFS_MaxLineSize - 1) / NFS_MaxLineSize) * NFS_MaxLineSize;
- my_task_pool_size = byte_size / sizeof(task*);
- task** new_pool = (task**)NFS_Allocate( byte_size, 1, NULL );
- // No need to clear the fresh deque since valid items are designated by the head and tail members.
- // But fill it with a canary pattern in the high vigilance debug mode.
- fill_with_canary_pattern( new_pool, 0, my_task_pool_size );
- return new_pool;
-}
-
+//TODO: move to arena_slot
inline void generic_scheduler::commit_spawned_tasks( size_t new_tail ) {
- __TBB_ASSERT ( new_tail <= my_task_pool_size, "task deque end was overwritten" );
- ITT_NOTIFY(sync_releasing, my_arena_slot);
+ __TBB_ASSERT ( new_tail <= my_arena_slot->my_task_pool_size, "task deque end was overwritten" );
+ // emit "task was released" signal
+ ITT_NOTIFY(sync_releasing, (void*)((uintptr_t)my_arena_slot+sizeof(uintptr_t)));
// Release fence is necessary to make sure that previously stored task pointers
// are visible to thieves.
__TBB_store_with_release( my_arena_slot->tail, new_tail );
}
void generic_scheduler::commit_relocated_tasks ( size_t new_tail ) {
- __TBB_ASSERT( my_arena_slot == &my_dummy_slot || my_arena_slot->task_pool == LockedTaskPool,
+ __TBB_ASSERT( is_local_task_pool_quiescent(),
"Task pool must be locked when calling commit_relocated_tasks()" );
__TBB_store_relaxed( my_arena_slot->head, 0 );
// Tail is updated last to minimize probability of a thread making arena
@@ -642,8 +616,14 @@ void generic_scheduler::commit_relocated_tasks ( size_t new_tail ) {
release_task_pool();
}
-template<free_task_hint h>
+template<free_task_hint hint>
void generic_scheduler::free_task( task& t ) {
+#if __TBB_HOARD_NONLOCAL_TASKS
+ // TODO: remove the whole free_task_hint stuff when enabled permanently
+ static const free_task_hint h = no_hint;
+#else
+ static const free_task_hint h = hint;
+#endif
GATHER_STATISTIC(--my_counters.active_tasks);
task_prefix& p = t.prefix();
// Verify that optimization hints are correct.
@@ -658,8 +638,17 @@ void generic_scheduler::free_task( task& t ) {
GATHER_STATISTIC(++my_counters.free_list_length);
p.next = my_free_list;
my_free_list = &t;
+ } else if( p.origin && uintptr_t(p.origin) < uintptr_t(4096) ) {
+ // a special value reserved for future use, do nothing since
+ // origin is not pointing to a scheduler instance
} else if( !(h&local_task) && p.origin ) {
+ GATHER_STATISTIC(++my_counters.free_list_length);
+#if __TBB_HOARD_NONLOCAL_TASKS
+ p.next = my_nonlocal_free_list;
+ my_nonlocal_free_list = &t;
+#else
free_nonlocal_small_task(t);
+#endif
} else {
GATHER_STATISTIC(--my_counters.big_tasks);
deallocate_task(t);
@@ -667,10 +656,6 @@ void generic_scheduler::free_task( task& t ) {
}
#if __TBB_TASK_PRIORITY
-inline bool generic_scheduler::worker_outermost_level () const {
- return !my_dispatching_task;
-}
-
inline intptr_t generic_scheduler::effective_reference_priority () const {
// Workers on the outermost dispatch level (i.e. with empty stack) use market's
// priority as a reference point (to speedup discovering process level priority
diff --git a/src/tbb/scheduler_common.h b/src/tbb/scheduler_common.h
index aab2cf1..1f32baa 100644
--- a/src/tbb/scheduler_common.h
+++ b/src/tbb/scheduler_common.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,6 +30,7 @@
#define _TBB_scheduler_common_H
#include "tbb/tbb_stddef.h"
+#include "tbb/cache_aligned_allocator.h"
#include <string.h> // for memset, memcpy, memmove
@@ -49,14 +50,19 @@
#include "tbb/task.h"
#include "tbb/tbb_exception.h"
+#if __TBB_TASK_ARENA
+#include "tbb/task_arena.h" // for sake of private friends club :( of class arena ):
+#endif //__TBB_TASK_ARENA
#ifdef undef_private
#undef private
#endif
-#if __TBB_TASK_GROUP_CONTEXT
+#ifndef __TBB_SCHEDULER_MUTEX_TYPE
+#define __TBB_SCHEDULER_MUTEX_TYPE tbb::spin_mutex
+#endif
+// TODO: add conditional inclusion based on specified type
#include "tbb/spin_mutex.h"
-#endif /* __TBB_TASK_GROUP_CONTEXT */
// This macro is an attempt to get rid of ugly ifdefs in the shared parts of the code.
// It drops the second argument depending on whether the controlling macro is defined.
@@ -82,6 +88,13 @@
#endif
namespace tbb {
+#if __TBB_TASK_ARENA
+namespace interface6 {
+class delegated_task;
+class wait_task;
+struct wait_body;
+}
+#endif //__TBB_TASK_ARENA
namespace internal {
class generic_scheduler;
@@ -107,6 +120,9 @@ inline intptr_t& priority ( task& t ) {
}
#endif /* __TBB_TASK_PRIORITY */
+//! Mutex type for global locks in the scheduler
+typedef __TBB_SCHEDULER_MUTEX_TYPE scheduler_mutex_type;
+
#if __TBB_TASK_GROUP_CONTEXT
//! Task group state change propagation global epoch
/** Together with generic_scheduler::my_context_state_propagation_epoch forms
@@ -122,7 +138,8 @@ extern uintptr_t the_context_state_propagation_epoch;
//! Mutex guarding state change propagation across task groups forest.
/** Also protects modification of related data structures. **/
-extern spin_mutex the_context_state_propagation_mutex;
+typedef scheduler_mutex_type context_state_propagation_mutex_type;
+extern context_state_propagation_mutex_type the_context_state_propagation_mutex;
#endif /* __TBB_TASK_GROUP_CONTEXT */
//! Alignment for a task object
@@ -172,7 +189,7 @@ enum free_task_hint {
#if TBB_USE_ASSERT
-static const uintptr_t venom = tbb::internal::size_t_select(0xDEADBEEFU,0xDDEEAADDDEADBEEFULL);
+static const uintptr_t venom = tbb::internal::select_size_t_constant<0xDEADBEEFU,0xDDEEAADDDEADBEEFULL>::value;
template <typename T>
void poison_value ( T& val ) { val = * punned_cast<T*>(&venom); }
@@ -186,7 +203,11 @@ inline void assert_task_valid( const task& task ) {
__TBB_ASSERT( &task!=NULL, NULL );
__TBB_ASSERT( !is_poisoned(&task), NULL );
__TBB_ASSERT( (uintptr_t)&task % task_alignment == 0, "misaligned task" );
+#if __TBB_RECYCLE_TO_ENQUEUE
+ __TBB_ASSERT( (unsigned)task.state()<=(unsigned)task::to_enqueue, "corrupt task (invalid state)" );
+#else
__TBB_ASSERT( (unsigned)task.state()<=(unsigned)task::recycle, "corrupt task (invalid state)" );
+#endif
}
#else /* !TBB_USE_ASSERT */
@@ -248,13 +269,13 @@ inline bool ConcurrentWaitsEnabled ( task& t ) { return false; }
//------------------------------------------------------------------------
// arena_slot
//------------------------------------------------------------------------
-
-struct arena_slot {
+struct arena_slot_line1 {
+ //TODO: make this tbb:atomic<>.
//! Scheduler of the thread attached to the slot
/** Marks the slot as busy, and is used to iterate through the schedulers belonging to this arena **/
generic_scheduler* my_scheduler;
- // Task pool (the deque of task pointers) of the scheduler that owns this slot
+ // Synchronization of access to Task pool
/** Also is used to specify if the slot is empty or locked:
0 - empty
-1 - locked **/
@@ -263,29 +284,63 @@ struct arena_slot {
//! Index of the first ready task in the deque.
/** Modified by thieves, and by the owner during compaction/reallocation **/
__TBB_atomic size_t head;
+};
- //! Padding to avoid false sharing caused by the thieves accessing this slot
- char pad1[NFS_MaxLineSize - sizeof(size_t) - sizeof(task**) - sizeof(generic_scheduler*)];
+struct arena_slot_line2 {
+ //! Hint provided for operations with the container of starvation-resistant tasks.
+ /** Modified by the owner thread (during these operations). **/
+ unsigned hint_for_pop;
//! Index of the element following the last ready task in the deque.
/** Modified by the owner thread. **/
__TBB_atomic size_t tail;
- //! Hints provided for operations with the container of starvation-resistant tasks.
- /** Modified by the owner thread (during these operations). **/
- unsigned hint_for_push, hint_for_pop;
+ //! Capacity of the primary task pool (number of elements - pointers to task).
+ size_t my_task_pool_size;
+
+ // Task pool of the scheduler that owns this slot
+ task* *__TBB_atomic task_pool_ptr;
#if __TBB_STATISTICS
//! Set of counters to accumulate internal statistics related to this arena
statistics_counters *my_counters;
#endif /* __TBB_STATISTICS */
- //! Padding to avoid false sharing caused by the thieves accessing the next slot
- char pad2[NFS_MaxLineSize - sizeof(size_t) - 2*sizeof(unsigned)
-#if __TBB_STATISTICS
- - sizeof(statistics_counters*)
-#endif /* __TBB_STATISTICS */
- ];
-}; // class arena_slot
+};
+
+struct arena_slot : padded<arena_slot_line1>, padded<arena_slot_line2> {
+#if TBB_USE_ASSERT
+ void fill_with_canary_pattern ( size_t first, size_t last ) {
+ for ( size_t i = first; i < last; ++i )
+ poison_pointer(task_pool_ptr[i]);
+ }
+#else
+ void fill_with_canary_pattern ( size_t, size_t ) {}
+#endif /* TBB_USE_ASSERT */
+
+ void allocate_task_pool( size_t n ) {
+ size_t byte_size = ((n * sizeof(task*) + NFS_MaxLineSize - 1) / NFS_MaxLineSize) * NFS_MaxLineSize;
+ my_task_pool_size = byte_size / sizeof(task*);
+ task_pool_ptr = (task**)NFS_Allocate( 1, byte_size, NULL );
+ // No need to clear the fresh deque since valid items are designated by the head and tail members.
+ // But fill it with a canary pattern in the high vigilance debug mode.
+ fill_with_canary_pattern( 0, my_task_pool_size );
+ }
+
+ //! Deallocate task pool that was allocated by means of allocate_task_pool.
+ void free_task_pool( ) {
+#if !__TBB_TASK_ARENA
+ __TBB_ASSERT( !task_pool /*TODO: == EmptyTaskPool*/, NULL);
+#else
+ //TODO: understand the assertion and modify
+#endif
+ if( task_pool_ptr ) {
+ __TBB_ASSERT( my_task_pool_size, NULL);
+ NFS_Free( task_pool_ptr );
+ task_pool_ptr = NULL;
+ my_task_pool_size = 0;
+ }
+ }
+};
} // namespace internal
} // namespace tbb
diff --git a/src/tbb/scheduler_utility.h b/src/tbb/scheduler_utility.h
index debba23..3d7b4f4 100644
--- a/src/tbb/scheduler_utility.h
+++ b/src/tbb/scheduler_utility.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -93,7 +93,7 @@ public:
m_size += m_cur_segment_size;
m_cur_segment_size *= 2;
m_pos = m_cur_segment_size;
- m_segments[m_num_segments++] = m_cur_segment = (T*)NFS_Allocate( m_cur_segment_size * sizeof(T), 1, NULL );
+ m_segments[m_num_segments++] = m_cur_segment = (T*)NFS_Allocate( m_cur_segment_size, sizeof(T), NULL );
__TBB_ASSERT ( m_num_segments < max_segments, "Maximal capacity exceeded" );
}
m_cur_segment[--m_pos] = val;
diff --git a/src/tbb/semaphore.cpp b/src/tbb/semaphore.cpp
index ba931af..3490c41 100644
--- a/src/tbb/semaphore.cpp
+++ b/src/tbb/semaphore.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -27,31 +27,29 @@
*/
#include "semaphore.h"
-#if _WIN32||_WIN64
-#if defined(RTL_SRWLOCK_INIT)
+#if __TBB_USE_SRWLOCK
#include "dynamic_link.h" // Refers to src/tbb, not include/tbb
#include "tbb_misc.h"
#endif
-#endif
namespace tbb {
namespace internal {
-#if _WIN32||_WIN64
-#if defined(RTL_SRWLOCK_INIT)
+// TODO: For new win UI port, we can use SRWLock API without dynamic_link etc.
+#if __TBB_USE_SRWLOCK
static atomic<do_once_state> concmon_module_inited;
void WINAPI init_binsem_using_event( SRWLOCK* h_ )
{
srwl_or_handle* shptr = (srwl_or_handle*) h_;
- shptr->h = CreateEvent( NULL, FALSE/*manual reset*/, FALSE/*not signalled initially*/, NULL);
+ shptr->h = CreateEventEx( NULL, NULL, 0, EVENT_ALL_ACCESS|SEMAPHORE_ALL_ACCESS );
}
void WINAPI acquire_binsem_using_event( SRWLOCK* h_ )
{
srwl_or_handle* shptr = (srwl_or_handle*) h_;
- WaitForSingleObject( shptr->h, INFINITE );
+ WaitForSingleObjectEx( shptr->h, INFINITE, FALSE );
}
void WINAPI release_binsem_using_event( SRWLOCK* h_ )
@@ -68,13 +66,17 @@ static void (WINAPI *__TBB_release_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOC
static const dynamic_link_descriptor SRWLLinkTable[] = {
DLD(InitializeSRWLock, __TBB_init_binsem),
DLD(AcquireSRWLockExclusive, __TBB_acquire_binsem),
- DLD(ReleaseRWLockExclusive, __TBB_release_binsem)
+ DLD(ReleaseSRWLockExclusive, __TBB_release_binsem)
};
inline void init_concmon_module()
{
__TBB_ASSERT( (uintptr_t)__TBB_init_binsem==(uintptr_t)&init_binsem_using_event, NULL );
- dynamic_link( "Kernel32.dll", SRWLLinkTable, 3 );
+ if( dynamic_link( "Kernel32.dll", SRWLLinkTable, sizeof(SRWLLinkTable)/sizeof(dynamic_link_descriptor) ) ) {
+ __TBB_ASSERT( (uintptr_t)__TBB_init_binsem!=(uintptr_t)&init_binsem_using_event, NULL );
+ __TBB_ASSERT( (uintptr_t)__TBB_acquire_binsem!=(uintptr_t)&acquire_binsem_using_event, NULL );
+ __TBB_ASSERT( (uintptr_t)__TBB_release_binsem!=(uintptr_t)&release_binsem_using_event, NULL );
+ }
}
binary_semaphore::binary_semaphore() {
@@ -94,8 +96,7 @@ void binary_semaphore::P() { __TBB_acquire_binsem( &my_sem.lock ); }
void binary_semaphore::V() { __TBB_release_binsem( &my_sem.lock ); }
-#endif /* defined(RTL_SRWLOCK_INIT) */
-#endif /* _WIN32||_WIN64 */
+#endif /* __TBB_USE_SRWLOCK */
} // namespace internal
} // namespace tbb
diff --git a/src/tbb/semaphore.h b/src/tbb/semaphore.h
index 3148361..2e98ee8 100644
--- a/src/tbb/semaphore.h
+++ b/src/tbb/semaphore.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -62,12 +62,14 @@ public:
//! dtor
~semaphore() {CloseHandle( sem );}
//! wait/acquire
- void P() {WaitForSingleObject( sem, INFINITE );}
+ void P() {WaitForSingleObjectEx( sem, INFINITE, FALSE );}
//! post/release
void V() {ReleaseSemaphore( sem, 1, NULL );}
private:
HANDLE sem;
- void init_semaphore(size_t start_cnt_) {sem = CreateSemaphore( NULL, LONG(start_cnt_), max_semaphore_cnt, NULL );}
+ void init_semaphore(size_t start_cnt_) {
+ sem = CreateSemaphoreEx( NULL, LONG(start_cnt_), max_semaphore_cnt, NULL, 0, SEMAPHORE_ALL_ACCESS );
+ }
};
#elif __APPLE__
//! Edsger Dijkstra's counting semaphore
@@ -129,22 +131,22 @@ private:
//! for performance reasons, we want specialied binary_semaphore
#if _WIN32||_WIN64
-#if !defined(RTL_SRWLOCK_INIT)
+#if !__TBB_USE_SRWLOCK
//! binary_semaphore for concurrent_monitor
class binary_semaphore : no_copy {
public:
//! ctor
- binary_semaphore() { my_sem = CreateEvent( NULL, FALSE/*manual reset*/, FALSE/*not signalled initially*/, NULL); }
+ binary_semaphore() { my_sem = CreateEventEx( NULL, NULL, 0, EVENT_ALL_ACCESS ); }
//! dtor
~binary_semaphore() { CloseHandle( my_sem ); }
//! wait/acquire
- void P() {WaitForSingleObject( my_sem, INFINITE ); }
+ void P() { WaitForSingleObjectEx( my_sem, INFINITE, FALSE ); }
//! post/release
- void V() {SetEvent( my_sem );}
+ void V() { SetEvent( my_sem ); }
private:
HANDLE my_sem;
};
-#else /* defined(RTL_SRWLOCK_INIT) */
+#else /* __TBB_USE_SRWLOCK */
union srwl_or_handle {
SRWLOCK lock;
@@ -165,7 +167,7 @@ public:
private:
srwl_or_handle my_sem;
};
-#endif /* !defined(RTL_SRWLOCK_INIT) */
+#endif /* !__TBB_USE_SRWLOCK */
#elif __APPLE__
//! binary_semaphore for concurrent monitor
class binary_semaphore : no_copy {
diff --git a/src/tbb/spin_mutex.cpp b/src/tbb/spin_mutex.cpp
index ab09c73..90a5b52 100644
--- a/src/tbb/spin_mutex.cpp
+++ b/src/tbb/spin_mutex.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -36,17 +36,16 @@ namespace tbb {
void spin_mutex::scoped_lock::internal_acquire( spin_mutex& m ) {
__TBB_ASSERT( !my_mutex, "already holding a lock on a spin_mutex" );
ITT_NOTIFY(sync_prepare, &m);
- my_unlock_value = __TBB_LockByte(m.flag);
+ __TBB_LockByte(m.flag);
my_mutex = &m;
ITT_NOTIFY(sync_acquired, &m);
}
void spin_mutex::scoped_lock::internal_release() {
__TBB_ASSERT( my_mutex, "release on spin_mutex::scoped_lock that is not holding a lock" );
- __TBB_ASSERT( !(my_unlock_value&1), "corrupted scoped_lock?" );
ITT_NOTIFY(sync_releasing, my_mutex);
- __TBB_UnlockByte(my_mutex->flag, my_unlock_value);
+ __TBB_UnlockByte(my_mutex->flag);
my_mutex = NULL;
}
@@ -54,7 +53,6 @@ bool spin_mutex::scoped_lock::internal_try_acquire( spin_mutex& m ) {
__TBB_ASSERT( !my_mutex, "already holding a lock on a spin_mutex" );
bool result = bool( __TBB_TryLockByte(m.flag) );
if( result ) {
- my_unlock_value = 0;
my_mutex = &m;
ITT_NOTIFY(sync_acquired, &m);
}
diff --git a/src/tbb/spin_rw_mutex.cpp b/src/tbb/spin_rw_mutex.cpp
index 4323487..586b55b 100644
--- a/src/tbb/spin_rw_mutex.cpp
+++ b/src/tbb/spin_rw_mutex.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -28,6 +28,7 @@
#include "tbb/spin_rw_mutex.h"
#include "tbb/tbb_machine.h"
+#include "tbb/atomic.h"
#include "itt_notify.h"
#if defined(_MSC_VER) && defined(_Wp64)
@@ -41,7 +42,7 @@ template<typename T> // a template can work with private spin_rw_mutex::state_t
static inline T CAS(volatile T &addr, T newv, T oldv) {
// ICC (9.1 and 10.1 tried) unable to do implicit conversion
// from "volatile T*" to "volatile void*", so explicit cast added.
- return T(__TBB_CompareAndSwapW((volatile void *)&addr, (intptr_t)newv, (intptr_t)oldv));
+ return tbb::internal::as_atomic(addr).compare_and_swap( newv, oldv );
}
//! Acquire write lock on the given mutex.
diff --git a/src/tbb/task.cpp b/src/tbb/task.cpp
index 6b0faa4..85794fc 100644
--- a/src/tbb/task.cpp
+++ b/src/tbb/task.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,8 +26,6 @@
the GNU General Public License.
*/
-#include <new>
-
// Do not include task.h directly. Use scheduler_common.h instead
#include "scheduler_common.h"
#include "governor.h"
@@ -37,6 +35,8 @@
#include "tbb/cache_aligned_allocator.h"
#include "tbb/partitioner.h"
+#include <new>
+
namespace tbb {
using namespace std;
@@ -74,7 +74,7 @@ void allocate_root_proxy::free( task& task ) {
task& allocate_root_with_context_proxy::allocate( size_t size ) const {
internal::generic_scheduler* s = governor::local_scheduler();
__TBB_ASSERT( s, "Scheduler auto-initialization failed?" );
- task& t = s->allocate_task( size, __TBB_CONTEXT_ARG(NULL, &my_context) );
+ task& t = s->allocate_task( size, NULL, &my_context );
// Supported usage model prohibits concurrent initial binding. Thus we do not
// need interlocked operations or fences to manipulate with my_context.my_kind
if ( my_context.my_kind == task_group_context::binding_required ) {
diff --git a/src/tbb/task_group_context.cpp b/src/tbb/task_group_context.cpp
index f2c18cb..4026243 100644
--- a/src/tbb/task_group_context.cpp
+++ b/src/tbb/task_group_context.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -288,7 +288,7 @@ void task_group_context::bind_to ( generic_scheduler *local_sched ) {
// repeated under the lock.
if ( local_count_snapshot != the_context_state_propagation_epoch ) {
// Another thread may be propagating state change right now. So resort to lock.
- spin_mutex::scoped_lock lock(the_context_state_propagation_mutex);
+ context_state_propagation_mutex_type::scoped_lock lock(the_context_state_propagation_mutex);
my_cancellation_requested = my_parent->my_cancellation_requested;
#if __TBB_TASK_PRIORITY
my_priority = my_parent->my_priority;
@@ -349,7 +349,7 @@ bool market::propagate_task_group_state ( T task_group_context::*mptr_state, tas
// The whole propagation algorithm is under the lock in order to ensure correctness
// in case of concurrent state changes at the different levels of the context tree.
// See the note 3 at the bottom of scheduler.cpp
- spin_mutex::scoped_lock lock(the_context_state_propagation_mutex);
+ context_state_propagation_mutex_type::scoped_lock lock(the_context_state_propagation_mutex);
if ( src.*mptr_state != new_state )
// Another thread has concurrently changed the state. Back off.
return false;
@@ -370,7 +370,7 @@ bool market::propagate_task_group_state ( T task_group_context::*mptr_state, tas
generic_scheduler *s = slot.my_scheduler;
// If the master is under construction, skip it. Otherwise make sure that it does not
// leave its arena and its scheduler get destroyed while we accessing its data.
- if ( s && __TBB_CompareAndSwapW(&slot.my_scheduler, (intptr_t)LockedMaster, (intptr_t)s) == (intptr_t)s ) {
+ if ( s && as_atomic(slot.my_scheduler).compare_and_swap(LockedMaster, s) == s ) { //TODO: remove need in lock
__TBB_ASSERT( slot.my_scheduler == LockedMaster, NULL );
// The whole propagation sequence is locked, thus no contention is expected
__TBB_ASSERT( s != LockedMaster, NULL );
@@ -389,7 +389,7 @@ bool arena::propagate_task_group_state ( T task_group_context::*mptr_state, task
bool task_group_context::cancel_group_execution () {
__TBB_ASSERT ( my_cancellation_requested == 0 || my_cancellation_requested == 1, "Invalid cancellation state");
- if ( my_cancellation_requested || __TBB_CompareAndSwapW(&my_cancellation_requested, 1, 0) ) {
+ if ( my_cancellation_requested || as_atomic(my_cancellation_requested).compare_and_swap(1, 0) ) {
// This task group has already been canceled
return false;
}
diff --git a/src/tbb/task_stream.h b/src/tbb/task_stream.h
index bba51c9..4ca7c6e 100644
--- a/src/tbb/task_stream.h
+++ b/src/tbb/task_stream.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -76,7 +76,7 @@ inline bool is_bit_set( uintptr_t val, int pos ) {
}
//! The container for "fairness-oriented" aka "enqueued" tasks.
-class task_stream {
+class task_stream : no_copy{
typedef queue_and_mutex <task*, spin_mutex> lane_t;
unsigned N;
uintptr_t population;
@@ -84,14 +84,20 @@ class task_stream {
padded<lane_t>* lanes;
public:
- task_stream() : N(), population(), random(unsigned(&N-(unsigned*)NULL)), lanes()
+ task_stream() : N(), population(), random(&N), lanes()
{
- __TBB_ASSERT( sizeof(population) * CHAR_BIT >= 32, NULL );
}
void initialize( unsigned n_lanes ) {
- N = n_lanes>=32 ? 32 : n_lanes>2 ? 1<<(__TBB_Log2(n_lanes-1)+1) : 2;
- __TBB_ASSERT( N==32 || N>=n_lanes && ((N-1)&N)==0, "number of lanes miscalculated");
+ const unsigned max_lanes =
+#if __TBB_MORE_FIFO_LANES
+ sizeof(population) * CHAR_BIT;
+#else
+ 32;
+#endif
+ N = n_lanes>=max_lanes ? max_lanes : n_lanes>2 ? 1<<(__TBB_Log2(n_lanes-1)+1) : 2;
+ __TBB_ASSERT( N==max_lanes || N>=n_lanes && ((N-1)&N)==0, "number of lanes miscalculated");
+ __TBB_ASSERT( N <= sizeof(population) * CHAR_BIT, NULL );
lanes = new padded<lane_t>[N];
__TBB_ASSERT( !population, NULL );
}
diff --git a/src/tbb/tbb_assert_impl.h b/src/tbb/tbb_assert_impl.h
index 700023d..2dca330 100644
--- a/src/tbb/tbb_assert_impl.h
+++ b/src/tbb/tbb_assert_impl.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tbb_main.cpp b/src/tbb/tbb_main.cpp
index 800ce07..c4d1b87 100644
--- a/src/tbb/tbb_main.cpp
+++ b/src/tbb/tbb_main.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+#include "tbb/tbb_config.h"
#include "tbb_main.h"
#include "governor.h"
#include "tbb_misc.h"
@@ -48,6 +49,10 @@ basic_tls<generic_scheduler*> governor::theTLS;
unsigned governor::DefaultNumberOfThreads;
rml::tbb_factory governor::theRMLServerFactory;
bool governor::UsePrivateRML;
+const task_scheduler_init *governor::BlockingTSI;
+#if TBB_USE_ASSERT
+bool governor::IsBlockingTermiantionInProgress;
+#endif
//------------------------------------------------------------------------
// market data
@@ -80,6 +85,7 @@ bool __TBB_InitOnce::InitializationDone;
//! Pointer to the scheduler factory function
generic_scheduler* (*AllocateSchedulerPtr)( arena*, size_t index );
+#if __TBB_OLD_PRIMES_RNG
//! Table of primes used by fast random-number generator (FastRandom).
/** Also serves to keep anything else from being placed in the same
cache line as the global data items preceding it. */
@@ -113,6 +119,7 @@ static const unsigned Primes[] = {
unsigned GetPrime ( unsigned seed ) {
return Primes[seed%(sizeof(Primes)/sizeof(Primes[0]))];
}
+#endif //__TBB_OLD_PRIMES_RNG
//------------------------------------------------------------------------
// __TBB_InitOnce
diff --git a/src/tbb/tbb_main.h b/src/tbb/tbb_main.h
index 14afbed..1a89f13 100644
--- a/src/tbb/tbb_main.h
+++ b/src/tbb/tbb_main.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -69,7 +69,7 @@ class __TBB_InitOnce {
public:
static void lock() { __TBB_LockByte( InitializationLock ); }
- static void unlock() { __TBB_UnlockByte( InitializationLock, 0 ); }
+ static void unlock() { __TBB_UnlockByte( InitializationLock ); }
static bool initialization_done() { return __TBB_load_with_acquire(InitializationDone); }
diff --git a/src/tbb/tbb_misc.cpp b/src/tbb/tbb_misc.cpp
index 2999f75..54ac455 100644
--- a/src/tbb/tbb_misc.cpp
+++ b/src/tbb/tbb_misc.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -36,6 +36,7 @@
#include "tbb_misc.h"
#include <cstdio>
#include <cstdlib>
+#include <stdexcept>
#if _WIN32||_WIN64
#include "tbb/machine/windows_api.h"
@@ -103,8 +104,13 @@ void handle_perror( int error_code, const char* what ) {
#if _WIN32||_WIN64
void handle_win_error( int error_code ) {
char buf[512];
+#if !__TBB_WIN8UI_SUPPORT
FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, error_code, 0, buf, sizeof(buf), NULL );
+#else
+//TODO: update with right replacement for FormatMessageA
+ sprintf_s((char*)&buf, 512, "error code %d", error_code);
+#endif
#if TBB_USE_EXCEPTIONS
throw runtime_error(buf);
#else
@@ -138,6 +144,9 @@ void throw_exception_v4 ( exception_id eid ) {
case eid_reservation_length_error: DO_THROW( length_error, ("reservation size exceeds permitted max size") );
case eid_invalid_key: DO_THROW( out_of_range, ("invalid key") );
case eid_user_abort: DO_THROW( user_abort, () );
+#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE
+ case eid_blocking_sch_init: DO_THROW( runtime_error, ("Nesting of blocking termiantion is impossible") );
+#endif
default: break;
}
#if !TBB_USE_EXCEPTIONS && __APPLE__
@@ -148,15 +157,15 @@ void throw_exception_v4 ( exception_id eid ) {
#endif /* !TBB_USE_EXCEPTIONS && __APPLE__ */
}
-#if _XBOX
-bool GetBoolEnvironmentVariable( const char * name ) { return false;}
-#else
+#if _XBOX || __TBB_WIN8UI_SUPPORT
+bool GetBoolEnvironmentVariable( const char * ) { return false;}
+#else /* _XBOX || __TBB_WIN8UI_SUPPORT */
bool GetBoolEnvironmentVariable( const char * name ) {
if( const char* s = getenv(name) )
return strcmp(s,"0") != 0;
return false;
}
-#endif /* !_XBOX */
+#endif /* _XBOX || __TBB_WIN8UI_SUPPORT */
#include "tbb_version.h"
@@ -186,7 +195,7 @@ void PrintRMLVersionInfo( void* arg, const char* server_info ) {
}
} // namespace internal
-
+
extern "C" int TBB_runtime_interface_version() {
return TBB_INTERFACE_VERSION;
}
diff --git a/src/tbb/tbb_misc.h b/src/tbb/tbb_misc.h
index 9af65f4..146d55d 100644
--- a/src/tbb/tbb_misc.h
+++ b/src/tbb/tbb_misc.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -40,12 +40,22 @@
#endif
#endif
+// Does the operating system have a system call to pin a thread to a set of OS processors?
+#define __TBB_OS_AFFINITY_SYSCALL_PRESENT ((__linux__ && !__ANDROID__) || (__FreeBSD_version >= 701000))
+
namespace tbb {
namespace internal {
const size_t MByte = 1024*1024;
+#if __TBB_WIN8UI_SUPPORT
+// In Win8UI mode, TBB uses a thread creation API that does not allow to specify the stack size.
+// Still, the thread stack size value, either explicit or default, is used by the scheduler.
+// So here we set the default value to match the platform's default of 1MB.
+const size_t ThreadStackSize = 1*MByte;
+#else
const size_t ThreadStackSize = (sizeof(uintptr_t) <= 4 ? 2 : 4 )*MByte;
+#endif
#ifndef __TBB_HardwareConcurrency
@@ -114,9 +124,8 @@ T1 max ( const T1& val1, const T2& val2 ) {
return val1 < val2 ? val2 : val1;
}
-//! Utility template function to prevent "unused" warnings by various compilers.
-template<typename T>
-void suppress_unused_warning( const T& ) {}
+//! Utility helper structure to ease overload resolution
+template<int > struct int_to_type {};
//------------------------------------------------------------------------
// FastRandom
@@ -128,7 +137,14 @@ unsigned GetPrime ( unsigned seed );
//! A fast random number generator.
/** Uses linear congruential method. */
class FastRandom {
+private:
+#if __TBB_OLD_PRIMES_RNG
unsigned x, a;
+ static const unsigned c = 1;
+#else
+ unsigned x, c;
+ static const unsigned a = 0x9e3779b1; // a big prime number
+#endif //__TBB_OLD_PRIMES_RNG
public:
//! Get a random number.
unsigned short get() {
@@ -137,13 +153,30 @@ public:
//! Get a random number for the given seed; update the seed for next use.
unsigned short get( unsigned& seed ) {
unsigned short r = (unsigned short)(seed>>16);
- seed = seed*a+1;
+ __TBB_ASSERT(c&1, "c must be odd for big rng period");
+ seed = seed*a+c;
return r;
}
//! Construct a random number generator.
- FastRandom( unsigned seed ) {
+ FastRandom( void* unique_ptr ) { init(uintptr_t(unique_ptr)); }
+ FastRandom( uint32_t seed) { init(seed); }
+ FastRandom( uint64_t seed) { init(seed); }
+ template <typename T>
+ void init( T seed ) {
+ return init(seed,int_to_type<sizeof(seed)>());
+ }
+ void init( uint64_t seed , int_to_type<8> ) {
+ init(uint32_t((seed>>32)+seed), int_to_type<4>());
+ }
+ void init( uint32_t seed, int_to_type<4> ) {
+#if __TBB_OLD_PRIMES_RNG
x = seed;
a = GetPrime( seed );
+#else
+ // threads use different seeds for unique sequences
+ c = (seed|1)*0xba5703f5; // c must be odd, shuffle by a prime number
+ x = c^(seed>>1); // also shuffle x for the first get() invocation
+#endif
}
};
@@ -210,12 +243,7 @@ inline void run_initializer( bool (*f)(), atomic<do_once_state>& state ) {
state = f() ? do_once_executed : do_once_uninitialized;
}
-#ifdef __TBB_HardwareConcurrency
- class affinity_helper {
- public:
- void protect_affinity_mask() {}
- };
-#elif __linux__ || __FreeBSD_version >= 701000
+#if __TBB_OS_AFFINITY_SYSCALL_PRESENT
#if __linux__
typedef cpu_set_t basic_mask_t;
#elif __FreeBSD_version >= 701000
@@ -231,19 +259,12 @@ inline void run_initializer( bool (*f)(), atomic<do_once_state>& state ) {
~affinity_helper();
void protect_affinity_mask();
};
-#elif defined(_SC_NPROCESSORS_ONLN)
- class affinity_helper {
- public:
- void protect_affinity_mask() {}
- };
-#elif _WIN32||_WIN64
+#else
class affinity_helper {
public:
void protect_affinity_mask() {}
};
-#else
- #error affinity_helper is not implemented in this OS
-#endif /* __TBB_HardwareConcurrency */
+#endif /* __TBB_OS_AFFINITY_SYSCALL_PRESENT */
} // namespace internal
} // namespace tbb
diff --git a/src/tbb/tbb_misc_ex.cpp b/src/tbb/tbb_misc_ex.cpp
index b328195..62f75a8 100644
--- a/src/tbb/tbb_misc_ex.cpp
+++ b/src/tbb/tbb_misc_ex.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -39,28 +39,30 @@
#if _WIN32||_WIN64
#include "tbb/machine/windows_api.h"
-#elif __linux__
+#if __TBB_WIN8UI_SUPPORT
+#include <thread>
+#endif
+#else
+#include <unistd.h>
+#if __linux__
#include <sys/sysinfo.h>
#include <string.h>
#include <sched.h>
#include <errno.h>
#elif __sun
#include <sys/sysinfo.h>
-#include <unistd.h>
#elif __FreeBSD__
-#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/param.h> // Required by <sys/cpuset.h>
#include <sys/cpuset.h>
-#elif _AIX
-#include <unistd.h>
+#endif
#endif
namespace tbb {
namespace internal {
-#if __linux__ || __FreeBSD_version >= 701000
+#if __TBB_OS_AFFINITY_SYSCALL_PRESENT
static void set_affinity_mask( size_t maskSize, const basic_mask_t* threadMask ) {
#if __linux__
@@ -184,11 +186,27 @@ int AvailableHwConcurrency() {
return theNumProcs;
}
-#elif defined(_SC_NPROCESSORS_ONLN)
+#elif __ANDROID__
+// Work-around for Android that reads the correct number of available CPUs since system calls are unreliable.
+// Format of "present" file is: ([<int>-<int>|<int>],)+
+int AvailableHwConcurrency() {
+ FILE *fp = fopen("/sys/devices/system/cpu/present", "r");
+ if (fp == NULL) return 1;
+ int num_args, lower, upper, num_cpus=0;
+ while ((num_args = fscanf(fp, "%u-%u", &lower, &upper)) != EOF) {
+ switch(num_args) {
+ case 2: num_cpus += upper - lower + 1; break;
+ case 1: num_cpus += 1; break;
+ }
+ fscanf(fp, ",");
+ }
+ return (num_cpus > 0) ? num_cpus : 1;
+}
+#elif defined(_SC_NPROCESSORS_ONLN)
int AvailableHwConcurrency() {
int n = sysconf(_SC_NPROCESSORS_ONLN);
- return n > 0 ? n : 1;
+ return (n > 0) ? n : 1;
}
#elif _WIN32||_WIN64
@@ -231,24 +249,29 @@ struct TBB_GROUP_AFFINITY {
WORD Reserved[3];
};
-static DWORD (WINAPI *TBB_GetMaximumProcessorCount)( WORD groupIndex ) = NULL;
-static WORD (WINAPI *TBB_GetMaximumProcessorGroupCount)() = NULL;
+static DWORD (WINAPI *TBB_GetActiveProcessorCount)( WORD groupIndex ) = NULL;
+static WORD (WINAPI *TBB_GetActiveProcessorGroupCount)() = NULL;
static BOOL (WINAPI *TBB_SetThreadGroupAffinity)( HANDLE hThread,
const TBB_GROUP_AFFINITY* newAff, TBB_GROUP_AFFINITY *prevAff );
static BOOL (WINAPI *TBB_GetThreadGroupAffinity)( HANDLE hThread, TBB_GROUP_AFFINITY* );
static const dynamic_link_descriptor ProcessorGroupsApiLinkTable[] = {
- DLD(GetMaximumProcessorCount, TBB_GetMaximumProcessorCount)
- , DLD(GetMaximumProcessorGroupCount, TBB_GetMaximumProcessorGroupCount)
+ DLD(GetActiveProcessorCount, TBB_GetActiveProcessorCount)
+ , DLD(GetActiveProcessorGroupCount, TBB_GetActiveProcessorGroupCount)
, DLD(SetThreadGroupAffinity, TBB_SetThreadGroupAffinity)
, DLD(GetThreadGroupAffinity, TBB_GetThreadGroupAffinity)
};
static void initialize_hardware_concurrency_info () {
- dynamic_link( GetModuleHandleA( "Kernel32.dll" ), ProcessorGroupsApiLinkTable,
+#if __TBB_WIN8UI_SUPPORT
+ // For these applications processor groups info is unavailable
+ // Setting up a number of processors for one processor group
+ theProcessorGroups[0].numProcs = theProcessorGroups[0].numProcsRunningTotal = std::thread::hardware_concurrency();
+#else /* __TBB_WIN8UI_SUPPORT */
+ dynamic_link( "Kernel32.dll", ProcessorGroupsApiLinkTable,
sizeof(ProcessorGroupsApiLinkTable)/sizeof(dynamic_link_descriptor) );
SYSTEM_INFO si;
- GetSystemInfo(&si);
+ GetNativeSystemInfo(&si);
DWORD_PTR pam, sam, m = 1;
GetProcessAffinityMask( GetCurrentProcess(), &pam, &sam );
int nproc = 0;
@@ -257,9 +280,12 @@ static void initialize_hardware_concurrency_info () {
++nproc;
}
__TBB_ASSERT( nproc <= (int)si.dwNumberOfProcessors, NULL );
- if ( nproc == (int)si.dwNumberOfProcessors && TBB_GetMaximumProcessorCount ) {
+ // By default setting up a number of processors for one processor group
+ theProcessorGroups[0].numProcs = theProcessorGroups[0].numProcsRunningTotal = nproc;
+ // Setting up processor groups in case the process does not restrict affinity mask and more than one processor group is present
+ if ( nproc == (int)si.dwNumberOfProcessors && TBB_GetActiveProcessorCount ) {
// The process does not have restricting affinity mask and multiple processor groups are possible
- ProcessorGroupInfo::NumGroups = (int)TBB_GetMaximumProcessorGroupCount();
+ ProcessorGroupInfo::NumGroups = (int)TBB_GetActiveProcessorGroupCount();
__TBB_ASSERT( ProcessorGroupInfo::NumGroups <= MaxProcessorGroups, NULL );
// Fail safety bootstrap. Release versions will limit available concurrency
// level, while debug ones would assert.
@@ -272,17 +298,15 @@ static void initialize_hardware_concurrency_info () {
int nprocs = 0;
for ( WORD i = 0; i < ProcessorGroupInfo::NumGroups; ++i ) {
ProcessorGroupInfo &pgi = theProcessorGroups[i];
- pgi.numProcs = (int)TBB_GetMaximumProcessorCount(i);
+ pgi.numProcs = (int)TBB_GetActiveProcessorCount(i);
__TBB_ASSERT( pgi.numProcs <= (int)sizeof(DWORD_PTR) * CHAR_BIT, NULL );
pgi.mask = pgi.numProcs == sizeof(DWORD_PTR) * CHAR_BIT ? ~(DWORD_PTR)0 : (DWORD_PTR(1) << pgi.numProcs) - 1;
pgi.numProcsRunningTotal = nprocs += pgi.numProcs;
}
- __TBB_ASSERT( nprocs == (int)TBB_GetMaximumProcessorCount( TBB_ALL_PROCESSOR_GROUPS ), NULL );
- return;
+ __TBB_ASSERT( nprocs == (int)TBB_GetActiveProcessorCount( TBB_ALL_PROCESSOR_GROUPS ), NULL );
}
}
- // Either the process has restricting affinity mask or only a single processor groups is present
- theProcessorGroups[0].numProcs = theProcessorGroups[0].numProcsRunningTotal = nproc;
+#endif /* __TBB_WIN8UI_SUPPORT */
PrintExtraVersionInfo("Processor groups", "%d", ProcessorGroupInfo::NumGroups);
if (ProcessorGroupInfo::NumGroups>1)
diff --git a/src/tbb/tbb_resource.rc b/src/tbb/tbb_resource.rc
index 3ba56f0..e143e75 100644
--- a/src/tbb/tbb_resource.rc
+++ b/src/tbb/tbb_resource.rc
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
@@ -90,7 +90,7 @@ BEGIN
VALUE "FileDescription", "Threading Building Blocks library\0"
VALUE "FileVersion", TBB_VERSION "\0"
//what is it? VALUE "InternalName", "tbb\0"
- VALUE "LegalCopyright", "Copyright 2005-2012 Intel Corporation. All Rights Reserved.\0"
+ VALUE "LegalCopyright", "Copyright 2005-2013 Intel Corporation. All Rights Reserved.\0"
VALUE "LegalTrademarks", "\0"
#ifndef TBB_USE_DEBUG
VALUE "OriginalFilename", "tbb.dll\0"
diff --git a/src/tbb/tbb_statistics.cpp b/src/tbb/tbb_statistics.cpp
index be8f9e2..a21c226 100644
--- a/src/tbb/tbb_statistics.cpp
+++ b/src/tbb/tbb_statistics.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tbb_statistics.h b/src/tbb/tbb_statistics.h
index f5e222d..3f907a4 100644
--- a/src/tbb/tbb_statistics.h
+++ b/src/tbb/tbb_statistics.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -115,7 +115,7 @@ enum statistics_groups {
};
//! Groups of counters to output
-const uintptr_t __TBB_ActiveStatisticsGroups = sg_task_execution | sg_stealing | sg_arena | sg_market;
+const uintptr_t __TBB_ActiveStatisticsGroups = sg_task_execution | sg_stealing | sg_affinity | sg_arena | sg_market;
//! A set of various statistics counters that are updated by the library on per thread basis.
/** All the fields must be of the same type (statistics_counters::counter_type).
diff --git a/src/tbb/tbb_thread.cpp b/src/tbb/tbb_thread.cpp
index b677f15..20ac0b6 100644
--- a/src/tbb/tbb_thread.cpp
+++ b/src/tbb/tbb_thread.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -34,6 +34,9 @@
#include "tbb/tbb_thread.h"
#include "tbb/tbb_allocator.h"
#include "governor.h" // default_num_threads()
+#if __TBB_WIN8UI_SUPPORT
+#include <thread>
+#endif
namespace tbb {
namespace internal {
@@ -53,19 +56,25 @@ void free_closure_v3( void *ptr )
void tbb_thread_v3::join()
{
__TBB_ASSERT( joinable(), "thread should be joinable when join called" );
-#if _WIN32||_WIN64
- DWORD status = WaitForSingleObject( my_handle, INFINITE );
+#if _WIN32||_WIN64
+#if __TBB_WIN8UI_SUPPORT
+ std::thread* thread_tmp=(std::thread*)my_thread_id;
+ thread_tmp->join();
+ delete thread_tmp;
+#else // __TBB_WIN8UI_SUPPORT
+ DWORD status = WaitForSingleObjectEx( my_handle, INFINITE, FALSE );
if ( status == WAIT_FAILED )
handle_win_error( GetLastError() );
BOOL close_stat = CloseHandle( my_handle );
if ( close_stat == 0 )
handle_win_error( GetLastError() );
my_thread_id = 0;
+#endif // __TBB_WIN8UI_SUPPORT
#else
int status = pthread_join( my_handle, NULL );
if( status )
handle_perror( status, "pthread_join" );
-#endif // _WIN32||_WIN64
+#endif // _WIN32||_WIN64
my_handle = 0;
}
@@ -87,17 +96,26 @@ void tbb_thread_v3::detach() {
void tbb_thread_v3::internal_start( __TBB_NATIVE_THREAD_ROUTINE_PTR(start_routine),
void* closure ) {
#if _WIN32||_WIN64
+#if __TBB_WIN8UI_SUPPORT
+ std::thread* thread_tmp=new std::thread(start_routine, closure);
+ my_handle = thread_tmp->native_handle();
+// TODO: to find out the way to find thread_id without GetThreadId and other
+// desktop functions.
+// Now tbb_thread does have its own thread_id that stores std::thread object
+ my_thread_id = (size_t)thread_tmp;
+#else
unsigned thread_id;
// The return type of _beginthreadex is "uintptr_t" on new MS compilers,
// and 'unsigned long' on old MS compilers. uintptr_t works for both.
uintptr_t status = _beginthreadex( NULL, ThreadStackSize, start_routine,
- closure, 0, &thread_id );
+ closure, 0, &thread_id );
if( status==0 )
handle_perror(errno,"__beginthreadex");
else {
my_handle = (HANDLE)status;
my_thread_id = thread_id;
}
+#endif
#else
pthread_t thread_handle;
int status;
@@ -155,7 +173,12 @@ void thread_sleep_v3(const tick_count::interval_t &i)
double remainder = (i-(t1-t0)).seconds()*1e3; // milliseconds remaining to sleep
if( remainder<=0 ) break;
DWORD t = remainder>=INFINITE ? INFINITE-1 : DWORD(remainder);
+#if !__TBB_WIN8UI_SUPPORT
Sleep( t );
+#else
+ std::chrono::milliseconds sleep_time( t );
+ std::this_thread::sleep_for( sleep_time );
+#endif
t1 = tick_count::now();
}
#else
diff --git a/src/tbb/tbb_version.h b/src/tbb/tbb_version.h
index d5edae2..ce0cfe8 100644
--- a/src/tbb/tbb_version.h
+++ b/src/tbb/tbb_version.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tls.h b/src/tbb/tls.h
index 97294d2..5e85cc2 100644
--- a/src/tbb/tls.h
+++ b/src/tbb/tls.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -56,6 +56,7 @@ public:
#else /* USE_WINTHREAD */
typedef DWORD tls_key_t;
public:
+#if !__TBB_WIN8UI_SUPPORT
int create() {
tls_key_t tmp = TlsAlloc();
if( tmp==TLS_OUT_OF_INDEXES )
@@ -66,7 +67,19 @@ public:
int destroy() { TlsFree(my_key); my_key=0; return 0; }
void set( T value ) { TlsSetValue(my_key, (LPVOID)value); }
T get() { return (T)TlsGetValue(my_key); }
-#endif
+#else /*!__TBB_WIN8UI_SUPPORT*/
+ int create() {
+ tls_key_t tmp = FlsAlloc(NULL);
+ if( tmp== (DWORD)0xFFFFFFFF )
+ return (DWORD)0xFFFFFFFF;
+ my_key = tmp;
+ return 0;
+ }
+ int destroy() { FlsFree(my_key); my_key=0; return 0; }
+ void set( T value ) { FlsSetValue(my_key, (LPVOID)value); }
+ T get() { return (T)FlsGetValue(my_key); }
+#endif /* !__TBB_WIN8UI_SUPPORT */
+#endif /* USE_WINTHREAD */
private:
tls_key_t my_key;
};
diff --git a/src/tbb/tools_api/disable_warnings.h b/src/tbb/tools_api/disable_warnings.h
index 7ce1ff1..7540a0f 100644
--- a/src/tbb/tools_api/disable_warnings.h
+++ b/src/tbb/tools_api/disable_warnings.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tools_api/internal/ittnotify.h b/src/tbb/tools_api/internal/ittnotify.h
index 339a98f..68ea7c2 100644
--- a/src/tbb/tools_api/internal/ittnotify.h
+++ b/src/tbb/tools_api/internal/ittnotify.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tools_api/ittnotify.h b/src/tbb/tools_api/ittnotify.h
index a3935bf..9142709 100644
--- a/src/tbb/tools_api/ittnotify.h
+++ b/src/tbb/tools_api/ittnotify.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -1482,6 +1482,7 @@ typedef struct ___itt_id
static const __itt_id __itt_null = { 0, 0, 0 };
+#if 0 // this function currently is not used
/**
* @ingroup ids
* @brief A convenience function is provided to create an ID without domain control.
@@ -1502,6 +1503,7 @@ INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra)
id.d3 = (unsigned long long)0; /* Reserved. Must be zero */
return id;
}
+#endif
/**
* @ingroup ids
diff --git a/src/tbb/tools_api/ittnotify_config.h b/src/tbb/tools_api/ittnotify_config.h
index fe1c1c6..02077a8 100644
--- a/src/tbb/tools_api/ittnotify_config.h
+++ b/src/tbb/tools_api/ittnotify_config.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tools_api/ittnotify_static.c b/src/tbb/tools_api/ittnotify_static.c
index be55706..d6d636d 100644
--- a/src/tbb/tools_api/ittnotify_static.c
+++ b/src/tbb/tools_api/ittnotify_static.c
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tools_api/ittnotify_static.h b/src/tbb/tools_api/ittnotify_static.h
index 52aad68..db19b9b 100644
--- a/src/tbb/tools_api/ittnotify_static.h
+++ b/src/tbb/tools_api/ittnotify_static.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tools_api/ittnotify_types.h b/src/tbb/tools_api/ittnotify_types.h
index f33d6ac..32d3b85 100644
--- a/src/tbb/tools_api/ittnotify_types.h
+++ b/src/tbb/tools_api/ittnotify_types.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tools_api/legacy/ittnotify.h b/src/tbb/tools_api/legacy/ittnotify.h
index b0dde48..96f609f 100644
--- a/src/tbb/tools_api/legacy/ittnotify.h
+++ b/src/tbb/tools_api/legacy/ittnotify.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/tools_api/prototype/ittnotify.h b/src/tbb/tools_api/prototype/ittnotify.h
index 856d6b6..11c1662 100644
--- a/src/tbb/tools_api/prototype/ittnotify.h
+++ b/src/tbb/tools_api/prototype/ittnotify.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/win32-tbb-export.def b/src/tbb/win32-tbb-export.def
index 488ad0b..acf3e74 100644
--- a/src/tbb/win32-tbb-export.def
+++ b/src/tbb/win32-tbb-export.def
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
@@ -27,5 +27,10 @@
EXPORTS
#define __TBB_SYMBOL( sym ) sym
+#if _M_ARM
+#include "winrt-tbb-export.lst"
+#else
#include "win32-tbb-export.lst"
+#endif
+
diff --git a/src/tbb/win32-tbb-export.lst b/src/tbb/win32-tbb-export.lst
index 2c8e98a..0e865c8 100644
--- a/src/tbb/win32-tbb-export.lst
+++ b/src/tbb/win32-tbb-export.lst
@@ -1,22 +1,28 @@
-/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
-*/
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+;
+; This file is part of Threading Building Blocks.
+;
+; Threading Building Blocks is free software; you can redistribute it
+; and/or modify it under the terms of the GNU General Public License
+; version 2 as published by the Free Software Foundation.
+;
+; Threading Building Blocks is distributed in the hope that it will be
+; useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+; of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with Threading Building Blocks; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+;
+; As a special exception, you may use this file as part of a free software
+; library without restriction. Specifically, if other files instantiate
+; templates or use macros or inline functions from this file, or you compile
+; this file and link it with other files to produce an executable, this
+; file does not by itself cause the resulting executable to be covered by
+; the GNU General Public License. This exception does not however
+; invalidate any other reasons why the executable file might be covered by
+; the GNU General Public License.
#include "tbb/tbb_config.h"
@@ -66,7 +72,19 @@ __TBB_SYMBOL( ?default_num_threads at task_scheduler_init@tbb@@SAHXZ )
__TBB_SYMBOL( ?initialize at task_scheduler_init@tbb@@QAEXHI at Z )
__TBB_SYMBOL( ?initialize at task_scheduler_init@tbb@@QAEXH at Z )
__TBB_SYMBOL( ?terminate at task_scheduler_init@tbb@@QAEXXZ )
+#if __TBB_SCHEDULER_OBSERVER
__TBB_SYMBOL( ?observe at task_scheduler_observer_v3@internal at tbb@@QAEX_N at Z )
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+#if __TBB_TASK_ARENA
+/* arena.cpp */
+__TBB_SYMBOL( ?internal_initialize at task_arena@interface6 at tbb@@AAEXXZ )
+__TBB_SYMBOL( ?internal_enqueue at task_arena@interface6 at tbb@@ABEXAAVtask at 3@H at Z )
+__TBB_SYMBOL( ?internal_execute at task_arena@interface6 at tbb@@ABEXAAVdelegate_base at internal@23@@Z )
+__TBB_SYMBOL( ?internal_terminate at task_arena@interface6 at tbb@@AAEXXZ )
+__TBB_SYMBOL( ?current_slot at task_arena@interface6 at tbb@@SAHXZ )
+__TBB_SYMBOL( ?internal_wait at task_arena@interface6 at tbb@@ABEXXZ )
+#endif /* __TBB_TASK_ARENA */
#if !TBB_NO_LEGACY
// task_v2.cpp
diff --git a/src/tbb/win64-gcc-tbb-export.def b/src/tbb/win64-gcc-tbb-export.def
index e3a9533..8d46521 100644
--- a/src/tbb/win64-gcc-tbb-export.def
+++ b/src/tbb/win64-gcc-tbb-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbb/win64-gcc-tbb-export.lst b/src/tbb/win64-gcc-tbb-export.lst
index b693825..58892bf 100644
--- a/src/tbb/win64-gcc-tbb-export.lst
+++ b/src/tbb/win64-gcc-tbb-export.lst
@@ -1,23 +1,30 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
-*/
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
#include "tbb/tbb_config.h"
@@ -53,7 +60,9 @@ __TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEiy ) // MODIFIED LINUX ENTRY
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )
__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )
+#if __TBB_SCHEDULER_OBSERVER
__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )
+#endif /* __TBB_SCHEDULER_OBSERVER */
__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )
__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )
__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )
@@ -61,6 +70,16 @@ __TBB_SYMBOL( _ZTIN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )
__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )
+#if __TBB_TASK_ARENA
+/* arena.cpp */
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena18internal_terminateEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_enqueueERNS_4taskEl )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena16internal_executeERNS0_8internal13delegate_baseE )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena19internal_initializeEv )
+__TBB_SYMBOL( _ZN3tbb10interface610task_arena12current_slotEv )
+__TBB_SYMBOL( _ZNK3tbb10interface610task_arena13internal_waitEv )
+#endif /* __TBB_TASK_ARENA */
+
#if !TBB_NO_LEGACY
/* task_v2.cpp */
__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
diff --git a/src/tbb/win64-tbb-export.def b/src/tbb/win64-tbb-export.def
index 59926ff..5e5888d 100644
--- a/src/tbb/win64-tbb-export.def
+++ b/src/tbb/win64-tbb-export.def
@@ -1,21 +1,29 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
-; The source code contained or described herein and all documents related
-; to the source code ("Material") are owned by Intel Corporation or its
-; suppliers or licensors. Title to the Material remains with Intel
-; Corporation or its suppliers and licensors. The Material is protected
-; by worldwide copyright laws and treaty provisions. No part of the
-; Material may be used, copied, reproduced, modified, published, uploaded,
-; posted, transmitted, distributed, or disclosed in any way without
-; Intel's prior express written permission.
+; This file is part of Threading Building Blocks.
;
-; No license under any patent, copyright, trade secret or other
-; intellectual property right is granted to or conferred upon you by
-; disclosure or delivery of the Materials, either expressly, by
-; implication, inducement, estoppel or otherwise. Any license under such
-; intellectual property rights must be express and approved by Intel in
-; writing.
+; Threading Building Blocks is free software; you can redistribute it
+; and/or modify it under the terms of the GNU General Public License
+; version 2 as published by the Free Software Foundation.
;
+; Threading Building Blocks is distributed in the hope that it will be
+; useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+; of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with Threading Building Blocks; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+;
+; As a special exception, you may use this file as part of a free software
+; library without restriction. Specifically, if other files instantiate
+; templates or use macros or inline functions from this file, or you compile
+; this file and link it with other files to produce an executable, this
+; file does not by itself cause the resulting executable to be covered by
+; the GNU General Public License. This exception does not however
+; invalidate any other reasons why the executable file might be covered by
+; the GNU General Public License.
+
; This file is organized with a section for each .cpp file.
; Each of these sections is in alphabetical order.
diff --git a/src/tbb/win64-tbb-export.lst b/src/tbb/win64-tbb-export.lst
index ae2661e..bddf731 100644
--- a/src/tbb/win64-tbb-export.lst
+++ b/src/tbb/win64-tbb-export.lst
@@ -1,22 +1,28 @@
-/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
-*/
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+;
+; This file is part of Threading Building Blocks.
+;
+; Threading Building Blocks is free software; you can redistribute it
+; and/or modify it under the terms of the GNU General Public License
+; version 2 as published by the Free Software Foundation.
+;
+; Threading Building Blocks is distributed in the hope that it will be
+; useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+; of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with Threading Building Blocks; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+;
+; As a special exception, you may use this file as part of a free software
+; library without restriction. Specifically, if other files instantiate
+; templates or use macros or inline functions from this file, or you compile
+; this file and link it with other files to produce an executable, this
+; file does not by itself cause the resulting executable to be covered by
+; the GNU General Public License. This exception does not however
+; invalidate any other reasons why the executable file might be covered by
+; the GNU General Public License.
// This file is organized with a section for each .cpp file.
// Each of these sections is in alphabetical order.
@@ -62,7 +68,19 @@ __TBB_SYMBOL( ?default_num_threads at task_scheduler_init@tbb@@SAHXZ )
__TBB_SYMBOL( ?initialize at task_scheduler_init@tbb@@QEAAXH_K at Z )
__TBB_SYMBOL( ?initialize at task_scheduler_init@tbb@@QEAAXH at Z )
__TBB_SYMBOL( ?terminate at task_scheduler_init@tbb@@QEAAXXZ )
+#if __TBB_SCHEDULER_OBSERVER
__TBB_SYMBOL( ?observe at task_scheduler_observer_v3@internal at tbb@@QEAAX_N at Z )
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+#if __TBB_TASK_ARENA
+/* arena.cpp */
+__TBB_SYMBOL( ?internal_enqueue at task_arena@interface6 at tbb@@AEBAXAEAVtask at 3@_J at Z )
+__TBB_SYMBOL( ?internal_execute at task_arena@interface6 at tbb@@AEBAXAEAVdelegate_base at internal@23@@Z )
+__TBB_SYMBOL( ?internal_initialize at task_arena@interface6 at tbb@@AEAAXXZ )
+__TBB_SYMBOL( ?internal_terminate at task_arena@interface6 at tbb@@AEAAXXZ )
+__TBB_SYMBOL( ?internal_wait at task_arena@interface6 at tbb@@AEBAXXZ )
+__TBB_SYMBOL( ?current_slot at task_arena@interface6 at tbb@@SAHXZ )
+#endif /* __TBB_TASK_ARENA */
#if !TBB_NO_LEGACY
// task_v2.cpp
diff --git a/src/tbb/win32-tbb-export.lst b/src/tbb/winrt-tbb-export.lst
similarity index 52%
copy from src/tbb/win32-tbb-export.lst
copy to src/tbb/winrt-tbb-export.lst
index 2c8e98a..85a68d5 100644
--- a/src/tbb/win32-tbb-export.lst
+++ b/src/tbb/winrt-tbb-export.lst
@@ -1,42 +1,31 @@
-/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
-
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
-
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
-*/
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+;
+; This file is part of Threading Building Blocks.
+;
+; Threading Building Blocks is free software; you can redistribute it
+; and/or modify it under the terms of the GNU General Public License
+; version 2 as published by the Free Software Foundation.
+;
+; Threading Building Blocks is distributed in the hope that it will be
+; useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+; of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with Threading Building Blocks; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+;
+; As a special exception, you may use this file as part of a free software
+; library without restriction. Specifically, if other files instantiate
+; templates or use macros or inline functions from this file, or you compile
+; this file and link it with other files to produce an executable, this
+; file does not by itself cause the resulting executable to be covered by
+; the GNU General Public License. This exception does not however
+; invalidate any other reasons why the executable file might be covered by
+; the GNU General Public License.
#include "tbb/tbb_config.h"
-// Assembly-language support that is called directly by clients
-// __TBB_SYMBOL( __TBB_machine_cmpswp1 )
-// __TBB_SYMBOL( __TBB_machine_cmpswp2 )
-// __TBB_SYMBOL( __TBB_machine_cmpswp4 )
-__TBB_SYMBOL( __TBB_machine_cmpswp8 )
-// __TBB_SYMBOL( __TBB_machine_fetchadd1 )
-// __TBB_SYMBOL( __TBB_machine_fetchadd2 )
-// __TBB_SYMBOL( __TBB_machine_fetchadd4 )
-__TBB_SYMBOL( __TBB_machine_fetchadd8 )
-// __TBB_SYMBOL( __TBB_machine_fetchstore1 )
-// __TBB_SYMBOL( __TBB_machine_fetchstore2 )
-// __TBB_SYMBOL( __TBB_machine_fetchstore4 )
-__TBB_SYMBOL( __TBB_machine_fetchstore8 )
-__TBB_SYMBOL( __TBB_machine_store8 )
-__TBB_SYMBOL( __TBB_machine_load8 )
-__TBB_SYMBOL( __TBB_machine_trylockbyte )
-
// cache_aligned_allocator.cpp
__TBB_SYMBOL( ?NFS_Allocate at internal@tbb@@YAPAXIIPAX at Z )
__TBB_SYMBOL( ?NFS_GetLineSize at internal@tbb@@YAIXZ )
@@ -46,65 +35,77 @@ __TBB_SYMBOL( ?deallocate_via_handler_v3 at internal@tbb@@YAXPAX at Z )
__TBB_SYMBOL( ?is_malloc_used_v3 at internal@tbb@@YA_NXZ )
// task.cpp v3
-__TBB_SYMBOL( ?allocate at allocate_additional_child_of_proxy@internal at tbb@@QBEAAVtask at 3@I at Z )
-__TBB_SYMBOL( ?allocate at allocate_child_proxy@internal at tbb@@QBEAAVtask at 3@I at Z )
-__TBB_SYMBOL( ?allocate at allocate_continuation_proxy@internal at tbb@@QBEAAVtask at 3@I at Z )
+__TBB_SYMBOL( ?allocate at allocate_additional_child_of_proxy@internal at tbb@@QBAAAVtask at 3@I at Z )
+__TBB_SYMBOL( ?allocate at allocate_child_proxy@internal at tbb@@QBAAAVtask at 3@I at Z )
+__TBB_SYMBOL( ?allocate at allocate_continuation_proxy@internal at tbb@@QBAAAVtask at 3@I at Z )
__TBB_SYMBOL( ?allocate at allocate_root_proxy@internal at tbb@@SAAAVtask at 3@I at Z )
__TBB_SYMBOL( ?destroy at task_base@internal at interface5@tbb@@SAXAAVtask at 4@@Z )
-__TBB_SYMBOL( ?free at allocate_additional_child_of_proxy@internal at tbb@@QBEXAAVtask at 3@@Z )
-__TBB_SYMBOL( ?free at allocate_child_proxy@internal at tbb@@QBEXAAVtask at 3@@Z )
-__TBB_SYMBOL( ?free at allocate_continuation_proxy@internal at tbb@@QBEXAAVtask at 3@@Z )
+__TBB_SYMBOL( ?free at allocate_additional_child_of_proxy@internal at tbb@@QBAXAAVtask at 3@@Z )
+__TBB_SYMBOL( ?free at allocate_child_proxy@internal at tbb@@QBAXAAVtask at 3@@Z )
+__TBB_SYMBOL( ?free at allocate_continuation_proxy@internal at tbb@@QBAXAAVtask at 3@@Z )
__TBB_SYMBOL( ?free at allocate_root_proxy@internal at tbb@@SAXAAVtask at 3@@Z )
-__TBB_SYMBOL( ?internal_set_ref_count at task@tbb@@AAEXH at Z )
-__TBB_SYMBOL( ?internal_decrement_ref_count at task@tbb@@AAEHXZ )
-__TBB_SYMBOL( ?is_owned_by_current_thread at task@tbb@@QBE_NXZ )
-__TBB_SYMBOL( ?note_affinity at task@tbb@@UAEXG at Z )
-__TBB_SYMBOL( ?resize at affinity_partitioner_base_v3@internal at tbb@@AAEXI at Z )
+__TBB_SYMBOL( ?internal_set_ref_count at task@tbb@@AAAXH at Z )
+__TBB_SYMBOL( ?internal_decrement_ref_count at task@tbb@@AAAHXZ )
+__TBB_SYMBOL( ?is_owned_by_current_thread at task@tbb@@QBA_NXZ )
+__TBB_SYMBOL( ?note_affinity at task@tbb@@UAAXG at Z )
+__TBB_SYMBOL( ?resize at affinity_partitioner_base_v3@internal at tbb@@AAAXI at Z )
__TBB_SYMBOL( ?self at task@tbb@@SAAAV12 at XZ )
-__TBB_SYMBOL( ?spawn_and_wait_for_all at task@tbb@@QAEXAAVtask_list at 2@@Z )
+__TBB_SYMBOL( ?spawn_and_wait_for_all at task@tbb@@QAAXAAVtask_list at 2@@Z )
__TBB_SYMBOL( ?default_num_threads at task_scheduler_init@tbb@@SAHXZ )
-__TBB_SYMBOL( ?initialize at task_scheduler_init@tbb@@QAEXHI at Z )
-__TBB_SYMBOL( ?initialize at task_scheduler_init@tbb@@QAEXH at Z )
-__TBB_SYMBOL( ?terminate at task_scheduler_init@tbb@@QAEXXZ )
-__TBB_SYMBOL( ?observe at task_scheduler_observer_v3@internal at tbb@@QAEX_N at Z )
+__TBB_SYMBOL( ?initialize at task_scheduler_init@tbb@@QAAXHI at Z )
+__TBB_SYMBOL( ?initialize at task_scheduler_init@tbb@@QAAXH at Z )
+__TBB_SYMBOL( ?terminate at task_scheduler_init@tbb@@QAAXXZ )
+#if __TBB_SCHEDULER_OBSERVER
+__TBB_SYMBOL( ?observe at task_scheduler_observer_v3@internal at tbb@@QAAX_N at Z )
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+#if __TBB_TASK_ARENA
+/* arena.cpp */
+__TBB_SYMBOL( ?internal_initialize at task_arena@interface6 at tbb@@ABEPAVarena at internal@3 at H@Z )
+__TBB_SYMBOL( ?internal_enqueue at task_arena@interface6 at tbb@@ABEXAAVtask at 3@H at Z )
+__TBB_SYMBOL( ?internal_execute at task_arena@interface6 at tbb@@ABEXAAVdelegate_base at internal@23@@Z )
+__TBB_SYMBOL( ?internal_terminate at task_arena@interface6 at tbb@@AAAXXZ )
+__TBB_SYMBOL( ?current_slot at task_arena@interface6 at tbb@@SAHXZ )
+__TBB_SYMBOL( ?internal_wait at task_arena@interface6 at tbb@@ABEXXZ )
+#endif /* __TBB_TASK_ARENA */
#if !TBB_NO_LEGACY
// task_v2.cpp
-__TBB_SYMBOL( ?destroy at task@tbb@@QAEXAAV12@@Z )
+__TBB_SYMBOL( ?destroy at task@tbb@@QAAXAAV12@@Z )
#endif
// exception handling support
#if __TBB_TASK_GROUP_CONTEXT
-__TBB_SYMBOL( ?allocate at allocate_root_with_context_proxy@internal at tbb@@QBEAAVtask at 3@I at Z )
-__TBB_SYMBOL( ?free at allocate_root_with_context_proxy@internal at tbb@@QBEXAAVtask at 3@@Z )
-__TBB_SYMBOL( ?change_group at task@tbb@@QAEXAAVtask_group_context at 2@@Z )
-__TBB_SYMBOL( ?is_group_execution_cancelled at task_group_context@tbb@@QBE_NXZ )
-__TBB_SYMBOL( ?cancel_group_execution at task_group_context@tbb@@QAE_NXZ )
-__TBB_SYMBOL( ?reset at task_group_context@tbb@@QAEXXZ )
-__TBB_SYMBOL( ?init at task_group_context@tbb@@IAEXXZ )
-__TBB_SYMBOL( ?register_pending_exception at task_group_context@tbb@@QAEXXZ )
-__TBB_SYMBOL( ??1task_group_context at tbb@@QAE at XZ )
+__TBB_SYMBOL( ?allocate at allocate_root_with_context_proxy@internal at tbb@@QBAAAVtask at 3@I at Z )
+__TBB_SYMBOL( ?free at allocate_root_with_context_proxy@internal at tbb@@QBAXAAVtask at 3@@Z )
+__TBB_SYMBOL( ?change_group at task@tbb@@QAAXAAVtask_group_context at 2@@Z )
+__TBB_SYMBOL( ?is_group_execution_cancelled at task_group_context@tbb@@QBA_NXZ )
+__TBB_SYMBOL( ?cancel_group_execution at task_group_context@tbb@@QAA_NXZ )
+__TBB_SYMBOL( ?reset at task_group_context@tbb@@QAAXXZ )
+__TBB_SYMBOL( ?init at task_group_context@tbb@@IAAXXZ )
+__TBB_SYMBOL( ?register_pending_exception at task_group_context@tbb@@QAAXXZ )
+__TBB_SYMBOL( ??1task_group_context at tbb@@QAA at XZ )
#if __TBB_TASK_PRIORITY
-__TBB_SYMBOL( ?set_priority at task_group_context@tbb@@QAEXW4priority_t at 2@@Z )
-__TBB_SYMBOL( ?priority at task_group_context@tbb@@QBE?AW4priority_t at 2@XZ )
+__TBB_SYMBOL( ?set_priority at task_group_context@tbb@@QAAXW4priority_t at 2@@Z )
+__TBB_SYMBOL( ?priority at task_group_context@tbb@@QBA?AW4priority_t at 2@XZ )
#endif /* __TBB_TASK_PRIORITY */
-__TBB_SYMBOL( ?name at captured_exception@tbb@@UBEPBDXZ )
-__TBB_SYMBOL( ?what at captured_exception@tbb@@UBEPBDXZ )
-__TBB_SYMBOL( ??1captured_exception at tbb@@UAE at XZ )
-__TBB_SYMBOL( ?move at captured_exception@tbb@@UAEPAV12 at XZ )
-__TBB_SYMBOL( ?destroy at captured_exception@tbb@@UAEXXZ )
-__TBB_SYMBOL( ?set at captured_exception@tbb@@QAEXPBD0 at Z )
-__TBB_SYMBOL( ?clear at captured_exception@tbb@@QAEXXZ )
+__TBB_SYMBOL( ?name at captured_exception@tbb@@UBAPBDXZ )
+__TBB_SYMBOL( ?what at captured_exception@tbb@@UBAPBDXZ )
+__TBB_SYMBOL( ??1captured_exception at tbb@@UAA at XZ )
+__TBB_SYMBOL( ?move at captured_exception@tbb@@UAAPAV12 at XZ )
+__TBB_SYMBOL( ?destroy at captured_exception@tbb@@UAAXXZ )
+__TBB_SYMBOL( ?set at captured_exception@tbb@@QAAXPBD0 at Z )
+__TBB_SYMBOL( ?clear at captured_exception@tbb@@QAAXXZ )
#endif /* __TBB_TASK_GROUP_CONTEXT */
// Symbols for exceptions thrown from TBB
__TBB_SYMBOL( ?throw_bad_last_alloc_exception_v4 at internal@tbb@@YAXXZ )
__TBB_SYMBOL( ?throw_exception_v4 at internal@tbb@@YAXW4exception_id at 12@@Z )
-__TBB_SYMBOL( ?what at bad_last_alloc@tbb@@UBEPBDXZ )
-__TBB_SYMBOL( ?what at missing_wait@tbb@@UBEPBDXZ )
-__TBB_SYMBOL( ?what at invalid_multiple_scheduling@tbb@@UBEPBDXZ )
-__TBB_SYMBOL( ?what at improper_lock@tbb@@UBEPBDXZ )
-__TBB_SYMBOL( ?what at user_abort@tbb@@UBEPBDXZ )
+__TBB_SYMBOL( ?what at bad_last_alloc@tbb@@UBAPBDXZ )
+__TBB_SYMBOL( ?what at missing_wait@tbb@@UBAPBDXZ )
+__TBB_SYMBOL( ?what at invalid_multiple_scheduling@tbb@@UBAPBDXZ )
+__TBB_SYMBOL( ?what at improper_lock@tbb@@UBAPBDXZ )
+__TBB_SYMBOL( ?what at user_abort@tbb@@UBAPBDXZ )
// tbb_misc.cpp
__TBB_SYMBOL( ?assertion_failure at tbb@@YAXPBDH00 at Z )
@@ -122,41 +123,41 @@ __TBB_SYMBOL( ?itt_set_sync_name_v3 at internal@tbb@@YAXPAXPB_W at Z )
__TBB_SYMBOL( ?itt_load_pointer_v3 at internal@tbb@@YAPAXPBX at Z )
// pipeline.cpp
-__TBB_SYMBOL( ??0pipeline at tbb@@QAE at XZ )
-__TBB_SYMBOL( ??1filter at tbb@@UAE at XZ )
-__TBB_SYMBOL( ??1pipeline at tbb@@UAE at XZ )
+__TBB_SYMBOL( ??0pipeline at tbb@@QAA at XZ )
+__TBB_SYMBOL( ??1filter at tbb@@UAA at XZ )
+__TBB_SYMBOL( ??1pipeline at tbb@@UAA at XZ )
__TBB_SYMBOL( ??_7pipeline at tbb@@6B@ )
-__TBB_SYMBOL( ?add_filter at pipeline@tbb@@QAEXAAVfilter at 2@@Z )
-__TBB_SYMBOL( ?clear at pipeline@tbb@@QAEXXZ )
-__TBB_SYMBOL( ?inject_token at pipeline@tbb@@AAEXAAVtask at 2@@Z )
-__TBB_SYMBOL( ?run at pipeline@tbb@@QAEXI at Z )
+__TBB_SYMBOL( ?add_filter at pipeline@tbb@@QAAXAAVfilter at 2@@Z )
+__TBB_SYMBOL( ?clear at pipeline@tbb@@QAAXXZ )
+__TBB_SYMBOL( ?inject_token at pipeline@tbb@@AAAXAAVtask at 2@@Z )
+__TBB_SYMBOL( ?run at pipeline@tbb@@QAAXI at Z )
#if __TBB_TASK_GROUP_CONTEXT
-__TBB_SYMBOL( ?run at pipeline@tbb@@QAEXIAAVtask_group_context at 2@@Z )
+__TBB_SYMBOL( ?run at pipeline@tbb@@QAAXIAAVtask_group_context at 2@@Z )
#endif
-__TBB_SYMBOL( ?process_item at thread_bound_filter@tbb@@QAE?AW4result_type at 12@XZ )
-__TBB_SYMBOL( ?try_process_item at thread_bound_filter@tbb@@QAE?AW4result_type at 12@XZ )
-__TBB_SYMBOL( ?set_end_of_input at filter@tbb@@IAEXXZ )
+__TBB_SYMBOL( ?process_item at thread_bound_filter@tbb@@QAA?AW4result_type at 12@XZ )
+__TBB_SYMBOL( ?try_process_item at thread_bound_filter@tbb@@QAA?AW4result_type at 12@XZ )
+__TBB_SYMBOL( ?set_end_of_input at filter@tbb@@IAAXXZ )
// queuing_rw_mutex.cpp
-__TBB_SYMBOL( ?internal_construct at queuing_rw_mutex@tbb@@QAEXXZ )
-__TBB_SYMBOL( ?acquire at scoped_lock@queuing_rw_mutex at tbb@@QAEXAAV23 at _N@Z )
-__TBB_SYMBOL( ?downgrade_to_reader at scoped_lock@queuing_rw_mutex at tbb@@QAE_NXZ )
-__TBB_SYMBOL( ?release at scoped_lock@queuing_rw_mutex at tbb@@QAEXXZ )
-__TBB_SYMBOL( ?upgrade_to_writer at scoped_lock@queuing_rw_mutex at tbb@@QAE_NXZ )
-__TBB_SYMBOL( ?try_acquire at scoped_lock@queuing_rw_mutex at tbb@@QAE_NAAV23 at _N@Z )
+__TBB_SYMBOL( ?internal_construct at queuing_rw_mutex@tbb@@QAAXXZ )
+__TBB_SYMBOL( ?acquire at scoped_lock@queuing_rw_mutex at tbb@@QAAXAAV23 at _N@Z )
+__TBB_SYMBOL( ?downgrade_to_reader at scoped_lock@queuing_rw_mutex at tbb@@QAA_NXZ )
+__TBB_SYMBOL( ?release at scoped_lock@queuing_rw_mutex at tbb@@QAAXXZ )
+__TBB_SYMBOL( ?upgrade_to_writer at scoped_lock@queuing_rw_mutex at tbb@@QAA_NXZ )
+__TBB_SYMBOL( ?try_acquire at scoped_lock@queuing_rw_mutex at tbb@@QAA_NAAV23 at _N@Z )
// reader_writer_lock.cpp
-__TBB_SYMBOL( ?try_lock_read at reader_writer_lock@interface5 at tbb@@QAE_NXZ )
-__TBB_SYMBOL( ?try_lock at reader_writer_lock@interface5 at tbb@@QAE_NXZ )
-__TBB_SYMBOL( ?unlock at reader_writer_lock@interface5 at tbb@@QAEXXZ )
-__TBB_SYMBOL( ?lock_read at reader_writer_lock@interface5 at tbb@@QAEXXZ )
-__TBB_SYMBOL( ?lock at reader_writer_lock@interface5 at tbb@@QAEXXZ )
-__TBB_SYMBOL( ?internal_construct at reader_writer_lock@interface5 at tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_destroy at reader_writer_lock@interface5 at tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_construct at scoped_lock@reader_writer_lock at interface5@tbb@@AAEXAAV234@@Z )
-__TBB_SYMBOL( ?internal_destroy at scoped_lock@reader_writer_lock at interface5@tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_construct at scoped_lock_read@reader_writer_lock at interface5@tbb@@AAEXAAV234@@Z )
-__TBB_SYMBOL( ?internal_destroy at scoped_lock_read@reader_writer_lock at interface5@tbb@@AAEXXZ )
+__TBB_SYMBOL( ?try_lock_read at reader_writer_lock@interface5 at tbb@@QAA_NXZ )
+__TBB_SYMBOL( ?try_lock at reader_writer_lock@interface5 at tbb@@QAA_NXZ )
+__TBB_SYMBOL( ?unlock at reader_writer_lock@interface5 at tbb@@QAAXXZ )
+__TBB_SYMBOL( ?lock_read at reader_writer_lock@interface5 at tbb@@QAAXXZ )
+__TBB_SYMBOL( ?lock at reader_writer_lock@interface5 at tbb@@QAAXXZ )
+__TBB_SYMBOL( ?internal_construct at reader_writer_lock@interface5 at tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_destroy at reader_writer_lock@interface5 at tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_construct at scoped_lock@reader_writer_lock at interface5@tbb@@AAAXAAV234@@Z )
+__TBB_SYMBOL( ?internal_destroy at scoped_lock@reader_writer_lock at interface5@tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_construct at scoped_lock_read@reader_writer_lock at interface5@tbb@@AAAXAAV234@@Z )
+__TBB_SYMBOL( ?internal_destroy at scoped_lock_read@reader_writer_lock at interface5@tbb@@AAAXXZ )
#if !TBB_NO_LEGACY
// spin_rw_mutex.cpp v2
@@ -172,116 +173,116 @@ __TBB_SYMBOL( ?internal_try_acquire_reader at spin_rw_mutex@tbb@@CA_NPAV12@@Z )
#endif
// spin_rw_mutex v3
-__TBB_SYMBOL( ?internal_construct at spin_rw_mutex_v3@tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_upgrade at spin_rw_mutex_v3@tbb@@AAE_NXZ )
-__TBB_SYMBOL( ?internal_downgrade at spin_rw_mutex_v3@tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_acquire_reader at spin_rw_mutex_v3@tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_acquire_writer at spin_rw_mutex_v3@tbb@@AAE_NXZ )
-__TBB_SYMBOL( ?internal_release_reader at spin_rw_mutex_v3@tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_release_writer at spin_rw_mutex_v3@tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_try_acquire_reader at spin_rw_mutex_v3@tbb@@AAE_NXZ )
-__TBB_SYMBOL( ?internal_try_acquire_writer at spin_rw_mutex_v3@tbb@@AAE_NXZ )
+__TBB_SYMBOL( ?internal_construct at spin_rw_mutex_v3@tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_upgrade at spin_rw_mutex_v3@tbb@@AAA_NXZ )
+__TBB_SYMBOL( ?internal_downgrade at spin_rw_mutex_v3@tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_acquire_reader at spin_rw_mutex_v3@tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_acquire_writer at spin_rw_mutex_v3@tbb@@AAA_NXZ )
+__TBB_SYMBOL( ?internal_release_reader at spin_rw_mutex_v3@tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_release_writer at spin_rw_mutex_v3@tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_try_acquire_reader at spin_rw_mutex_v3@tbb@@AAA_NXZ )
+__TBB_SYMBOL( ?internal_try_acquire_writer at spin_rw_mutex_v3@tbb@@AAA_NXZ )
// spin_mutex.cpp
-__TBB_SYMBOL( ?internal_construct at spin_mutex@tbb@@QAEXXZ )
-__TBB_SYMBOL( ?internal_acquire at scoped_lock@spin_mutex at tbb@@AAEXAAV23@@Z )
-__TBB_SYMBOL( ?internal_release at scoped_lock@spin_mutex at tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_try_acquire at scoped_lock@spin_mutex at tbb@@AAE_NAAV23@@Z )
+__TBB_SYMBOL( ?internal_construct at spin_mutex@tbb@@QAAXXZ )
+__TBB_SYMBOL( ?internal_acquire at scoped_lock@spin_mutex at tbb@@AAAXAAV23@@Z )
+__TBB_SYMBOL( ?internal_release at scoped_lock@spin_mutex at tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_try_acquire at scoped_lock@spin_mutex at tbb@@AAA_NAAV23@@Z )
// mutex.cpp
-__TBB_SYMBOL( ?internal_acquire at scoped_lock@mutex at tbb@@AAEXAAV23@@Z )
-__TBB_SYMBOL( ?internal_release at scoped_lock@mutex at tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_try_acquire at scoped_lock@mutex at tbb@@AAE_NAAV23@@Z )
-__TBB_SYMBOL( ?internal_construct at mutex@tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_destroy at mutex@tbb@@AAEXXZ )
+__TBB_SYMBOL( ?internal_acquire at scoped_lock@mutex at tbb@@AAAXAAV23@@Z )
+__TBB_SYMBOL( ?internal_release at scoped_lock@mutex at tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_try_acquire at scoped_lock@mutex at tbb@@AAA_NAAV23@@Z )
+__TBB_SYMBOL( ?internal_construct at mutex@tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_destroy at mutex@tbb@@AAAXXZ )
// recursive_mutex.cpp
-__TBB_SYMBOL( ?internal_acquire at scoped_lock@recursive_mutex at tbb@@AAEXAAV23@@Z )
-__TBB_SYMBOL( ?internal_release at scoped_lock@recursive_mutex at tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_try_acquire at scoped_lock@recursive_mutex at tbb@@AAE_NAAV23@@Z )
-__TBB_SYMBOL( ?internal_construct at recursive_mutex@tbb@@AAEXXZ )
-__TBB_SYMBOL( ?internal_destroy at recursive_mutex@tbb@@AAEXXZ )
+__TBB_SYMBOL( ?internal_acquire at scoped_lock@recursive_mutex at tbb@@AAAXAAV23@@Z )
+__TBB_SYMBOL( ?internal_release at scoped_lock@recursive_mutex at tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_try_acquire at scoped_lock@recursive_mutex at tbb@@AAA_NAAV23@@Z )
+__TBB_SYMBOL( ?internal_construct at recursive_mutex@tbb@@AAAXXZ )
+__TBB_SYMBOL( ?internal_destroy at recursive_mutex@tbb@@AAAXXZ )
// queuing_mutex.cpp
-__TBB_SYMBOL( ?internal_construct at queuing_mutex@tbb@@QAEXXZ )
-__TBB_SYMBOL( ?acquire at scoped_lock@queuing_mutex at tbb@@QAEXAAV23@@Z )
-__TBB_SYMBOL( ?release at scoped_lock@queuing_mutex at tbb@@QAEXXZ )
-__TBB_SYMBOL( ?try_acquire at scoped_lock@queuing_mutex at tbb@@QAE_NAAV23@@Z )
+__TBB_SYMBOL( ?internal_construct at queuing_mutex@tbb@@QAAXXZ )
+__TBB_SYMBOL( ?acquire at scoped_lock@queuing_mutex at tbb@@QAAXAAV23@@Z )
+__TBB_SYMBOL( ?release at scoped_lock@queuing_mutex at tbb@@QAAXXZ )
+__TBB_SYMBOL( ?try_acquire at scoped_lock@queuing_mutex at tbb@@QAA_NAAV23@@Z )
// critical_section.cpp
-__TBB_SYMBOL( ?internal_construct at critical_section_v4@internal at tbb@@QAEXXZ )
+__TBB_SYMBOL( ?internal_construct at critical_section_v4@internal at tbb@@QAAXXZ )
#if !TBB_NO_LEGACY
// concurrent_hash_map.cpp
-__TBB_SYMBOL( ?internal_grow_predicate at hash_map_segment_base@internal at tbb@@QBE_NXZ )
+__TBB_SYMBOL( ?internal_grow_predicate at hash_map_segment_base@internal at tbb@@QBA_NXZ )
// concurrent_queue.cpp v2
-__TBB_SYMBOL( ?advance at concurrent_queue_iterator_base@internal at tbb@@IAEXXZ )
-__TBB_SYMBOL( ?assign at concurrent_queue_iterator_base@internal at tbb@@IAEXABV123@@Z )
-__TBB_SYMBOL( ?internal_size at concurrent_queue_base@internal at tbb@@IBEHXZ )
-__TBB_SYMBOL( ??0concurrent_queue_base at internal@tbb@@IAE at I@Z )
-__TBB_SYMBOL( ??0concurrent_queue_iterator_base at internal@tbb@@IAE at ABVconcurrent_queue_base@12@@Z )
-__TBB_SYMBOL( ??1concurrent_queue_base at internal@tbb@@MAE at XZ )
-__TBB_SYMBOL( ??1concurrent_queue_iterator_base at internal@tbb@@IAE at XZ )
-__TBB_SYMBOL( ?internal_pop at concurrent_queue_base@internal at tbb@@IAEXPAX at Z )
-__TBB_SYMBOL( ?internal_pop_if_present at concurrent_queue_base@internal at tbb@@IAE_NPAX at Z )
-__TBB_SYMBOL( ?internal_push at concurrent_queue_base@internal at tbb@@IAEXPBX at Z )
-__TBB_SYMBOL( ?internal_push_if_not_full at concurrent_queue_base@internal at tbb@@IAE_NPBX at Z )
-__TBB_SYMBOL( ?internal_set_capacity at concurrent_queue_base@internal at tbb@@IAEXHI at Z )
+__TBB_SYMBOL( ?advance at concurrent_queue_iterator_base@internal at tbb@@IAAXXZ )
+__TBB_SYMBOL( ?assign at concurrent_queue_iterator_base@internal at tbb@@IAAXABV123@@Z )
+__TBB_SYMBOL( ?internal_size at concurrent_queue_base@internal at tbb@@IBAHXZ )
+__TBB_SYMBOL( ??0concurrent_queue_base at internal@tbb@@IAA at I@Z )
+__TBB_SYMBOL( ??0concurrent_queue_iterator_base at internal@tbb@@IAA at ABVconcurrent_queue_base@12@@Z )
+__TBB_SYMBOL( ??1concurrent_queue_base at internal@tbb@@MAA at XZ )
+__TBB_SYMBOL( ??1concurrent_queue_iterator_base at internal@tbb@@IAA at XZ )
+__TBB_SYMBOL( ?internal_pop at concurrent_queue_base@internal at tbb@@IAAXPAX at Z )
+__TBB_SYMBOL( ?internal_pop_if_present at concurrent_queue_base@internal at tbb@@IAA_NPAX at Z )
+__TBB_SYMBOL( ?internal_push at concurrent_queue_base@internal at tbb@@IAAXPBX at Z )
+__TBB_SYMBOL( ?internal_push_if_not_full at concurrent_queue_base@internal at tbb@@IAA_NPBX at Z )
+__TBB_SYMBOL( ?internal_set_capacity at concurrent_queue_base@internal at tbb@@IAAXHI at Z )
#endif
// concurrent_queue v3
-__TBB_SYMBOL( ??1concurrent_queue_iterator_base_v3 at internal@tbb@@IAE at XZ )
-__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3 at internal@tbb@@IAE at ABVconcurrent_queue_base_v3@12@@Z )
-__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3 at internal@tbb@@IAE at ABVconcurrent_queue_base_v3@12 at I@Z )
-__TBB_SYMBOL( ?advance at concurrent_queue_iterator_base_v3@internal at tbb@@IAEXXZ )
-__TBB_SYMBOL( ?assign at concurrent_queue_iterator_base_v3@internal at tbb@@IAEXABV123@@Z )
-__TBB_SYMBOL( ??0concurrent_queue_base_v3 at internal@tbb@@IAE at I@Z )
-__TBB_SYMBOL( ??1concurrent_queue_base_v3 at internal@tbb@@MAE at XZ )
-__TBB_SYMBOL( ?internal_pop at concurrent_queue_base_v3@internal at tbb@@IAEXPAX at Z )
-__TBB_SYMBOL( ?internal_pop_if_present at concurrent_queue_base_v3@internal at tbb@@IAE_NPAX at Z )
-__TBB_SYMBOL( ?internal_abort at concurrent_queue_base_v3@internal at tbb@@IAEXXZ )
-__TBB_SYMBOL( ?internal_push at concurrent_queue_base_v3@internal at tbb@@IAEXPBX at Z )
-__TBB_SYMBOL( ?internal_push_if_not_full at concurrent_queue_base_v3@internal at tbb@@IAE_NPBX at Z )
-__TBB_SYMBOL( ?internal_size at concurrent_queue_base_v3@internal at tbb@@IBEHXZ )
-__TBB_SYMBOL( ?internal_empty at concurrent_queue_base_v3@internal at tbb@@IBE_NXZ )
-__TBB_SYMBOL( ?internal_set_capacity at concurrent_queue_base_v3@internal at tbb@@IAEXHI at Z )
-__TBB_SYMBOL( ?internal_finish_clear at concurrent_queue_base_v3@internal at tbb@@IAEXXZ )
-__TBB_SYMBOL( ?internal_throw_exception at concurrent_queue_base_v3@internal at tbb@@IBEXXZ )
-__TBB_SYMBOL( ?assign at concurrent_queue_base_v3@internal at tbb@@IAEXABV123@@Z )
+__TBB_SYMBOL( ??1concurrent_queue_iterator_base_v3 at internal@tbb@@IAA at XZ )
+__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3 at internal@tbb@@IAA at ABVconcurrent_queue_base_v3@12@@Z )
+__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3 at internal@tbb@@IAA at ABVconcurrent_queue_base_v3@12 at I@Z )
+__TBB_SYMBOL( ?advance at concurrent_queue_iterator_base_v3@internal at tbb@@IAAXXZ )
+__TBB_SYMBOL( ?assign at concurrent_queue_iterator_base_v3@internal at tbb@@IAAXABV123@@Z )
+__TBB_SYMBOL( ??0concurrent_queue_base_v3 at internal@tbb@@IAA at I@Z )
+__TBB_SYMBOL( ??1concurrent_queue_base_v3 at internal@tbb@@MAA at XZ )
+__TBB_SYMBOL( ?internal_pop at concurrent_queue_base_v3@internal at tbb@@IAAXPAX at Z )
+__TBB_SYMBOL( ?internal_pop_if_present at concurrent_queue_base_v3@internal at tbb@@IAA_NPAX at Z )
+__TBB_SYMBOL( ?internal_abort at concurrent_queue_base_v3@internal at tbb@@IAAXXZ )
+__TBB_SYMBOL( ?internal_push at concurrent_queue_base_v3@internal at tbb@@IAAXPBX at Z )
+__TBB_SYMBOL( ?internal_push_if_not_full at concurrent_queue_base_v3@internal at tbb@@IAA_NPBX at Z )
+__TBB_SYMBOL( ?internal_size at concurrent_queue_base_v3@internal at tbb@@IBAHXZ )
+__TBB_SYMBOL( ?internal_empty at concurrent_queue_base_v3@internal at tbb@@IBA_NXZ )
+__TBB_SYMBOL( ?internal_set_capacity at concurrent_queue_base_v3@internal at tbb@@IAAXHI at Z )
+__TBB_SYMBOL( ?internal_finish_clear at concurrent_queue_base_v3@internal at tbb@@IAAXXZ )
+__TBB_SYMBOL( ?internal_throw_exception at concurrent_queue_base_v3@internal at tbb@@IBAXXZ )
+__TBB_SYMBOL( ?assign at concurrent_queue_base_v3@internal at tbb@@IAAXABV123@@Z )
#if !TBB_NO_LEGACY
// concurrent_vector.cpp v2
-__TBB_SYMBOL( ?internal_assign at concurrent_vector_base@internal at tbb@@IAEXABV123 at IP6AXPAXI@ZP6AX1PBXI at Z4@Z )
-__TBB_SYMBOL( ?internal_capacity at concurrent_vector_base@internal at tbb@@IBEIXZ )
-__TBB_SYMBOL( ?internal_clear at concurrent_vector_base@internal at tbb@@IAEXP6AXPAXI at Z_N@Z )
-__TBB_SYMBOL( ?internal_copy at concurrent_vector_base@internal at tbb@@IAEXABV123 at IP6AXPAXPBXI@Z at Z )
-__TBB_SYMBOL( ?internal_grow_by at concurrent_vector_base@internal at tbb@@IAEIIIP6AXPAXI at Z@Z )
-__TBB_SYMBOL( ?internal_grow_to_at_least at concurrent_vector_base@internal at tbb@@IAEXIIP6AXPAXI at Z@Z )
-__TBB_SYMBOL( ?internal_push_back at concurrent_vector_base@internal at tbb@@IAEPAXIAAI at Z )
-__TBB_SYMBOL( ?internal_reserve at concurrent_vector_base@internal at tbb@@IAEXIII at Z )
+__TBB_SYMBOL( ?internal_assign at concurrent_vector_base@internal at tbb@@IAAXABV123 at IP6AXPAXI@ZP6AX1PBXI at Z4@Z )
+__TBB_SYMBOL( ?internal_capacity at concurrent_vector_base@internal at tbb@@IBAIXZ )
+__TBB_SYMBOL( ?internal_clear at concurrent_vector_base@internal at tbb@@IAAXP6AXPAXI at Z_N@Z )
+__TBB_SYMBOL( ?internal_copy at concurrent_vector_base@internal at tbb@@IAAXABV123 at IP6AXPAXPBXI@Z at Z )
+__TBB_SYMBOL( ?internal_grow_by at concurrent_vector_base@internal at tbb@@IAAIIIP6AXPAXI at Z@Z )
+__TBB_SYMBOL( ?internal_grow_to_at_least at concurrent_vector_base@internal at tbb@@IAAXIIP6AXPAXI at Z@Z )
+__TBB_SYMBOL( ?internal_push_back at concurrent_vector_base@internal at tbb@@IAAPAXIAAI at Z )
+__TBB_SYMBOL( ?internal_reserve at concurrent_vector_base@internal at tbb@@IAAXIII at Z )
#endif
// concurrent_vector v3
-__TBB_SYMBOL( ??1concurrent_vector_base_v3 at internal@tbb@@IAE at XZ )
-__TBB_SYMBOL( ?internal_assign at concurrent_vector_base_v3@internal at tbb@@IAEXABV123 at IP6AXPAXI@ZP6AX1PBXI at Z4@Z )
-__TBB_SYMBOL( ?internal_capacity at concurrent_vector_base_v3@internal at tbb@@IBEIXZ )
-__TBB_SYMBOL( ?internal_clear at concurrent_vector_base_v3@internal at tbb@@IAEIP6AXPAXI at Z@Z )
-__TBB_SYMBOL( ?internal_copy at concurrent_vector_base_v3@internal at tbb@@IAEXABV123 at IP6AXPAXPBXI@Z at Z )
-__TBB_SYMBOL( ?internal_grow_by at concurrent_vector_base_v3@internal at tbb@@IAEIIIP6AXPAXPBXI at Z1@Z )
-__TBB_SYMBOL( ?internal_grow_to_at_least at concurrent_vector_base_v3@internal at tbb@@IAEXIIP6AXPAXPBXI at Z1@Z )
-__TBB_SYMBOL( ?internal_push_back at concurrent_vector_base_v3@internal at tbb@@IAEPAXIAAI at Z )
-__TBB_SYMBOL( ?internal_reserve at concurrent_vector_base_v3@internal at tbb@@IAEXIII at Z )
-__TBB_SYMBOL( ?internal_compact at concurrent_vector_base_v3@internal at tbb@@IAEPAXIPAXP6AX0I at ZP6AX0PBXI@Z at Z )
-__TBB_SYMBOL( ?internal_swap at concurrent_vector_base_v3@internal at tbb@@IAEXAAV123@@Z )
-__TBB_SYMBOL( ?internal_throw_exception at concurrent_vector_base_v3@internal at tbb@@IBEXI at Z )
-__TBB_SYMBOL( ?internal_resize at concurrent_vector_base_v3@internal at tbb@@IAEXIIIPBXP6AXPAXI at ZP6AX10I@Z at Z )
-__TBB_SYMBOL( ?internal_grow_to_at_least_with_result at concurrent_vector_base_v3@internal at tbb@@IAEIIIP6AXPAXPBXI at Z1@Z )
+__TBB_SYMBOL( ??1concurrent_vector_base_v3 at internal@tbb@@IAA at XZ )
+__TBB_SYMBOL( ?internal_assign at concurrent_vector_base_v3@internal at tbb@@IAAXABV123 at IP6AXPAXI@ZP6AX1PBXI at Z4@Z )
+__TBB_SYMBOL( ?internal_capacity at concurrent_vector_base_v3@internal at tbb@@IBAIXZ )
+__TBB_SYMBOL( ?internal_clear at concurrent_vector_base_v3@internal at tbb@@IAAIP6AXPAXI at Z@Z )
+__TBB_SYMBOL( ?internal_copy at concurrent_vector_base_v3@internal at tbb@@IAAXABV123 at IP6AXPAXPBXI@Z at Z )
+__TBB_SYMBOL( ?internal_grow_by at concurrent_vector_base_v3@internal at tbb@@IAAIIIP6AXPAXPBXI at Z1@Z )
+__TBB_SYMBOL( ?internal_grow_to_at_least at concurrent_vector_base_v3@internal at tbb@@IAAXIIP6AXPAXPBXI at Z1@Z )
+__TBB_SYMBOL( ?internal_push_back at concurrent_vector_base_v3@internal at tbb@@IAAPAXIAAI at Z )
+__TBB_SYMBOL( ?internal_reserve at concurrent_vector_base_v3@internal at tbb@@IAAXIII at Z )
+__TBB_SYMBOL( ?internal_compact at concurrent_vector_base_v3@internal at tbb@@IAAPAXIPAXP6AX0I at ZP6AX0PBXI@Z at Z )
+__TBB_SYMBOL( ?internal_swap at concurrent_vector_base_v3@internal at tbb@@IAAXAAV123@@Z )
+__TBB_SYMBOL( ?internal_throw_exception at concurrent_vector_base_v3@internal at tbb@@IBAXI at Z )
+__TBB_SYMBOL( ?internal_resize at concurrent_vector_base_v3@internal at tbb@@IAAXIIIPBXP6AXPAXI at ZP6AX10I@Z at Z )
+__TBB_SYMBOL( ?internal_grow_to_at_least_with_result at concurrent_vector_base_v3@internal at tbb@@IAAIIIP6AXPAXPBXI at Z1@Z )
// tbb_thread
-__TBB_SYMBOL( ?join at tbb_thread_v3@internal at tbb@@QAEXXZ )
-__TBB_SYMBOL( ?detach at tbb_thread_v3@internal at tbb@@QAEXXZ )
-__TBB_SYMBOL( ?internal_start at tbb_thread_v3@internal at tbb@@AAEXP6GIPAX at Z0@Z )
+__TBB_SYMBOL( ?join at tbb_thread_v3@internal at tbb@@QAAXXZ )
+__TBB_SYMBOL( ?detach at tbb_thread_v3@internal at tbb@@QAAXXZ )
+__TBB_SYMBOL( ?internal_start at tbb_thread_v3@internal at tbb@@AAAXP6AIPAX at Z0@Z )
__TBB_SYMBOL( ?allocate_closure_v3 at internal@tbb@@YAPAXI at Z )
__TBB_SYMBOL( ?free_closure_v3 at internal@tbb@@YAXPAX at Z )
__TBB_SYMBOL( ?hardware_concurrency at tbb_thread_v3@internal at tbb@@SAIXZ )
diff --git a/src/tbb/xbox360-tbb-export.def b/src/tbb/xbox360-tbb-export.def
index 66c6580..4b48827 100644
--- a/src/tbb/xbox360-tbb-export.def
+++ b/src/tbb/xbox360-tbb-export.def
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
diff --git a/src/tbbmalloc/Customize.h b/src/tbbmalloc/Customize.h
index de3fb18..c27604f 100644
--- a/src/tbbmalloc/Customize.h
+++ b/src/tbbmalloc/Customize.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -62,29 +62,25 @@
in a strict block-scoped locking pattern. Omitting these methods permitted
further simplification. */
class MallocMutex : tbb::internal::no_copy {
- __TBB_atomic_flag value;
+ __TBB_atomic_flag flag;
public:
class scoped_lock : tbb::internal::no_copy {
- __TBB_Flag unlock_value;
MallocMutex& mutex;
+ bool taken;
public:
- scoped_lock( MallocMutex& m ) : unlock_value(__TBB_LockByte(m.value)), mutex(m) {}
- scoped_lock( MallocMutex& m, bool block, bool *locked ) : mutex(m) {
- unlock_value = 1;
+ scoped_lock( MallocMutex& m ) : mutex(m), taken(true) { __TBB_LockByte(m.flag); }
+ scoped_lock( MallocMutex& m, bool block, bool *locked ) : mutex(m), taken(false) {
if (block) {
- unlock_value = __TBB_LockByte(m.value);
- if (locked) *locked = true;
+ __TBB_LockByte(m.flag);
+ taken = true;
} else {
- if (__TBB_TryLockByte(m.value)) {
- unlock_value = 0;
- if (locked) *locked = true;
- } else
- if (locked) *locked = false;
+ taken = __TBB_TryLockByte(m.flag);
}
+ if (locked) *locked = taken;
}
~scoped_lock() {
- if (!unlock_value) __TBB_UnlockByte(mutex.value, unlock_value);
+ if (taken) __TBB_UnlockByte(mutex.flag);
}
};
friend class scoped_lock;
@@ -122,6 +118,18 @@ inline intptr_t BitScanRev(uintptr_t x) {
return !x? -1 : __TBB_Log2(x);
}
+template<typename T>
+static inline bool isAligned(T* arg, uintptr_t alignment) {
+ return tbb::internal::is_aligned(arg,alignment);
+}
+
+static inline bool isPowerOfTwo(uintptr_t arg) {
+ return tbb::internal::is_power_of_two(arg);
+}
+static inline bool isPowerOfTwoMultiple(uintptr_t arg, uintptr_t divisor) {
+ return arg && tbb::internal::is_power_of_two_factor(arg,divisor);
+}
+
inline void AtomicOr(volatile void *operand, uintptr_t addend) {
__TBB_AtomicOR(operand, addend);
}
@@ -135,7 +143,7 @@ inline void AtomicAnd(volatile void *operand, uintptr_t addend) {
// To support malloc replacement with LD_PRELOAD
#include "proxy.h"
-#if MALLOC_LD_PRELOAD
+#if MALLOC_UNIXLIKE_OVERLOAD_ENABLED
#define malloc_proxy __TBB_malloc_proxy
extern "C" void * __TBB_malloc_proxy(size_t) __attribute__ ((weak));
#else
diff --git a/src/tbbmalloc/MapMemory.h b/src/tbbmalloc/MapMemory.h
index b036cf4..76a4646 100644
--- a/src/tbbmalloc/MapMemory.h
+++ b/src/tbbmalloc/MapMemory.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -90,7 +90,7 @@ int UnmapMemory(void *area, size_t bytes)
return ret;
}
-#elif (_WIN32 || _WIN64) && !_XBOX
+#elif (_WIN32 || _WIN64) && !_XBOX && !__TBB_WIN8UI_SUPPORT
#include <windows.h>
#define MEMORY_MAPPING_USES_MALLOC 0
@@ -100,7 +100,7 @@ void* MapMemory (size_t bytes, bool)
return VirtualAlloc(NULL, bytes, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
}
-int UnmapMemory(void *area, size_t bytes)
+int UnmapMemory(void *area, size_t /*bytes*/)
{
BOOL result = VirtualFree(area, 0, MEM_RELEASE);
return !result;
@@ -114,7 +114,7 @@ void* MapMemory (size_t bytes, bool)
return ErrnoPreservingMalloc( bytes );
}
-int UnmapMemory(void *area, size_t bytes)
+int UnmapMemory(void *area, size_t /*bytes*/)
{
free( area );
return 0;
diff --git a/src/tbbmalloc/Statistics.h b/src/tbbmalloc/Statistics.h
index b6bd5be..cb4bd46 100644
--- a/src/tbbmalloc/Statistics.h
+++ b/src/tbbmalloc/Statistics.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbbmalloc/TypeDefinitions.h b/src/tbbmalloc/TypeDefinitions.h
index 5098ce2..e6495a5 100644
--- a/src/tbbmalloc/TypeDefinitions.h
+++ b/src/tbbmalloc/TypeDefinitions.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -37,6 +37,8 @@
# define __ARCH_ipf 1
# elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support
# define __ARCH_x86_32 1
+# elif defined(_M_ARM)
+# define __ARCH_other 1
# else
# error Unknown processor architecture for Windows
# endif
@@ -60,13 +62,19 @@
#define __STDC_LIMIT_MACROS 1
#endif
+//! PROVIDE YOUR OWN Customize.h IF YOU FEEL NECESSARY
+#include "Customize.h"
+
// Include files containing declarations of intptr_t and uintptr_t
#include <stddef.h> // size_t
#if _MSC_VER
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
-#else
+ #if !UINTPTR_MAX
+ #define UINTPTR_MAX SIZE_MAX
+ #endif
+#else // _MSC_VER
#include <stdint.h>
#endif
@@ -79,9 +87,6 @@ extern void (*original_free_ptr)(void*);
} } // namespaces
-//! PROVIDE YOUR OWN Customize.h IF YOU FEEL NECESSARY
-#include "Customize.h"
-
/*
* Functions to align an integer down or up to the given power of two,
* and test for such an alignment, and for power of two.
@@ -102,17 +107,5 @@ static inline T alignUpGeneric(T arg, uintptr_t alignment) {
}
return arg;
}
-template<typename T>
-static inline bool isAligned(T arg, uintptr_t alignment) {
- return 0==((uintptr_t)arg & (alignment-1));
-}
-static inline bool isPowerOfTwo(uintptr_t arg) {
- return arg && (0==(arg & (arg-1)));
-}
-static inline bool isPowerOfTwoMultiple(uintptr_t arg, uintptr_t divisor) {
- // Divisor is assumed to be a power of two (which is valid for current uses).
- MALLOC_ASSERT( isPowerOfTwo(divisor), "Divisor should be a power of two" );
- return arg && (0==(arg & (arg-divisor)));
-}
#endif /* _itt_shared_malloc_TypeDefinitions_H_ */
diff --git a/src/tbbmalloc/backend.cpp b/src/tbbmalloc/backend.cpp
index 62c015e..f87e3b9 100644
--- a/src/tbbmalloc/backend.cpp
+++ b/src/tbbmalloc/backend.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -59,19 +59,63 @@ bool freeRawMemory (void *object, size_t size) {
return UnmapMemory(object, size);
}
+void HugePagesStatus::registerAllocation(bool gotPage)
+{
+ if (gotPage) {
+ if (!wasObserved)
+ FencedStore(wasObserved, 1);
+ } else
+ FencedStore(enabled, 0);
+ // reports huge page status only once
+ if (needActualStatusPrint
+ && AtomicCompareExchange(needActualStatusPrint, 0, 1))
+ doPrintStatus(gotPage, "available");
+}
+
+void HugePagesStatus::registerReleasing(size_t size)
+{
+ // We: 1) got huge page at least once,
+ // 2) something that looks like a huge page is been released,
+ // and 3) user requested huge pages,
+ // so a huge page might be available at next allocation.
+ // TODO: keep page status in regions and use exact check here
+ // Use isPowerOfTwoMultiple because it's faster then generic reminder.
+ if (FencedLoad(wasObserved) && isPowerOfTwoMultiple(size, pageSize))
+ FencedStore(enabled, requestedMode.get());
+}
+
+void HugePagesStatus::printStatus() {
+ doPrintStatus(requestedMode.get(), "requested");
+ if (requestedMode.get()) { // report actual status iff requested
+ if (pageSize)
+ FencedStore(needActualStatusPrint, 1);
+ else
+ doPrintStatus(/*state=*/false, "available");
+ }
+}
+
+void HugePagesStatus::doPrintStatus(bool state, const char *stateName)
+{
+ fprintf(stderr, "TBBmalloc: huge pages\t%s%s\n",
+ state? "" : "not ", stateName);
+}
+
void *Backend::getRawMem(size_t &size) const
{
if (extMemPool->userPool()) {
size = alignUpGeneric(size, extMemPool->granularity);
return (*extMemPool->rawAlloc)(extMemPool->poolId, size);
}
- if (ExtMemoryPool::useHugePages) {
- size_t hugeSize = alignUpGeneric(size, ExtMemoryPool::hugePageSize);
- if (void *res = getRawMemory(hugeSize, /*hugePages=*/true)) {
+ // try to get them at 1st allocation and still use, if successful
+ // if 1st try is unsuccessful, no more trying
+ if (FencedLoad(hugePages.enabled)) {
+ size_t hugeSize = alignUpGeneric(size, hugePages.getSize());
+ void *res = getRawMemory(hugeSize, /*hugePages=*/true);
+ hugePages.registerAllocation(res);
+ if (res) {
size = hugeSize;
return res;
}
- ExtMemoryPool::useHugePages = false;
}
size_t granSize = alignUpGeneric(size, extMemPool->granularity);
if (void *res = getRawMemory(granSize, /*hugePages=*/false)) {
@@ -86,11 +130,7 @@ void Backend::freeRawMem(void *object, size_t size) const
if (extMemPool->userPool())
(*extMemPool->rawFree)(extMemPool->poolId, object, size);
else {
- // something that looks like a huge page is releasing,
- // so a huge page might be available at next allocation
- // TODO: keep page status in regions and use exact check here
- if (ExtMemoryPool::hugePageSize && !(size % ExtMemoryPool::hugePageSize))
- ExtMemoryPool::useHugePages = true;
+ hugePages.registerReleasing(size);
freeRawMemory(object, size);
}
}
@@ -260,11 +300,13 @@ FreeBlock *CoalRequestQ::getAll()
}
}
-// try to remove block from bin; if split result stay in the bin, not remove it
-// but split the block
-// alignedBin, if the bin is 16KB-aligned right side.
+// Try to get a block from a bin.
+// If the remaining free space would stay in the same bin,
+// split the block without removing it.
+// If the free space should go to other bin(s), remove the block.
+// alignedBin is true, if all blocks in the bin has slab-aligned right side.
FreeBlock *Backend::IndexedBins::getBlock(int binIdx, BackendSync *sync,
- size_t size, bool res16Kaligned, bool alignedBin, bool wait,
+ size_t size, bool needAlignedRes, bool alignedBin, bool wait,
int *binLocked)
{
Bin *b = &freeBins[binIdx];
@@ -285,7 +327,7 @@ try_next:
goto try_next;
}
- if (alignedBin || !res16Kaligned) {
+ if (alignedBin || !needAlignedRes) {
size_t splitSz = szBlock - size;
// If we got a block as split result,
// it must have a room for control structures.
@@ -293,7 +335,7 @@ try_next:
!splitSz))
fBlock = curr;
} else {
- void *newB = alignUp(curr, blockSize);
+ void *newB = alignUp(curr, slabSize);
uintptr_t rightNew = (uintptr_t)newB + size;
uintptr_t rightCurr = (uintptr_t)curr + szBlock;
// appropriate size, and left and right split results
@@ -308,8 +350,8 @@ try_next:
if (fBlock) {
// consume must be called before result of removing from a bin
// is visible externally.
- sync->consume();
- if (alignedBin && res16Kaligned &&
+ sync->blockConsumed();
+ if (alignedBin && needAlignedRes &&
Backend::sizeToBin(szBlock-size) == Backend::sizeToBin(szBlock)) {
// free remainder of fBlock stay in same bin,
// so no need to remove it from the bin
@@ -317,7 +359,7 @@ try_next:
FreeBlock *newFBlock = fBlock;
// return block from right side of fBlock
fBlock = (FreeBlock*)((uintptr_t)newFBlock + szBlock - size);
- MALLOC_ASSERT(isAligned(fBlock, blockSize), "Invalid free block");
+ MALLOC_ASSERT(isAligned(fBlock, slabSize), "Invalid free block");
fBlock->initHeader();
fBlock->setLeftFree(szBlock - size);
newFBlock->setMeFree(szBlock - size);
@@ -351,21 +393,30 @@ void Backend::Bin::removeBlock(FreeBlock *fBlock)
fBlock->next->prev = fBlock->prev;
}
-void Backend::IndexedBins::addBlock(int binIdx, FreeBlock *fBlock, size_t blockSz)
+void Backend::IndexedBins::addBlock(int binIdx, FreeBlock *fBlock, size_t blockSz, bool addToTail)
{
Bin *b = &freeBins[binIdx];
fBlock->myBin = binIdx;
fBlock->aligned = toAlignedBin(fBlock, blockSz);
- fBlock->prev = NULL;
+ fBlock->next = fBlock->prev = NULL;
{
MallocMutex::scoped_lock scopedLock(b->tLock);
- fBlock->next = b->head;
- b->head = fBlock;
- if (fBlock->next)
- fBlock->next->prev = fBlock;
- if (!b->tail)
+ if (addToTail) {
+ fBlock->prev = b->tail;
b->tail = fBlock;
+ if (fBlock->prev)
+ fBlock->prev->next = fBlock;
+ if (!b->head)
+ b->head = fBlock;
+ } else {
+ fBlock->next = b->head;
+ b->head = fBlock;
+ if (fBlock->next)
+ fBlock->next->prev = fBlock;
+ if (!b->tail)
+ b->tail = fBlock;
+ }
}
bitMask.set(binIdx, true);
}
@@ -429,18 +480,18 @@ bool ExtMemoryPool::regionsAreReleaseable() const
}
// try to allocate num blocks of size Bytes from particular "generic" bin
-// res16Kaligned is true if result must be 16KB alined
-FreeBlock *Backend::getFromBin(int binIdx, int num, size_t size, bool res16Kaligned,
+// needAlignedRes is true if result must be slab-aligned
+FreeBlock *Backend::getFromBin(int binIdx, int num, size_t size, bool needAlignedRes,
int *binLocked)
{
FreeBlock *fBlock =
- freeLargeBins.getBlock(binIdx, &bkndSync, num*size, res16Kaligned,
+ freeLargeBins.getBlock(binIdx, &bkndSync, num*size, needAlignedRes,
/*alignedBin=*/false, /*wait=*/false, binLocked);
if (fBlock) {
- if (res16Kaligned) {
+ if (needAlignedRes) {
size_t fBlockSz = fBlock->sizeTmp;
uintptr_t fBlockEnd = (uintptr_t)fBlock + fBlockSz;
- FreeBlock *newB = alignUp(fBlock, blockSize);
+ FreeBlock *newB = alignUp(fBlock, slabSize);
FreeBlock *rightPart = (FreeBlock*)((uintptr_t)newB + num*size);
// Space to use is in the middle,
@@ -456,7 +507,7 @@ FreeBlock *Backend::getFromBin(int binIdx, int num, size_t size, bool res16Kalig
}
fBlock = newB;
- MALLOC_ASSERT(isAligned(fBlock, blockSize), ASSERT_TEXT);
+ MALLOC_ASSERT(isAligned(fBlock, slabSize), ASSERT_TEXT);
} else {
if (size_t splitSz = fBlock->sizeTmp - num*size) {
// split block and return free right part
@@ -465,20 +516,20 @@ FreeBlock *Backend::getFromBin(int binIdx, int num, size_t size, bool res16Kalig
coalescAndPut(splitB, splitSz);
}
}
- bkndSync.signal();
+ bkndSync.blockReleased();
FreeBlock::markBlocks(fBlock, num, size);
}
return fBlock;
}
-// try to allocate size Byte block from any of 16KB-alined spaces.
-// res16Kaligned is true if result must be 16KN alined
+// try to allocate size Byte block from any of slab-aligned spaces.
+// needAlignedRes is true if result must be slab-aligned
FreeBlock *Backend::getFromAlignedSpace(int binIdx, int num, size_t size,
- bool res16Kaligned, bool wait, int *binLocked)
+ bool needAlignedRes, bool wait, int *binLocked)
{
FreeBlock *fBlock =
- freeAlignedBins.getBlock(binIdx, &bkndSync, num*size, res16Kaligned,
+ freeAlignedBins.getBlock(binIdx, &bkndSync, num*size, needAlignedRes,
/*alignedBin=*/true, wait, binLocked);
if (fBlock) {
@@ -486,11 +537,11 @@ FreeBlock *Backend::getFromAlignedSpace(int binIdx, int num, size_t size,
FreeBlock *newAlgnd;
size_t newSz;
- if (res16Kaligned) {
+ if (needAlignedRes) {
newAlgnd = fBlock;
fBlock = (FreeBlock*)((uintptr_t)newAlgnd + newAlgnd->sizeTmp
- num*size);
- MALLOC_ASSERT(isAligned(fBlock, blockSize), "Invalid free block");
+ MALLOC_ASSERT(isAligned(fBlock, slabSize), "Invalid free block");
fBlock->initHeader();
newSz = newAlgnd->sizeTmp - num*size;
} else {
@@ -500,8 +551,8 @@ FreeBlock *Backend::getFromAlignedSpace(int binIdx, int num, size_t size,
}
coalescAndPut(newAlgnd, newSz);
}
- bkndSync.signal();
- MALLOC_ASSERT(!res16Kaligned || isAligned(fBlock, blockSize), ASSERT_TEXT);
+ bkndSync.blockReleased();
+ MALLOC_ASSERT(!needAlignedRes || isAligned(fBlock, slabSize), ASSERT_TEXT);
FreeBlock::markBlocks(fBlock, num, size);
}
return fBlock;
@@ -509,32 +560,111 @@ FreeBlock *Backend::getFromAlignedSpace(int binIdx, int num, size_t size,
void Backend::correctMaxRequestSize(size_t requestSize)
{
- if (requestSize < maxBinedSize) {
- for (size_t oldMax = FencedLoad((intptr_t&)maxRequestedSize);
- requestSize > oldMax; ) {
+ // Find maximal requested size limited by getMaxBinnedSize()
+ if (requestSize < getMaxBinnedSize()) {
+ for (size_t oldMaxReq = maxRequestedSize;
+ requestSize > oldMaxReq && requestSize < getMaxBinnedSize(); ) {
size_t val = AtomicCompareExchange((intptr_t&)maxRequestedSize,
- requestSize, oldMax);
- if (val == oldMax)
+ requestSize, oldMaxReq);
+ if (val == oldMaxReq)
+ break;
+ oldMaxReq = val;
+ }
+ }
+}
+
+inline size_t Backend::getMaxBinnedSize()
+{
+ return hugePages.wasObserved && !inUserPool()?
+ maxBinned_HugePage : maxBinned_SmallPage;
+}
+
+bool Backend::askMemFromOS(size_t blockSize, intptr_t startModifiedCnt,
+ int *lockedBinsThreshold,
+ int numOfLockedBins, bool *largeBinsUpdated)
+{
+ size_t maxBinSize = 0;
+
+ // Another thread is modifying backend while we can't get the block.
+ // Wait while it leaves and re-do the scan
+ // before trying other ways to extend the backend.
+ if (bkndSync.waitTillBlockReleased(startModifiedCnt)
+ // semaphore is protecting adding more more memory from OS
+ || memExtendingSema.wait())
+ return true;
+
+ if (startModifiedCnt != bkndSync.getNumOfMods()) {
+ memExtendingSema.signal();
+ return true;
+ }
+ // To keep objects below maxBinnedSize, region must be larger then that.
+ // So trying to balance between too small regions (that leads to
+ // fragmentation) and too large ones (that leads to excessive address
+ // space consumption). If region is "quite large", allocate only one,
+ // to prevent fragmentation. It supposedly doesn't hurt performance,
+ // because the object requested by user is large.
+ const size_t maxBinned = getMaxBinnedSize();
+ const size_t regSz_sizeBased = blockSize>=maxBinned?
+ blockSize : alignUp(4*maxRequestedSize, 1024*1024);
+ if (blockSize == slabSize || blockSize == numOfSlabAllocOnMiss*slabSize
+ || regSz_sizeBased < maxBinned) {
+ for (unsigned idx=0; idx<4; idx++) {
+ size_t binSize = addNewRegion(maxBinned, /*exact=*/false);
+ if (!binSize)
break;
- oldMax = val;
+ if (binSize > maxBinSize)
+ maxBinSize = binSize;
}
+ } else {
+ // if huge pages enabled and blockSize>=maxBinned, rest of space up to
+ // huge page alignment is unusable, because single user object sits
+ // in an region.
+ *largeBinsUpdated = true;
+ maxBinSize = addNewRegion(regSz_sizeBased, /*exact=*/true);
}
+ memExtendingSema.signal();
+ askMemFromOSCounter.OSasked();
+
+ // When blockSize >= maxBinnedSize, and getRawMem failed
+ // for this allocation, allocation in bins
+ // is our last chance to fulfil the request.
+ // Sadly, size is larger then max bin, so have to give up.
+ if (maxBinSize && maxBinSize < blockSize)
+ return false;
+
+ if (!maxBinSize) { // no regions have been added, try to clean cache
+ if (extMemPool->hardCachesCleanup())
+ *largeBinsUpdated = true;
+ else {
+ // something can be in blocks that are in processing now
+ if (bkndSync.waitTillBlockReleased(startModifiedCnt))
+ return true;
+ // OS can't give us more memory, but we have some in locked bins
+ if (*lockedBinsThreshold && numOfLockedBins) {
+ *lockedBinsThreshold = 0;
+ return true;
+ }
+ return false; // nothing found, give up
+ }
+ }
+ return true;
}
// try to allocate size Byte block in available bins
-// res16Kaligned is true if result must be 16KB aligned
-FreeBlock *Backend::genericGetBlock(int num, size_t size, bool res16Kaligned)
+// needAlignedRes is true if result must be slab-aligned
+FreeBlock *Backend::genericGetBlock(int num, size_t size, bool needAlignedRes)
{
// after (soft|hard)CachesCleanup we can get memory in large bins,
- // while after addNewRegion only in ALGN_SPACE_BIN. This flag
+ // while after addNewRegion only in slab-aligned bins. This flag
// is for large bins update status.
bool largeBinsUpdated = true;
FreeBlock *block = NULL;
const size_t totalReqSize = num*size;
const int nativeBin = sizeToBin(totalReqSize);
// If we found 2 or less locked bins, it's time to ask more memory from OS.
- // But nothing can be asked from fixed pool.
- int lockedBinsThreshold = extMemPool->fixedPool || size>=maxBinedSize? 0 : 2;
+ // But nothing can be asked from fixed pool. And we prefer wait, not ask
+ // for more memory, if block is quite large.
+ int lockedBinsThreshold = extMemPool->fixedPool || size>=maxBinned_SmallPage? 0 : 2;
correctMaxRequestSize(totalReqSize);
scanCoalescQ(/*forceCoalescQDrop=*/false);
@@ -547,30 +677,30 @@ FreeBlock *Backend::genericGetBlock(int num, size_t size, bool res16Kaligned)
numOfLockedBins = 0;
// TODO: try different bin search order
- if (res16Kaligned) {
+ if (needAlignedRes) {
if (!block)
for ( int i=freeAlignedBins.getMinNonemptyBin(nativeBin);
i<freeBinsNum; i=freeAlignedBins.getMinNonemptyBin(i+1) ){
- block = getFromAlignedSpace(i, num, size, /*res16Kaligned=*/true, /*wait=*/false, &numOfLockedBins);
+ block = getFromAlignedSpace(i, num, size, /*needAlignedRes=*/true, /*wait=*/false, &numOfLockedBins);
if (block) break;
}
if (!block && largeBinsUpdated)
for ( int i=freeLargeBins.getMinNonemptyBin(nativeBin);
i<freeBinsNum; i=freeLargeBins.getMinNonemptyBin(i+1) ){
- block = getFromBin(i, num, size, /*res16Kaligned=*/true, &numOfLockedBins);
+ block = getFromBin(i, num, size, /*needAlignedRes=*/true, &numOfLockedBins);
if (block) break;
}
} else {
if (!block && largeBinsUpdated)
for ( int i=freeLargeBins.getMinNonemptyBin(nativeBin);
i<freeBinsNum; i=freeLargeBins.getMinNonemptyBin(i+1) ){
- block = getFromBin(i, num, size, /*res16Kaligned=*/false, &numOfLockedBins);
+ block = getFromBin(i, num, size, /*needAlignedRes=*/false, &numOfLockedBins);
if (block) break;
}
if (!block)
for ( int i=freeAlignedBins.getMinNonemptyBin(nativeBin);
i<freeBinsNum; i=freeAlignedBins.getMinNonemptyBin(i+1) ){
- block = getFromAlignedSpace(i, num, size, /*res16Kaligned=*/false, /*wait=*/false, &numOfLockedBins);
+ block = getFromAlignedSpace(i, num, size, /*needAlignedRes=*/false, /*wait=*/false, &numOfLockedBins);
if (block) break;
}
}
@@ -583,65 +713,9 @@ FreeBlock *Backend::genericGetBlock(int num, size_t size, bool res16Kaligned)
largeBinsUpdated = scanCoalescQ(/*forceCoalescQDrop=*/true);
largeBinsUpdated = extMemPool->softCachesCleanup() || largeBinsUpdated;
if (!largeBinsUpdated) {
- size_t maxBinSize = 0;
-
- // Another thread is modifying backend while we can't get the block.
- // Wait while it leaves and re-do the scan
- // before trying other ways to extend the backend.
- if (bkndSync.waitTillSignalled(startModifiedCnt)
- // semaphore is protecting adding more more memory from OS
- || memExtendingSema.wait())
- continue;
-
- if (startModifiedCnt != bkndSync.getNumOfMods()) {
- memExtendingSema.signal();
- continue;
- }
-
- // To keep objects below maxBinedSize, region must be larger then that.
- // So trying to balance between too small regions (that leads to
- // fragmentation) and too large ones (that leads to excessive address
- // space consumption). If region is "quite large", allocate only one,
- // to prevent fragmentation. It supposely doesn't hurt perfromance,
- // because the object requested by user is large.
- const size_t regSz_sizeBased = size>=maxBinedSize?
- size :
- alignUp(4*FencedLoad((intptr_t&)maxRequestedSize), 1024*1024);
- if (size == blockSize || regSz_sizeBased < maxBinedSize) {
- for (unsigned idx=0; idx<4; idx++) {
- size_t binSize = addNewRegion(maxBinedSize, /*exact=*/false);
- if (!binSize)
- break;
- if (binSize > maxBinSize)
- maxBinSize = binSize;
- }
- } else {
- largeBinsUpdated = true;
- maxBinSize = addNewRegion(regSz_sizeBased, /*exact=*/true);
- }
- memExtendingSema.signal();
-
- // size can be >= maxBinedSize, when getRawMem failed
- // for this allocation, and allocation in bins
- // is our last chance to fulfil the request.
- // Sadly, size is larger then max bin, so have to give up.
- if (maxBinSize && maxBinSize < size)
+ if (!askMemFromOS(totalReqSize, startModifiedCnt, &lockedBinsThreshold,
+ numOfLockedBins, &largeBinsUpdated))
return NULL;
-
- if (!maxBinSize) { // no regions have been added, try to clean cache
- if (extMemPool->hardCachesCleanup())
- largeBinsUpdated = true;
- else {
- if (bkndSync.waitTillSignalled(startModifiedCnt))
- continue;
- // OS can't give us more memory, but we have some in locked bins
- if (lockedBinsThreshold && numOfLockedBins) {
- lockedBinsThreshold = 0;
- continue;
- }
- return NULL;
- }
- }
}
}
return block;
@@ -650,7 +724,7 @@ FreeBlock *Backend::genericGetBlock(int num, size_t size, bool res16Kaligned)
LargeMemoryBlock *Backend::getLargeBlock(size_t size)
{
LargeMemoryBlock *lmb =
- (LargeMemoryBlock*)genericGetBlock(1, size, /*res16Kaligned=*/false);
+ (LargeMemoryBlock*)genericGetBlock(1, size, /*needAlignedRes=*/false);
if (lmb) {
lmb->unalignedSize = size;
if (extMemPool->mustBeAddedToGlobalLargeBlockList())
@@ -668,7 +742,7 @@ void *Backend::getBackRefSpace(size_t size, bool *rawMemUsed)
*rawMemUsed = true;
return ret;
}
- void *ret = genericGetBlock(1, size, /*res16Kaligned=*/false);
+ void *ret = genericGetBlock(1, size, /*needAlignedRes=*/false);
if (ret) *rawMemUsed = false;
return ret;
}
@@ -682,18 +756,19 @@ void Backend::putBackRefSpace(void *b, size_t size, bool rawMemUsed)
void Backend::removeBlockFromBin(FreeBlock *fBlock)
{
- if (fBlock->myBin != Backend::NO_BIN)
+ if (fBlock->myBin != Backend::NO_BIN) {
if (fBlock->aligned)
freeAlignedBins.lockRemoveBlock(fBlock->myBin, fBlock);
else
freeLargeBins.lockRemoveBlock(fBlock->myBin, fBlock);
+ }
}
void Backend::genericPutBlock(FreeBlock *fBlock, size_t blockSz)
{
- bkndSync.consume();
+ bkndSync.blockConsumed();
coalescAndPut(fBlock, blockSz);
- bkndSync.signal();
+ bkndSync.blockReleased();
}
void AllLargeBlocksList::add(LargeMemoryBlock *lmb)
@@ -726,8 +801,7 @@ void AllLargeBlocksList::removeAll(Backend *backend)
next = lmb->gNext;
// nothing left to AllLargeBlocksList::remove
lmb->gNext = lmb->gPrev = NULL;
- removeBackRef(lmb->backRefIdx);
- backend->putLargeBlock(lmb);
+ backend->returnLargeObject(lmb);
}
}
@@ -738,6 +812,13 @@ void Backend::putLargeBlock(LargeMemoryBlock *lmb)
genericPutBlock((FreeBlock *)lmb, lmb->unalignedSize);
}
+void Backend::returnLargeObject(LargeMemoryBlock *lmb)
+{
+ removeBackRef(lmb->backRefIdx);
+ putLargeBlock(lmb);
+ STAT_increment(getThreadId(), ThreadCommonCounters, freeLargeObj);
+}
+
void Backend::releaseRegion(MemRegion *memRegion)
{
{
@@ -839,11 +920,10 @@ FreeBlock *Backend::doCoalesc(FreeBlock *fBlock, MemRegion **mRegion)
return resBlock;
}
-void Backend::coalescAndPutList(FreeBlock *list, bool forceCoalescQDrop, bool doStat)
+void Backend::coalescAndPutList(FreeBlock *list, bool forceCoalescQDrop)
{
FreeBlock *helper;
MemRegion *memRegion;
- int alignedSpaceIdx = -1;
for (;list; list = helper) {
bool addToTail = false;
@@ -885,11 +965,12 @@ void Backend::coalescAndPutList(FreeBlock *list, bool forceCoalescQDrop, bool do
// If the block is too small to fit in any bin, keep it bin-less.
// It's not a leak because the block later can be coalesced.
- if (currSz >= minBinedSize) {
+ if (currSz >= minBinnedSize) {
toRet->sizeTmp = currSz;
- if (!(toAligned?
- freeAlignedBins.tryAddBlock(bin, toRet, addToTail) :
- freeLargeBins.tryAddBlock(bin, toRet, addToTail))) {
+ IndexedBins *target = toAligned? &freeAlignedBins : &freeLargeBins;
+ if (forceCoalescQDrop) {
+ target->tryAddBlock(bin, toRet, addToTail);
+ } else if (!target->tryAddBlock(bin, toRet, addToTail)) {
coalescQ.putBlock(toRet);
continue;
}
@@ -913,7 +994,7 @@ void Backend::coalescAndPut(FreeBlock *fBlock, size_t blockSz)
fBlock->sizeTmp = blockSz;
fBlock->nextToFree = NULL;
- coalescAndPutList(fBlock, /*forceCoalescQDrop=*/false, /*doStat=*/false);
+ coalescAndPutList(fBlock, /*forceCoalescQDrop=*/false);
}
bool Backend::scanCoalescQ(bool forceCoalescQDrop)
@@ -921,7 +1002,7 @@ bool Backend::scanCoalescQ(bool forceCoalescQDrop)
FreeBlock *currCoalescList = coalescQ.getAll();
if (currCoalescList)
- coalescAndPutList(currCoalescList, forceCoalescQDrop, /*doStat=*/true);
+ coalescAndPutList(currCoalescList, forceCoalescQDrop);
return currCoalescList;
}
@@ -936,17 +1017,17 @@ FreeBlock *Backend::findBlockInRegion(MemRegion *region)
fBlock = (FreeBlock *)alignUp((uintptr_t)region + sizeof(MemRegion),
largeObjectAlignment);
fBlockEnd = lastFreeBlock;
- } else { // right bound is 16KB-aligned, keep LastFreeBlock after it
+ } else { // right bound is slab-aligned, keep LastFreeBlock after it
fBlock = (FreeBlock *)((uintptr_t)region + sizeof(MemRegion));
- fBlockEnd = alignDown(lastFreeBlock, blockSize);
+ fBlockEnd = alignDown(lastFreeBlock, slabSize);
}
if (fBlockEnd <= (uintptr_t)fBlock)
return NULL; // allocSz is too small
blockSz = fBlockEnd - (uintptr_t)fBlock;
- // TODO: extend get16KBlock to support degradation, i.e. getting less blocks
+ // TODO: extend getSlabBlock to support degradation, i.e. getting less blocks
// then requested, and then relax this check
// (now all or nothing is implemented, check according to this)
- if (blockSz < numOfBlocksAllocOnMiss*blockSize)
+ if (blockSz < numOfSlabAllocOnMiss*slabSize)
return NULL;
region->blockSz = blockSz;
@@ -970,9 +1051,9 @@ void Backend::startUseBlock(MemRegion *region, FreeBlock *fBlock)
unsigned targetBin = sizeToBin(blockSz);
if (!region->exact && toAlignedBin(fBlock, blockSz)) {
- freeAlignedBins.addBlock(targetBin, fBlock, blockSz);
+ freeAlignedBins.addBlock(targetBin, fBlock, blockSz, /*addToTail=*/false);
} else {
- freeLargeBins.addBlock(targetBin, fBlock, blockSz);
+ freeLargeBins.addBlock(targetBin, fBlock, blockSz, /*addToTail=*/false);
}
}
@@ -1019,7 +1100,7 @@ size_t Backend::addNewRegion(size_t rawSize, bool exact)
size_t blockSz = region->blockSz;
startUseBlock(region, fBlock);
- bkndSync.pureSignal();
+ bkndSync.binsModified();
return blockSz;
}
@@ -1065,6 +1146,7 @@ void Backend::IndexedBins::verify()
uintptr_t mySz = fb->myL.value;
MALLOC_ASSERT(mySz>GuardedSize::MAX_SPEC_VAL, ASSERT_TEXT);
FreeBlock *right = (FreeBlock*)((uintptr_t)fb + mySz);
+ suppress_unused_warning(right);
MALLOC_ASSERT(right->myL.value<=GuardedSize::MAX_SPEC_VAL, ASSERT_TEXT);
MALLOC_ASSERT(right->leftL.value==mySz, ASSERT_TEXT);
MALLOC_ASSERT(fb->leftL.value<=GuardedSize::MAX_SPEC_VAL, ASSERT_TEXT);
@@ -1084,7 +1166,7 @@ void Backend::verify()
#endif // MALLOC_DEBUG
}
-#if _TBBMALLOC_BACKEND_LOG
+#if __TBB_MALLOC_BACKEND_STAT
size_t Backend::Bin::countFreeBlocks()
{
size_t cnt = 0;
@@ -1098,9 +1180,14 @@ size_t Backend::Bin::countFreeBlocks()
void Backend::IndexedBins::reportStat(FILE *f)
{
+ size_t totalSize = 0;
+
for (int i=0; i<Backend::freeBinsNum; i++)
- if (size_t cnt = freeBins[i].countFreeBlocks())
+ if (size_t cnt = freeBins[i].countFreeBlocks()) {
+ totalSize += cnt*Backend::binToSize(i);
fprintf(f, "%d:%lu ", i, cnt);
+ }
+ fprintf(f, "\ttotal size %lu KB", totalSize/1024);
}
void Backend::reportStat(FILE *f)
@@ -1120,6 +1207,6 @@ void Backend::reportStat(FILE *f)
freeAlignedBins.reportStat(f);
fprintf(f, "\n");
}
-#endif // _TBBMALLOC_BACKEND_LOG
+#endif // __TBB_MALLOC_BACKEND_STAT
} } // namespaces
diff --git a/src/tbbmalloc/backref.cpp b/src/tbbmalloc/backref.cpp
index 1973f02..92999e9 100644
--- a/src/tbbmalloc/backref.cpp
+++ b/src/tbbmalloc/backref.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,16 +26,16 @@
the GNU General Public License.
*/
+#include "tbbmalloc_internal.h"
#include <string.h>
#include <new> /* for placement new */
-#include "tbbmalloc_internal.h"
namespace rml {
namespace internal {
/********* backreferences ***********************/
-/* Each 16KB block and each large memory object header contains BackRefIdx
+/* Each slab block and each large memory object header contains BackRefIdx
* that points out in some BackRefBlock which points back to this block or header.
*/
struct BackRefBlock : public BlockI {
@@ -50,7 +50,7 @@ struct BackRefBlock : public BlockI {
bool addedToForUse; // this block is already added to the listForUse chain
BackRefBlock(BackRefBlock *blockToUse, int num) :
- nextForUse(NULL), bumpPtr((FreeObject*)((uintptr_t)blockToUse + blockSize - sizeof(void*))),
+ nextForUse(NULL), bumpPtr((FreeObject*)((uintptr_t)blockToUse + slabSize - sizeof(void*))),
freeList(NULL), nextRawMemBlock(NULL), allocatedCount(0), myNum(num),
addedToForUse(false) {
memset(&blockMutex, 0, sizeof(MallocMutex));
@@ -58,17 +58,15 @@ struct BackRefBlock : public BlockI {
MALLOC_ASSERT(!(myNum >> 16), ASSERT_TEXT);
}
- // when BackRefMaster::findFreeBlock() calls get16KBlock
- // BackRefBlock::bytes is used implicitly
// TODO: take into account VirtualAlloc granularity
- static const int bytes = blockSize;
+ static const int bytes = slabSize;
};
-// max number of backreference pointers in 16KB block
+// max number of backreference pointers in slab block
static const int BR_MAX_CNT = (BackRefBlock::bytes-sizeof(BackRefBlock))/sizeof(void*);
struct BackRefMaster {
-/* A 16KB block can hold up to ~2K back pointers to 16KB blocks or large objects,
+/* A slab block can hold up to ~2K back pointers to slab blocks or large objects,
* so it can address at least 32MB. The array of 64KB holds 8K pointers
* to such blocks, addressing ~256 GB.
*/
@@ -228,7 +226,7 @@ BackRefIdx BackRefIdx::newBackRef(bool largeObj)
MALLOC_ASSERT(!blockToUse->freeList ||
((uintptr_t)blockToUse->freeList>=(uintptr_t)blockToUse
&& (uintptr_t)blockToUse->freeList <
- (uintptr_t)blockToUse + blockSize), ASSERT_TEXT);
+ (uintptr_t)blockToUse + slabSize), ASSERT_TEXT);
} else if (blockToUse->allocatedCount < BR_MAX_CNT) {
toUse = (void**)blockToUse->bumpPtr;
blockToUse->bumpPtr =
@@ -264,7 +262,7 @@ void removeBackRef(BackRefIdx backRefIdx)
FreeObject *freeObj = (FreeObject*)((uintptr_t)currBlock + sizeof(BackRefBlock)
+ backRefIdx.getOffset()*sizeof(void*));
MALLOC_ASSERT(((uintptr_t)freeObj>(uintptr_t)currBlock &&
- (uintptr_t)freeObj<(uintptr_t)currBlock + blockSize), ASSERT_TEXT);
+ (uintptr_t)freeObj<(uintptr_t)currBlock + slabSize), ASSERT_TEXT);
{
MallocMutex::scoped_lock lock(currBlock->blockMutex);
@@ -272,7 +270,7 @@ void removeBackRef(BackRefIdx backRefIdx)
MALLOC_ASSERT(!freeObj->next ||
((uintptr_t)freeObj->next > (uintptr_t)currBlock
&& (uintptr_t)freeObj->next <
- (uintptr_t)currBlock + blockSize), ASSERT_TEXT);
+ (uintptr_t)currBlock + slabSize), ASSERT_TEXT);
currBlock->freeList = freeObj;
currBlock->allocatedCount--;
}
diff --git a/src/tbbmalloc/frontend.cpp b/src/tbbmalloc/frontend.cpp
index 7002e71..ee6063b 100644
--- a/src/tbbmalloc/frontend.cpp
+++ b/src/tbbmalloc/frontend.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -40,14 +40,21 @@
#define TlsGetValue_func pthread_getspecific
#include <sched.h>
inline void do_yield() {sched_yield();}
- #include <dlfcn.h> /* for dlsym */
extern "C" { static void mallocThreadShutdownNotification(void*); }
#elif USE_WINTHREAD
+#if __TBB_WIN8UI_SUPPORT
+#include<thread>
+ #define TlsSetValue_func FlsSetValue
+ #define TlsGetValue_func FlsGetValue
+ #define TlsAlloc() FlsAlloc(NULL)
+ #define TlsFree FlsFree
+ inline void do_yield() {std::this_thread::yield();}
+#else
#define TlsSetValue_func TlsSetValue
#define TlsGetValue_func TlsGetValue
inline void do_yield() {SwitchToThread();}
-
+#endif
#else
#error Must define USE_PTHREAD or USE_WINTHREAD
@@ -277,10 +284,20 @@ public:
static void initDefaultPool();
void reset();
void destroy();
+ void processThreadShutdown(TLSData *tlsData);
+
+ inline TLSData *getTLS(bool create);
+ void clearTLS() { extMemPool.tlsPointerKey.setThreadMallocTLS(NULL); }
- Bin *getAllocationBin(size_t size);
+ Bin *getAllocationBin(TLSData* tls, size_t size);
Block *getEmptyBlock(size_t size);
void returnEmptyBlock(Block *block, bool poolTheBlock);
+
+ // get/put large object to/from local large object cache
+ void *getFromLLOCache(TLSData *tls, size_t size, size_t alignment);
+ void putToLLOCache(TLSData *tls, void *object);
+
+ inline void allocatorCalledHook(TLSData *tls);
};
static char defaultMemPool_space[sizeof(MemoryPool)];
@@ -288,10 +305,10 @@ static MemoryPool *defaultMemPool = (MemoryPool *)defaultMemPool_space;
const size_t MemoryPool::defaultGranularity;
// zero-initialized
MallocMutex MemoryPool::memPoolListLock;
-bool ExtMemoryPool::useHugePages;
-size_t ExtMemoryPool::hugePageSize;
+// TODO: move huge page status to default pool, because that's its states
+HugePagesStatus hugePages;
-// Block is 16KB-aligned. To prvent false sharing, separate locally-accessed
+// Slab block is 16KB-aligned. To prvent false sharing, separate locally-accessed
// fields and fields commonly accessed by not owner threads.
class GlobalBlockFields : public BlockI {
protected:
@@ -332,7 +349,7 @@ public:
inline bool emptyEnoughToUse();
bool freeListNonNull() { return freeList; }
void freePublicObject(FreeObject *objectToFree);
- inline void freeOwnObject(MemoryPool *memPool, FreeObject *objectToFree);
+ inline void freeOwnObject(MemoryPool *memPool, TLSData *tls, void *object);
void makeEmpty();
void privatizePublicFreeList();
void restoreBumpPtr();
@@ -348,12 +365,13 @@ public:
bool isStartupAllocObject() const { return objectSize == startupAllocObjSizeMark; }
inline FreeObject *findObjectToFree(void *object) const;
bool checkFreePrecond(void *object) const {
- if (allocatedCount>0)
+ if (allocatedCount>0) {
if (startupAllocObjSizeMark == objectSize) // startup block
return object<=bumpPtr;
else
- return allocatedCount <= (blockSize-sizeof(Block))/objectSize
+ return allocatedCount <= (slabSize-sizeof(Block))/objectSize
&& (!bumpPtr || object>bumpPtr);
+ }
return false;
}
const BackRefIdx *getBackRef() const { return &backRefIdx; }
@@ -429,7 +447,7 @@ const uint32_t numFittingBins = 5;
const uint32_t fittingAlignment = estimatedCacheLineSize;
-#define SET_FITTING_SIZE(N) ( (blockSize-sizeof(Block))/N ) & ~(fittingAlignment-1)
+#define SET_FITTING_SIZE(N) ( (slabSize-sizeof(Block))/N ) & ~(fittingAlignment-1)
// For blockSize=16*1024, sizeof(Block)=2*estimatedCacheLineSize and fittingAlignment=estimatedCacheLineSize,
// the comments show the fitting sizes and the amounts left unused for estimatedCacheLineSize=64/128:
const uint32_t fittingSize1 = SET_FITTING_SIZE(9); // 1792/1792 128/000
@@ -460,7 +478,7 @@ const size_t scalableMallocPoolGranularity = 4*1024; // page size, for mmap use
#endif
/*
- * Per-thread pool of 16KB blocks. Idea behind it is to not share with other
+ * Per-thread pool of slab blocks. Idea behind it is to not share with other
* threads memory that are likely in local cache(s) of our CPU.
*/
class FreeBlockPool {
@@ -489,18 +507,45 @@ public:
bool releaseAllBlocks();
};
+template<int LOW_MARK, int HIGH_MARK>
+class LocalLOC {
+ static const size_t MAX_TOTAL_SIZE = 4*1024*1024;
+
+ // TODO: can single-linked list be faster here?
+ LargeMemoryBlock *head,
+ *tail;
+ intptr_t lastSeenOSCallsCnt,
+ lastUsedOSCallsCnt;
+ size_t totalSize;
+ int numOfBlocks;
+public:
+ bool put(LargeMemoryBlock *object, ExtMemoryPool *extMemPool);
+ LargeMemoryBlock *get(size_t size);
+ bool clean(ExtMemoryPool *extMemPool);
+ void allocatorCalledHook(ExtMemoryPool *extMemPool);
+#if __TBB_MALLOC_WHITEBOX_TEST
+ LocalLOC() : head(NULL), tail(NULL), lastSeenOSCallsCnt(0),
+ lastUsedOSCallsCnt(0), totalSize(0),
+ numOfBlocks(0) {}
+ static size_t getMaxSize() { return MAX_TOTAL_SIZE; }
+#else
+ // no ctor, object must be created in zero-initialized memory
+#endif
+};
+
class TLSData {
#if USE_PTHREAD
MemoryPool *memPool;
#endif
public:
Bin bin[numBlockBinLimit];
- FreeBlockPool freeBlocks;
+ FreeBlockPool freeSlabBlocks;
+ LocalLOC<8,32> lloc;
#if USE_PTHREAD
- TLSData(MemoryPool *mPool, Backend *bknd) : memPool(mPool), freeBlocks(bknd) {}
+ TLSData(MemoryPool *mPool, Backend *bknd) : memPool(mPool), freeSlabBlocks(bknd) {}
MemoryPool *getMemPool() const { return memPool; }
#else
- TLSData(MemoryPool * /*memPool*/, Backend *bknd) : freeBlocks(bknd) {}
+ TLSData(MemoryPool * /*memPool*/, Backend *bknd) : freeSlabBlocks(bknd) {}
#endif
void release(MemoryPool *mPool);
};
@@ -521,23 +566,23 @@ TLSData *TLSKey::createTLS(MemoryPool *memPool, Backend *backend)
return tls;
}
-bool ExtMemoryPool::release16KBCaches()
+bool ExtMemoryPool::releaseTLCaches()
{
bool released = false;
- TLSData *tlsData = tlsPointerKey.getThreadMallocTLS();
- if (tlsData) {
- released = tlsData->freeBlocks.releaseAllBlocks();
+ if (TLSData *tlsData = tlsPointerKey.getThreadMallocTLS()) {
+ released = tlsData->freeSlabBlocks.releaseAllBlocks();
+ released |= tlsData->lloc.clean(this);
// active blocks can be not used, so return them to backend
for (uint32_t i=0; i<numBlockBinLimit; i++)
if (tlsData->bin[i].activeBlockUnused()) {
Block *block = tlsData->bin[i].getActiveBlock();
tlsData->bin[i].outofTLSBin(block);
- // 16KB blocks in user's pools not have valid backRefIdx
+ // slab blocks in user's pools do not have valid backRefIdx
if (!userPool())
removeBackRef(*(block->getBackRefIdx()));
- backend.put16KBlock(block);
+ backend.putSlabBlock(block);
released = true;
}
@@ -615,7 +660,13 @@ static inline unsigned int highestBitPos(unsigned int n)
# else
# error highestBitPos() not implemented for this platform
# endif
-
+#elif __arm__
+ __asm__ __volatile__
+ (
+ "clz %0, %1\n"
+ "rsb %0, %0, %2\n"
+ :"=r" (pos) :"r" (n), "I" (31)
+ );
#else
static unsigned int bsr[16] = {0/*N/A*/,6,7,7,8,8,8,8,9,9,9,9,9,9,9,9};
pos = bsr[ n>>6 ];
@@ -780,15 +831,21 @@ done:
/********* Thread and block related code *************/
-/*
- * Return the bin for the given size. If the TLS bin structure is absent, create it.
- */
-Bin* MemoryPool::getAllocationBin(size_t size)
+TLSData* MemoryPool::getTLS(bool create)
{
TLSData* tls = extMemPool.tlsPointerKey.getThreadMallocTLS();
- if( !tls )
+ if( create && !tls ) {
tls = extMemPool.tlsPointerKey.createTLS(this, &extMemPool.backend);
- MALLOC_ASSERT( tls, ASSERT_TEXT );
+ MALLOC_ASSERT( tls, ASSERT_TEXT );
+ }
+ return tls;
+}
+
+/*
+ * Return the bin for the given size.
+ */
+Bin* MemoryPool::getAllocationBin(TLSData* tls, size_t size)
+{
return tls->bin + getIndex(size);
}
@@ -800,14 +857,14 @@ Block *MemoryPool::getEmptyBlock(size_t size)
TLSData* tls = extMemPool.tlsPointerKey.getThreadMallocTLS();
if (tls)
- resOfGet = tls->freeBlocks.getBlock();
+ resOfGet = tls->freeSlabBlocks.getBlock();
if (resOfGet.block) {
result = resOfGet.block;
} else {
- int i, num = resOfGet.lastAccMiss? Backend::numOfBlocksAllocOnMiss : 1;
- BackRefIdx backRefIdx[Backend::numOfBlocksAllocOnMiss];
+ int i, num = resOfGet.lastAccMiss? Backend::numOfSlabAllocOnMiss : 1;
+ BackRefIdx backRefIdx[Backend::numOfSlabAllocOnMiss];
- result = static_cast<Block*>(extMemPool.backend.get16KBlock(num));
+ result = static_cast<Block*>(extMemPool.backend.getSlabBlock(num));
if (!result) return NULL;
if (!extMemPool.userPool())
@@ -819,14 +876,14 @@ Block *MemoryPool::getEmptyBlock(size_t size)
removeBackRef(backRefIdx[j]);
Block *b;
for (b=result, i=0; i<num;
- b=(Block*)((uintptr_t)b+blockSize), i++)
- extMemPool.backend.put16KBlock(b);
+ b=(Block*)((uintptr_t)b+slabSize), i++)
+ extMemPool.backend.putSlabBlock(b);
return NULL;
}
}
// resources were allocated, register blocks
- for (b=result, i=0; i<num; b=(Block*)((uintptr_t)b+blockSize), i++) {
- // 16KB block in user's pool must have invalid backRefIdx
+ for (b=result, i=0; i<num; b=(Block*)((uintptr_t)b+slabSize), i++) {
+ // slab block in user's pool must have invalid backRefIdx
if (extMemPool.userPool()) {
new (&b->backRefIdx) BackRefIdx();
} else {
@@ -836,7 +893,7 @@ Block *MemoryPool::getEmptyBlock(size_t size)
// all but first one go to per-thread pool
if (i > 0) {
MALLOC_ASSERT(tls, ASSERT_TEXT);
- tls->freeBlocks.returnBlock(b);
+ tls->freeSlabBlocks.returnBlock(b);
}
}
}
@@ -851,13 +908,13 @@ void MemoryPool::returnEmptyBlock(Block *block, bool poolTheBlock)
{
block->makeEmpty();
if (poolTheBlock) {
- extMemPool.tlsPointerKey.getThreadMallocTLS()->freeBlocks.returnBlock(block);
+ extMemPool.tlsPointerKey.getThreadMallocTLS()->freeSlabBlocks.returnBlock(block);
}
else {
- // 16KB blocks in user's pools not have valid backRefIdx
+ // slab blocks in user's pools do not have valid backRefIdx
if (!extMemPool.userPool())
removeBackRef(*(block->getBackRefIdx()));
- extMemPool.backend.put16KBlock(block);
+ extMemPool.backend.putSlabBlock(block);
}
}
@@ -879,16 +936,6 @@ bool ExtMemoryPool::init(intptr_t poolId, rawAllocType rawAlloc,
void ExtMemoryPool::initTLS() { new (&tlsPointerKey) TLSKey(); }
-TLSData *ExtMemoryPool::getTLS()
-{
- return tlsPointerKey.getThreadMallocTLS();
-}
-
-void ExtMemoryPool::clearTLS()
-{
- tlsPointerKey.setThreadMallocTLS(NULL);
-}
-
bool MemoryPool::init(intptr_t poolId, const MemPoolPolicy *policy)
{
if (!extMemPool.init(poolId, policy->pAlloc, policy->pFree,
@@ -930,22 +977,24 @@ void MemoryPool::destroy()
if (next)
next->prev = prev;
}
- // 16KB blocks in non-default pool does not have backreferencies,
+ // slab blocks in non-default pool do not have backreferencies,
// only large objects do
for (LargeMemoryBlock *lmb = extMemPool.lmbList.getHead(); lmb; ) {
LargeMemoryBlock *next = lmb->gNext;
if (extMemPool.userPool())
removeBackRef(lmb->backRefIdx);
- // For speeding up pool destroy, not returning blocks
- // to backend, as we destroy backend at ones.
- // But must return blocks that are too big to hit backend.
- if (ExtMemoryPool::tooLargeToBeBined(lmb->unalignedSize))
- extMemPool.backend.putLargeBlock(lmb);
lmb = next;
}
extMemPool.destroy();
}
+void MemoryPool::processThreadShutdown(TLSData *tlsData)
+{
+ tlsData->release(this);
+ bootStrapBlocks.free(tlsData);
+ clearTLS();
+}
+
void Bin::verifyTLSBin (size_t size) const
{
suppress_unused_warning(size);
@@ -1068,7 +1117,7 @@ Block* Bin::getPublicFreeListBlock()
bool Block::emptyEnoughToUse()
{
- const float threshold = (blockSize - sizeof(Block)) * (1-emptyEnoughRatio);
+ const float threshold = (slabSize - sizeof(Block)) * (1-emptyEnoughRatio);
if (bumpPtr) {
/* If we are still using a bump ptr for this block it is empty enough to use. */
@@ -1095,30 +1144,38 @@ void Block::restoreBumpPtr()
MALLOC_ASSERT( allocatedCount == 0, ASSERT_TEXT );
MALLOC_ASSERT( publicFreeList == NULL, ASSERT_TEXT );
STAT_increment(owner, getIndex(objectSize), freeRestoreBumpPtr);
- bumpPtr = (FreeObject *)((uintptr_t)this + blockSize - objectSize);
+ bumpPtr = (FreeObject *)((uintptr_t)this + slabSize - objectSize);
freeList = NULL;
isFull = 0;
}
-void Block::freeOwnObject(MemoryPool *memPool, FreeObject *objectToFree)
+void Block::freeOwnObject(MemoryPool *memPool, TLSData *tls, void *object)
{
- objectToFree->next = freeList;
- freeList = objectToFree;
allocatedCount--;
- MALLOC_ASSERT( allocatedCount < (blockSize-sizeof(Block))/objectSize, ASSERT_TEXT );
+ MALLOC_ASSERT( allocatedCount < (slabSize-sizeof(Block))/objectSize, ASSERT_TEXT );
#if COLLECT_STATISTICS
if (getActiveBlock(memPool->getAllocationBin(block->objectSize)) != block)
STAT_increment(myTid, getIndex(block->objectSize), freeToInactiveBlock);
else
STAT_increment(myTid, getIndex(block->objectSize), freeToActiveBlock);
#endif
- if (isFull) {
- if (emptyEnoughToUse())
- memPool->getAllocationBin(objectSize)->moveBlockToBinFront(this);
+ if (allocatedCount==0 && publicFreeList==NULL) {
+ // The bump pointer is about to be restored for the block,
+ // no need to find objectToFree here (this is costly).
+
+ // if the last object of a slab is freed, the slab cannot be marked full
+ MALLOC_ASSERT(!isFull, ASSERT_TEXT);
+ memPool->getAllocationBin(tls, objectSize)->
+ processLessUsedBlock(memPool, this);
} else {
- if (allocatedCount==0 && publicFreeList==NULL)
- memPool->getAllocationBin(objectSize)->
- processLessUsedBlock(memPool, this);
+ FreeObject *objectToFree = findObjectToFree(object);
+ objectToFree->next = freeList;
+ freeList = objectToFree;
+
+ if (isFull) {
+ if (emptyEnoughToUse())
+ memPool->getAllocationBin(tls, objectSize)->moveBlockToBinFront(this);
+ }
}
}
@@ -1195,14 +1252,14 @@ void Block::privatizePublicFreeList()
MALLOC_ASSERT( localPublicFreeList && localPublicFreeList==temp, ASSERT_TEXT ); // there should be something in publicFreeList!
if( !isNotForUse(temp) ) { // return/getPartialBlock could set it to UNUSABLE
- MALLOC_ASSERT( allocatedCount <= (blockSize-sizeof(Block))/objectSize, ASSERT_TEXT );
+ MALLOC_ASSERT( allocatedCount <= (slabSize-sizeof(Block))/objectSize, ASSERT_TEXT );
/* other threads did not change the counter freeing our blocks */
allocatedCount--;
while( isSolidPtr(temp->next) ){ // the list will end with either NULL or UNUSABLE
temp = temp->next;
allocatedCount--;
}
- MALLOC_ASSERT( allocatedCount < (blockSize-sizeof(Block))/objectSize, ASSERT_TEXT );
+ MALLOC_ASSERT( allocatedCount < (slabSize-sizeof(Block))/objectSize, ASSERT_TEXT );
/* merge with local freeList */
temp->next = freeList;
freeList = localPublicFreeList;
@@ -1301,7 +1358,7 @@ void Block::initEmptyBlock(Bin* tlsBin, size_t size)
objectSize = objSz;
owner = ThreadId::get();
// bump pointer should be prepared for first allocation - thus mode it down to objectSize
- bumpPtr = (FreeObject *)((uintptr_t)this + blockSize - objectSize);
+ bumpPtr = (FreeObject *)((uintptr_t)this + slabSize - objectSize);
// each block should have the address where the head of the list of "privatizable" blocks is kept
// the only exception is a block for boot strap which is initialized when TLS is yet NULL
@@ -1376,12 +1433,12 @@ void FreeBlockPool::returnBlock(Block *block)
headToFree = headToFree->next;
tail->next = NULL;
size = POOL_LOW_MARK-1;
- // 16KB blocks from user pools not have valid backreference
+ // slab blocks from user pools not have valid backreference
for (Block *currBl = headToFree; currBl; currBl = helper) {
helper = currBl->next;
if (!backend->inUserPool())
removeBackRef(currBl->backRefIdx);
- backend->put16KBlock(currBl);
+ backend->putSlabBlock(currBl);
}
}
insertBlock(block);
@@ -1394,10 +1451,10 @@ bool FreeBlockPool::releaseAllBlocks()
for (Block *currBl = head; currBl; currBl=helper) {
helper = currBl->next;
- // 16KB blocks in user's pools not have valid backRefIdx
+ // slab blocks in user's pools not have valid backRefIdx
if (!backend->inUserPool())
removeBackRef(currBl->backRefIdx);
- backend->put16KBlock(currBl);
+ backend->putSlabBlock(currBl);
}
head = tail = NULL;
size = 0;
@@ -1420,7 +1477,7 @@ void Block::makeEmpty()
objectSize = 0;
owner.invalid();
// for an empty block, bump pointer should point right after the end of the block
- bumpPtr = (FreeObject *)((uintptr_t)this + blockSize);
+ bumpPtr = (FreeObject *)((uintptr_t)this + slabSize);
}
inline void Bin::setActiveBlock (Block *block)
@@ -1469,7 +1526,8 @@ FreeObject *Block::findObjectToFree(void *object) const
void TLSData::release(MemoryPool *mPool)
{
- freeBlocks.releaseAllBlocks();
+ lloc.clean(&mPool->extMemPool);
+ freeSlabBlocks.releaseAllBlocks();
for (unsigned index = 0; index < numBlockBins; index++) {
Block *activeBlk = bin[index].getActiveBlock();
@@ -1516,8 +1574,8 @@ void TLSData::release(MemoryPool *mPool)
*/
class StartupBlock : public Block {
- size_t availableSize() {
- return blockSize - ((uintptr_t)bumpPtr - (uintptr_t)this);
+ size_t availableSize() const {
+ return slabSize - ((uintptr_t)bumpPtr - (uintptr_t)this);
}
static StartupBlock *getBlock();
public:
@@ -1535,7 +1593,7 @@ StartupBlock *StartupBlock::getBlock()
if (backRefIdx.isInvalid()) return NULL;
StartupBlock *block = static_cast<StartupBlock*>(
- defaultMemPool->extMemPool.backend.get16KBlock(1));
+ defaultMemPool->extMemPool.backend.getSlabBlock(1));
if (!block) return NULL;
block->cleanBlockHeader();
@@ -1603,7 +1661,7 @@ void StartupBlock::free(void *ptr)
MALLOC_ASSERT(startupAllocObjSizeMark==objectSize
&& allocatedCount>0, ASSERT_TEXT);
MALLOC_ASSERT((uintptr_t)ptr>=(uintptr_t)this+sizeof(StartupBlock)
- && (uintptr_t)ptr+StartupBlock::msize(ptr)<=(uintptr_t)this+blockSize,
+ && (uintptr_t)ptr+StartupBlock::msize(ptr)<=(uintptr_t)this+slabSize,
ASSERT_TEXT);
if (0 == --allocatedCount) {
if (this == firstStartupBlock)
@@ -1649,8 +1707,8 @@ static MallocMutex initMutex;
delivers a clean result. */
static char VersionString[] = "\0" TBBMALLOC_VERSION_STRINGS;
-#if _XBOX
-bool GetBoolEnvironmentVariable(const char *name) { return false; }
+#if _XBOX || __TBB_WIN8UI_SUPPORT
+bool GetBoolEnvironmentVariable(const char *) { return false; }
#else
bool GetBoolEnvironmentVariable(const char *name)
{
@@ -1660,28 +1718,40 @@ bool GetBoolEnvironmentVariable(const char *name)
}
#endif
+void AllocControlledMode::initReadEnv(const char *envName, intptr_t defaultVal)
+{
+ if (!setDone) {
+#if !_XBOX && !__TBB_WIN8UI_SUPPORT
+ const char *envVal = getenv(envName);
+ if (envVal && !strcmp(envVal, "1"))
+ val = 1;
+ else
+#endif
+ val = defaultVal;
+ setDone = true;
+ }
+}
+
void MemoryPool::initDefaultPool()
{
+ long long hugePageSize = 0;
#if __linux__
if (FILE *f = fopen("/proc/meminfo", "r")) {
- const int SZ = 100;
- char buf[SZ];
- long long totalHugePages=0, hugePageSize=0;
- MALLOC_ASSERT(sizeof(totalHugePages) >= 8,
+ const int READ_BUF_SIZE = 100;
+ char buf[READ_BUF_SIZE];
+ MALLOC_ASSERT(sizeof(hugePageSize) >= 8,
"At least 64 bits required for keeping page size/numbers.");
- while (fgets(buf, SZ, f)) {
- if (1 == sscanf(buf, "HugePages_Total: %llu", &totalHugePages))
- continue;
- sscanf(buf, "Hugepagesize: %llu kB", &hugePageSize);
+ while (fgets(buf, READ_BUF_SIZE, f)) {
+ if (1 == sscanf(buf, "Hugepagesize: %llu kB", &hugePageSize)) {
+ hugePageSize *= 1024;
+ break;
+ }
}
fclose(f);
- if (totalHugePages)
- ExtMemoryPool::useHugePages = true;
- if (hugePageSize)
- ExtMemoryPool::hugePageSize = hugePageSize*1024;
}
#endif
+ hugePages.init(hugePageSize);
}
inline bool isMallocInitialized() {
@@ -1744,8 +1814,7 @@ static void doInitialization()
FencedStore( mallocInitialized, 2 );
if( GetBoolEnvironmentVariable("TBB_VERSION") ) {
fputs(VersionString+1,stderr);
- fprintf(stderr, "TBBmalloc: scalable allocator\t%s\n",
- ExtMemoryPool::useHugePages? "use huge pages" : "no huge pages" );
+ hugePages.printStatus();
}
}
/* It can't be 0 or I would have initialized it */
@@ -1767,7 +1836,7 @@ FreeObject *Block::allocateFromFreeList()
MALLOC_ASSERT( result, ASSERT_TEXT );
freeList = result->next;
- MALLOC_ASSERT( allocatedCount < (blockSize-sizeof(Block))/objectSize, ASSERT_TEXT );
+ MALLOC_ASSERT( allocatedCount < (slabSize-sizeof(Block))/objectSize, ASSERT_TEXT );
allocatedCount++;
STAT_increment(owner, getIndex(objectSize), allocFreeListUsed);
@@ -1782,7 +1851,7 @@ FreeObject *Block::allocateFromBumpPtr()
if ( (uintptr_t)bumpPtr < (uintptr_t)this+sizeof(Block) ) {
bumpPtr = NULL;
}
- MALLOC_ASSERT( allocatedCount < (blockSize-sizeof(Block))/objectSize, ASSERT_TEXT );
+ MALLOC_ASSERT( allocatedCount < (slabSize-sizeof(Block))/objectSize, ASSERT_TEXT );
allocatedCount++;
STAT_increment(owner, getIndex(objectSize), allocBumpPtrUsed);
}
@@ -1830,6 +1899,136 @@ void Bin::processLessUsedBlock(MemoryPool *memPool, Block *block)
}
}
+template<int LOW_MARK, int HIGH_MARK>
+bool LocalLOC<LOW_MARK, HIGH_MARK>::put(LargeMemoryBlock *object, ExtMemoryPool *extMemPool)
+{
+ const size_t size = object->unalignedSize;
+ if (size > MAX_TOTAL_SIZE)
+ return false;
+
+ totalSize += size;
+ object->prev = NULL;
+ object->next = head;
+ if (head) head->prev = object;
+ head = object;
+ if (!tail) tail = object;
+ numOfBlocks++;
+ MALLOC_ASSERT(!tail->next, ASSERT_TEXT);
+ // must meet both size and number of cached objects constrains
+ if (totalSize > MAX_TOTAL_SIZE || numOfBlocks >= HIGH_MARK) {
+ // scanning from tail until meet conditions
+ while (totalSize > MAX_TOTAL_SIZE || numOfBlocks > LOW_MARK) {
+ totalSize -= tail->unalignedSize;
+ numOfBlocks--;
+ tail = tail->prev;
+ }
+ LargeMemoryBlock *headToRelease = tail->next;
+ tail->next = NULL;
+
+ extMemPool->freeLargeObjectList(headToRelease);
+ }
+ lastUsedOSCallsCnt = lastSeenOSCallsCnt;
+ return true;
+}
+
+template<int LOW_MARK, int HIGH_MARK>
+LargeMemoryBlock *LocalLOC<LOW_MARK, HIGH_MARK>::get(size_t size)
+{
+ if (lastUsedOSCallsCnt != lastSeenOSCallsCnt)
+ lastUsedOSCallsCnt = lastSeenOSCallsCnt;
+
+ for (LargeMemoryBlock *curr = head; curr; curr=curr->next) {
+ if (curr->unalignedSize == size) {
+ LargeMemoryBlock *res = curr;
+ if (curr->next)
+ curr->next->prev = curr->prev;
+ else
+ tail = curr->prev;
+ if (curr->prev)
+ curr->prev->next = curr->next;
+ else
+ head = curr->next;
+ totalSize -= size;
+ numOfBlocks--;
+ return res;
+ }
+ }
+ return NULL;
+}
+
+template<int LOW_MARK, int HIGH_MARK>
+bool LocalLOC<LOW_MARK, HIGH_MARK>::clean(ExtMemoryPool *extMemPool)
+{
+ bool released = numOfBlocks;
+
+ if (numOfBlocks)
+ extMemPool->freeLargeObjectList(head);
+ head = tail = NULL;
+ numOfBlocks = 0;
+ totalSize = 0;
+ return released;
+}
+
+template<int LOW_MARK, int HIGH_MARK>
+void LocalLOC<LOW_MARK, HIGH_MARK>::allocatorCalledHook(ExtMemoryPool *extMemPool)
+{
+ intptr_t currCnt = extMemPool->backend.askMemFromOSCounter.get();
+
+ // clean the cache iff there was OS memory request since last hook call
+ // and the cache was not touched since previous OS memory request
+ if (currCnt != lastSeenOSCallsCnt && lastUsedOSCallsCnt != lastSeenOSCallsCnt
+ && head)
+ clean(extMemPool);
+ lastSeenOSCallsCnt = currCnt;
+}
+
+void *MemoryPool::getFromLLOCache(TLSData* tls, size_t size, size_t alignment)
+{
+ LargeMemoryBlock *lmb = NULL;
+
+ size_t headersSize = sizeof(LargeMemoryBlock)+sizeof(LargeObjectHdr);
+ size_t allocationSize = LargeObjectCache::alignToBin(size+headersSize+alignment);
+ if (allocationSize < size) // allocationSize is wrapped around after alignToBin
+ return NULL;
+
+ if (tls)
+ lmb = tls->lloc.get(allocationSize);
+ if (!lmb)
+ lmb = extMemPool.mallocLargeObject(allocationSize);
+
+ if (lmb) {
+ void *alignedArea = (void*)alignUp((uintptr_t)lmb+headersSize, alignment);
+ LargeObjectHdr *header = (LargeObjectHdr*)alignedArea-1;
+ header->memoryBlock = lmb;
+ header->backRefIdx = lmb->backRefIdx;
+ setBackRef(header->backRefIdx, header);
+
+ lmb->objectSize = size;
+
+ MALLOC_ASSERT( isLargeObject(alignedArea), ASSERT_TEXT );
+
+ return alignedArea;
+ }
+ return NULL;
+}
+
+void MemoryPool::putToLLOCache(TLSData *tls, void *object)
+{
+ LargeObjectHdr *header = (LargeObjectHdr*)object - 1;
+ // overwrite backRefIdx to simplify double free detection
+ header->backRefIdx = BackRefIdx();
+
+ if (!tls || !tls->lloc.put(header->memoryBlock, &extMemPool))
+ extMemPool.freeLargeObject(header->memoryBlock);
+}
+
+// called on each allocator call
+void MemoryPool::allocatorCalledHook(TLSData *tls)
+{
+ // TODO: clean freeSlabBlocks as well
+ tls->lloc.allocatorCalledHook(&extMemPool);
+}
+
#if USE_PTHREAD && (__TBB_SOURCE_DIRECTLY_INCLUDED || __TBB_USE_DLOPEN_REENTRANCY_WORKAROUND)
/* Decrease race interval between dynamic library unloading and pthread key
@@ -1909,10 +2108,12 @@ static void *allocateAligned(MemoryPool *memPool, size_t size, size_t alignment)
/* This can be the first allocation call. */
if (!isMallocInitialized())
doInitialization();
+ TLSData *tls = memPool->getTLS(/*create=*/true);
+ memPool->allocatorCalledHook(tls);
// take into account only alignment that are higher then natural
- result = memPool->extMemPool.mallocLargeObject(size,
- largeObjectAlignment>alignment?
- largeObjectAlignment: alignment);
+ result =
+ memPool->getFromLLOCache(tls, size, largeObjectAlignment>alignment?
+ largeObjectAlignment: alignment);
}
MALLOC_ASSERT( isAligned(result, alignment), ASSERT_TEXT );
@@ -1937,7 +2138,7 @@ static void *reallocAligned(MemoryPool *memPool, void *ptr,
internalPoolMalloc(memPool, size);
}
} else {
- Block* block = (Block *)alignDown(ptr, blockSize);
+ Block* block = (Block *)alignDown(ptr, slabSize);
copySize = block->getSize();
if (size <= copySize && (0==alignment || isAligned(ptr, alignment))) {
return ptr;
@@ -1956,15 +2157,15 @@ static void *reallocAligned(MemoryPool *memPool, void *ptr,
/* A predicate checks if an object is properly placed inside its block */
inline bool Block::isProperlyPlaced(const void *object) const
{
- return 0 == ((uintptr_t)this + blockSize - (uintptr_t)object) % objectSize;
+ return 0 == ((uintptr_t)this + slabSize - (uintptr_t)object) % objectSize;
}
/* Finds the real object inside the block */
FreeObject *Block::findAllocatedObject(const void *address) const
{
// calculate offset from the end of the block space
- uint16_t offset = (uintptr_t)this + blockSize - (uintptr_t)address;
- MALLOC_ASSERT( offset<=blockSize-sizeof(Block), ASSERT_TEXT );
+ uint16_t offset = (uintptr_t)this + slabSize - (uintptr_t)address;
+ MALLOC_ASSERT( offset<=slabSize-sizeof(Block), ASSERT_TEXT );
// find offset difference from a multiple of allocation size
offset %= objectSize;
// and move the address down to where the real object starts.
@@ -2007,7 +2208,7 @@ bool isLargeObject(void *object)
static inline bool isSmallObject (void *ptr)
{
- void* expected = alignDown(ptr, blockSize);
+ void* expected = alignDown(ptr, slabSize);
const BackRefIdx* idx = ((Block*)expected)->getBackRef();
return expected == getBackRef(safer_dereference(idx));
@@ -2019,10 +2220,10 @@ static inline bool isRecognized (void* ptr)
return isLargeObject(ptr) || isSmallObject(ptr);
}
-static inline void freeSmallObject(MemoryPool *memPool, void *object)
+static inline void freeSmallObject(MemoryPool *memPool, TLSData *tls, void *object)
{
/* mask low bits to get the block */
- Block *block = (Block *)alignDown(object, blockSize);
+ Block *block = (Block *)alignDown(object, slabSize);
MALLOC_ASSERT( block->checkFreePrecond(object),
"Possible double free or heap corruption." );
@@ -2032,13 +2233,12 @@ static inline void freeSmallObject(MemoryPool *memPool, void *object)
return;
}
#endif
- FreeObject *objectToFree = block->findObjectToFree(object);
-
if (block->ownBlock())
- block->freeOwnObject(memPool, objectToFree);
- else /* Slower path to add to the shared list, the allocatedCount is updated by the owner thread in malloc. */
+ block->freeOwnObject(memPool, tls, object);
+ else { /* Slower path to add to the shared list, the allocatedCount is updated by the owner thread in malloc. */
+ FreeObject *objectToFree = block->findObjectToFree(object);
block->freePublicObject(objectToFree);
-
+ }
}
static void *internalPoolMalloc(MemoryPool* memPool, size_t size)
@@ -2050,17 +2250,19 @@ static void *internalPoolMalloc(MemoryPool* memPool, size_t size)
if (!size) size = sizeof(size_t);
+ TLSData *tls = memPool->getTLS(/*create=*/true);
+ memPool->allocatorCalledHook(tls);
/*
* Use Large Object Allocation
*/
if (size >= minLargeObjectSize)
- return memPool->extMemPool.mallocLargeObject(size, largeObjectAlignment);
+ return memPool->getFromLLOCache(tls, size, largeObjectAlignment);
/*
* Get an element in thread-local array corresponding to the given size;
* It keeps ptr to the active block for allocations of this size
*/
- bin = memPool->getAllocationBin(size);
+ bin = memPool->getAllocationBin(tls, size);
if ( !bin ) return NULL;
/* Get a block to try to allocate in. */
@@ -2128,10 +2330,13 @@ static bool internalPoolFree(MemoryPool *memPool, void *object)
MALLOC_ASSERT(isMallocInitialized(), ASSERT_TEXT);
MALLOC_ASSERT(memPool->extMemPool.userPool() || isRecognized(object),
"Invalid pointer in pool_free detected.");
+ TLSData *tls = memPool->getTLS(/*create=*/false);
+ if (tls) memPool->allocatorCalledHook(tls);
+
if (isLargeObject(object))
- memPool->extMemPool.freeLargeObject(object);
+ memPool->putToLLOCache(tls, object);
else
- freeSmallObject(memPool, object);
+ freeSmallObject(memPool, tls, object);
return true;
}
@@ -2142,7 +2347,8 @@ static void *internalMalloc(size_t size)
#if MALLOC_CHECK_RECURSION
if (RecursiveMallocCallProtector::sameThreadActive())
return size<minLargeObjectSize? StartupBlock::allocate(size) :
- (FreeObject*)defaultMemPool->extMemPool.mallocLargeObject(size, blockSize);
+ // nested allocation, so skip tls
+ (FreeObject*)defaultMemPool->getFromLLOCache(NULL, size, slabSize);
#endif
if (!isMallocInitialized())
@@ -2164,7 +2370,7 @@ static size_t internalMsize(void* ptr)
LargeMemoryBlock* lmb = ((LargeObjectHdr*)ptr - 1)->memoryBlock;
return lmb->objectSize;
} else {
- Block* block = (Block *)alignDown(ptr, blockSize);
+ Block* block = (Block *)alignDown(ptr, slabSize);
#if MALLOC_CHECK_RECURSION
size_t size = block->getSize()? block->getSize() : StartupBlock::msize(ptr);
#else
@@ -2198,13 +2404,13 @@ rml::MemoryPool *pool_create(intptr_t pool_id, const MemPoolPolicy *policy)
rml::MemPoolError pool_create_v1(intptr_t pool_id, const MemPoolPolicy *policy,
rml::MemoryPool **pool)
{
- if ( !policy->pAlloc || policy->version<MemPoolPolicy::VERSION
+ if ( !policy->pAlloc || policy->version<MemPoolPolicy::TBBMALLOC_POOL_VERSION
// empty pFree allowed only for fixed pools
|| !(policy->fixedPool || policy->pFree) ) {
*pool = NULL;
return INVALID_POLICY;
}
- if ( policy->version>MemPoolPolicy::VERSION // future versions are not supported
+ if ( policy->version>MemPoolPolicy::TBBMALLOC_POOL_VERSION // future versions are not supported
// new flags can be added in place of reserved, but default
// behaviour must be supported by this version
|| policy->reserved ) {
@@ -2299,18 +2505,17 @@ bool pool_free(rml::MemoryPool *mPool, void *object)
using namespace rml::internal;
-/*
- * When a thread is shutting down this routine should be called to remove all the thread ids
- * from the malloc blocks and replace them with a NULL thread id.
- *
- */
#if MALLOC_TRACE
static unsigned int threadGoingDownCount = 0;
#endif
/*
- * for pthreads, the function is set as a callback in pthread_key_create for TLS bin.
- * it will be automatically called at thread exit with the key value as the argument.
+ * When a thread is shutting down this routine should be called to remove all the thread ids
+ * from the malloc blocks and replace them with a NULL thread id.
+ *
+ * For pthreads, the function is set as a callback in pthread_key_create for TLS bin.
+ * For non-NULL keys it will be automatically called at thread exit with the key value
+ * as the argument.
*
* for Windows, it should be called directly e.g. from DllMain
*/
@@ -2322,24 +2527,17 @@ void mallocThreadShutdownNotification(void* arg)
TRACEF(( "[ScalableMalloc trace] Thread id %d blocks return start %d\n",
getThreadId(), threadGoingDownCount++ ));
#if USE_WINTHREAD
+ suppress_unused_warning(arg);
MallocMutex::scoped_lock lock(MemoryPool::memPoolListLock);
// The routine is called once per thread, need to walk through all pools on Windows
- for (MemoryPool *memPool = defaultMemPool; memPool; memPool = memPool->next) {
- TLSData *tls = memPool->extMemPool.getTLS();
-#else
- if (!shutdownSync.threadDtorStart()) return;
- // The routine is called for each memPool, just need to get memPool from TLSData.
- TLSData *tls = (TLSData*)arg;
- MemoryPool *memPool = tls->getMemPool();
-#endif
- if (tls) {
- tls->release(memPool);
- memPool->bootStrapBlocks.free(tls);
- memPool->extMemPool.clearTLS();
- }
-#if USE_WINTHREAD
- } // for memPool (Windows only)
+ for (MemoryPool *memPool = defaultMemPool; memPool; memPool = memPool->next)
+ if (TLSData *tls = memPool->getTLS(/*create=*/false))
+ memPool->processThreadShutdown(tls);
#else
+ if (!shutdownSync.threadDtorStart()) return;
+ // The routine is called for each memPool, just need to get memPool from TLSData.
+ TLSData *tls = (TLSData*)arg;
+ tls->getMemPool()->processThreadShutdown(tls);
shutdownSync.threadDtorDone();
#endif
@@ -2357,6 +2555,11 @@ extern "C" void __TBB_mallocProcessShutdownNotification()
{
if (!isMallocInitialized()) return;
+#if __TBB_MALLOC_LOCACHE_STAT
+ printf("cache hit ratio %f, size hit %f\n",
+ 1.*cacheHits/mallocCalls, 1.*memHitKB/memAllocKB);
+ defaultMemPool->extMemPool.loc.reportStat(stdout);
+#endif
shutdownSync.processExit();
#if __TBB_SOURCE_DIRECTLY_INCLUDED
/* Pthread keys must be deleted as soon as possible to not call key dtor
@@ -2406,11 +2609,17 @@ extern "C" void safer_scalable_free (void *object, void (*original_free)(void*))
// must check 1st for large object, because small object check touches 4 pages on left,
// and it can be unaccessable
- if (isLargeObject(object))
- defaultMemPool->extMemPool.freeLargeObject(object);
- else if (isSmallObject(object))
- freeSmallObject(defaultMemPool, object);
- else if (original_free)
+ if (isLargeObject(object)) {
+ TLSData *tls = defaultMemPool->getTLS(/*create=*/false);
+ if (tls) defaultMemPool->allocatorCalledHook(tls);
+
+ defaultMemPool->putToLLOCache(tls, object);
+ } else if (isSmallObject(object)) {
+ TLSData *tls = defaultMemPool->getTLS(/*create=*/false);
+ if (tls) defaultMemPool->allocatorCalledHook(tls);
+
+ freeSmallObject(defaultMemPool, tls, object);
+ } else if (original_free)
original_free(object);
}
@@ -2565,7 +2774,7 @@ extern "C" void * safer_scalable_aligned_realloc(void *ptr, size_t size, size_t
errno = EINVAL;
return NULL;
}
- void *tmp;
+ void *tmp = NULL;
if (!ptr) {
tmp = allocateAligned(defaultMemPool, size, alignment);
@@ -2592,8 +2801,7 @@ extern "C" void * safer_scalable_aligned_realloc(void *ptr, size_t size, size_t
original_ptrs->orig_free( ptr );
}
}
- } else
- tmp = NULL;
+ }
} else {
if ( original_ptrs->orig_free ){
original_ptrs->orig_free( ptr );
@@ -2601,8 +2809,11 @@ extern "C" void * safer_scalable_aligned_realloc(void *ptr, size_t size, size_t
return NULL;
}
}
-#endif
+#else
+ // As original_realloc can't align result, and there is no way to find
+ // size of reallocating object, we are giving up.
suppress_unused_warning(orig_function);
+#endif
if (!tmp) errno = ENOMEM;
return tmp;
}
@@ -2643,3 +2854,22 @@ extern "C" size_t safer_scalable_msize (void *object, size_t (*original_msize)(v
}
/********* End code for scalable_msize ***********/
+
+extern "C" int scalable_allocation_mode(int param, intptr_t value)
+{
+#if __linux__
+ if (param == USE_HUGE_PAGES)
+ switch (value) {
+ case 0:
+ case 1:
+ hugePages.setMode(value);
+ return 0;
+ default:
+ return 1;
+ }
+#else
+ suppress_unused_warning(param);
+ suppress_unused_warning(value);
+#endif
+ return 1;
+}
diff --git a/src/tbbmalloc/large_objects.cpp b/src/tbbmalloc/large_objects.cpp
index b07ee5b..83798b0 100644
--- a/src/tbbmalloc/large_objects.cpp
+++ b/src/tbbmalloc/large_objects.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -34,46 +34,95 @@
namespace rml {
namespace internal {
-static struct LargeBlockCacheStat {
- uintptr_t age;
-} loCacheStat;
+#if __TBB_MALLOC_LOCACHE_STAT
+intptr_t mallocCalls, cacheHits;
+intptr_t memAllocKB, memHitKB;
+#endif
-bool LargeObjectCache::CacheBin::put(ExtMemoryPool *extMemPool,
- LargeMemoryBlock *ptr)
+inline bool lessThanWithOverflow(intptr_t a, intptr_t b)
{
- bool blockCached = true;
- ptr->prev = NULL;
- ptr->age = extMemPool->loc.cleanupCacheIfNeed(extMemPool);
+ return (a < b && (b - a < UINTPTR_MAX/2)) ||
+ (a > b && (a - b > UINTPTR_MAX/2));
+}
+
+template<typename Props>
+LargeMemoryBlock *LargeObjectCacheImpl<Props>::CacheBin::
+ putList(ExtMemoryPool *extMemPool, LargeMemoryBlock *head, BinBitMask *bitMask, int idx)
+{
+ int i, num, totalNum;
+ size_t size = head->unalignedSize;
+ LargeMemoryBlock *curr, *tail, *toRelease = NULL;
+ uintptr_t currTime;
+
+ // we not kept prev pointers during assigning blocks to bins, set them now
+ head->prev = NULL;
+ for (num=1, curr=head; curr->next; num++, curr=curr->next)
+ curr->next->prev = curr;
+ tail = curr;
+ totalNum = num;
{
MallocMutex::scoped_lock scoped_cs(lock);
- if (lastCleanedAge) {
- ptr->next = first;
- first = ptr;
- if (ptr->next) ptr->next->prev = ptr;
- if (!last) {
- MALLOC_ASSERT(0 == oldest, ASSERT_TEXT);
- oldest = ptr->age;
- last = ptr;
- }
- } else {
+ usedSize -= num*size;
+ // to keep ordering on list, get time under list lock
+ currTime = extMemPool->loc.getCurrTimeRange(num);
+
+ for (curr=tail, i=0; curr; curr=curr->prev, i++) {
+ curr->age = currTime+i;
+ STAT_increment(getThreadId(), ThreadCommonCounters, cacheLargeBlk);
+ }
+
+ if (!lastCleanedAge) {
// 1st object of such size was released.
// Not cache it, and remeber when this occurs
// to take into account during cache miss.
- lastCleanedAge = ptr->age;
- blockCached = false;
+ lastCleanedAge = tail->age;
+ toRelease = tail;
+ tail = tail->prev;
+ if (tail)
+ tail->next = NULL;
+ else
+ head = NULL;
+ num--;
}
+ if (num) {
+ // add [head;tail] list to cache
+ tail->next = first;
+ if (first)
+ first->prev = tail;
+ first = head;
+ if (!last) {
+ MALLOC_ASSERT(0 == oldest, ASSERT_TEXT);
+ oldest = tail->age;
+ last = tail;
+ }
+
+ cachedSize += num*size;
+ }
+/* It's accebtable, if a bin is empty, and we have non-empty in bit mask.
+ So set true in bitmask without lock.
+ It's not acceptable, if a bin is non-empty and we have empty in bitmask.
+ So set false in bitmask under lock. */
+
+ // No used object, and nothing in the bin, mark the bin as empty
+ if (!usedSize && !first)
+ bitMask->set(idx, false);
}
- return blockCached;
+ extMemPool->loc.cleanupCacheIfNeededOnRange(&extMemPool->backend, totalNum, currTime);
+ if (toRelease)
+ toRelease->prev = toRelease->next = NULL;
+ return toRelease;
}
-LargeMemoryBlock *LargeObjectCache::CacheBin::get(ExtMemoryPool *extMemPool,
- size_t size)
+template<typename Props>
+LargeMemoryBlock *LargeObjectCacheImpl<Props>::CacheBin::
+ get(size_t size, uintptr_t currTime, bool *setNonEmpty)
{
- uintptr_t currAge = extMemPool->loc.cleanupCacheIfNeed(extMemPool);
LargeMemoryBlock *result=NULL;
{
MallocMutex::scoped_lock scoped_cs(lock);
+ forgetOutdatedState(currTime);
+
if (first) {
result = first;
first = result->next;
@@ -83,30 +132,75 @@ LargeMemoryBlock *LargeObjectCache::CacheBin::get(ExtMemoryPool *extMemPool,
last = NULL;
oldest = 0;
}
+ // use moving average with current hit interval
+ intptr_t hitR = currTime - result->age;
+ lastHit = lastHit? (lastHit + hitR)/2 : hitR;
+
+ cachedSize -= size;
} else {
- /* If cache miss occured, set ageThreshold to twice the difference
- between current time and last time cache was cleaned. */
- ageThreshold = 2*(currAge - lastCleanedAge);
+ if (lastCleanedAge)
+ ageThreshold = Props::OnMissFactor*(currTime - lastCleanedAge);
}
+ if (!usedSize) // inform that there are used blocks in the bin
+ *setNonEmpty = true;
+ // subject to later correction, if got cache miss and later allocation failed
+ usedSize += size;
+ lastGet = currTime;
}
return result;
}
-bool LargeObjectCache::CacheBin::cleanToThreshold(ExtMemoryPool *extMemPool,
- uintptr_t currAge)
+// forget the history for the bin if it was unused for long time
+template<typename Props>
+void LargeObjectCacheImpl<Props>::CacheBin::forgetOutdatedState(uintptr_t currTime)
+{
+ // If the time since the last get is LongWaitFactor times more than ageThreshold
+ // for the bin, treat the bin as rarely-used and forget everything we know
+ // about it.
+ // If LongWaitFactor is too small, we forget too early and
+ // so prevents good caching, while if too high, caching blocks
+ // with unrelated usage pattern occurs.
+ const uintptr_t sinceLastGet = currTime - lastGet;
+ bool doCleanup = false;
+
+ if (!last) { // clean only empty bins
+ if (ageThreshold)
+ doCleanup = sinceLastGet > Props::LongWaitFactor*ageThreshold;
+ else if (lastCleanedAge)
+ doCleanup = sinceLastGet > Props::LongWaitFactor*(lastCleanedAge - lastGet);
+ }
+ if (doCleanup) {
+ lastCleanedAge = 0;
+ ageThreshold = 0;
+ }
+}
+
+template<typename Props>
+bool LargeObjectCacheImpl<Props>::CacheBin::
+ cleanToThreshold(Backend *backend, BinBitMask *bitMask, uintptr_t currTime, int idx)
{
LargeMemoryBlock *toRelease = NULL;
bool released = false;
+#if MALLOC_DEBUG
+ uintptr_t nextAge = 0;
+#endif
/* oldest may be more recent then age, that's why cast to signed type
was used. age overflow is also processed correctly. */
- if (last && (intptr_t)(currAge - oldest) > ageThreshold) {
+ if (last && (intptr_t)(currTime - oldest) > ageThreshold) {
MallocMutex::scoped_lock scoped_cs(lock);
// double check
- if (last && (intptr_t)(currAge - last->age) > ageThreshold) {
+ if (last && (intptr_t)(currTime - last->age) > ageThreshold) {
do {
+#if MALLOC_DEBUG
+ // check that list ordered
+ MALLOC_ASSERT(!nextAge || lessThanWithOverflow(nextAge, last->age),
+ ASSERT_TEXT);
+ nextAge = last->age;
+#endif
+ cachedSize -= last->unalignedSize;
last = last->prev;
- } while (last && (intptr_t)(currAge - last->age) > ageThreshold);
+ } while (last && (intptr_t)(currTime - last->age) > ageThreshold);
if (last) {
toRelease = last->next;
oldest = last->age;
@@ -115,6 +209,8 @@ bool LargeObjectCache::CacheBin::cleanToThreshold(ExtMemoryPool *extMemPool,
toRelease = first;
first = NULL;
oldest = 0;
+ if (!usedSize)
+ bitMask->set(idx, false);
}
MALLOC_ASSERT( toRelease, ASSERT_TEXT );
lastCleanedAge = toRelease->age;
@@ -126,14 +222,15 @@ bool LargeObjectCache::CacheBin::cleanToThreshold(ExtMemoryPool *extMemPool,
while ( toRelease ) {
LargeMemoryBlock *helper = toRelease->next;
- removeBackRef(toRelease->backRefIdx);
- extMemPool->backend.putLargeBlock(toRelease);
+ backend->returnLargeObject(toRelease);
toRelease = helper;
}
return released;
}
-bool LargeObjectCache::CacheBin::cleanAll(ExtMemoryPool *extMemPool)
+template<typename Props>
+bool LargeObjectCacheImpl<Props>::
+ CacheBin::cleanAll(Backend *backend, BinBitMask *bitMask, int idx)
{
LargeMemoryBlock *toRelease = NULL;
bool released = false;
@@ -146,6 +243,9 @@ bool LargeObjectCache::CacheBin::cleanAll(ExtMemoryPool *extMemPool)
last = NULL;
first = NULL;
oldest = 0;
+ cachedSize = 0;
+ if (!usedSize)
+ bitMask->set(idx, false);
}
else
return false;
@@ -154,72 +254,288 @@ bool LargeObjectCache::CacheBin::cleanAll(ExtMemoryPool *extMemPool)
while ( toRelease ) {
LargeMemoryBlock *helper = toRelease->next;
- removeBackRef(toRelease->backRefIdx);
- extMemPool->backend.putLargeBlock(toRelease);
+ MALLOC_ASSERT(!helper || lessThanWithOverflow(helper->age, toRelease->age),
+ ASSERT_TEXT);
+ backend->returnLargeObject(toRelease);
toRelease = helper;
}
return released;
}
-// release from cache blocks that are older than ageThreshold
-bool LargeObjectCache::regularCleanup(ExtMemoryPool *extMemPool, uintptr_t currAge)
+template<typename Props>
+size_t LargeObjectCacheImpl<Props>::CacheBin::reportStat(int num, FILE *f)
{
- bool released = false;
+#if __TBB_MALLOC_LOCACHE_STAT
+ if (first)
+ printf("%d(%lu): total %lu KB thr %ld lastCln %lu lastHit %lu oldest %lu\n",
+ num, num*CacheStep+MinSize,
+ cachedSize/1024, ageThreshold, lastCleanedAge, lastHit, oldest);
+#else
+ suppress_unused_warning(num);
+ suppress_unused_warning(f);
+#endif
+ return cachedSize;
+}
- for (int i = numLargeBlockBins-1; i >= 0; i--)
- if (bin[i].cleanToThreshold(extMemPool, currAge))
+// release from cache blocks that are older than ageThreshold
+template<typename Props>
+bool LargeObjectCacheImpl<Props>::regularCleanup(Backend *backend, uintptr_t currTime)
+{
+ bool released = false, doThreshDecr = false;
+ BinsSummary binsSummary;
+
+ for (int i = bitMask.getMaxTrue(numBins-1); i >= 0;
+ i = bitMask.getMaxTrue(i-1)) {
+ bin[i].updateBinsSummary(&binsSummary);
+ if (!doThreshDecr && tooLargeLOC>2 && binsSummary.isLOCTooLarge()) {
+ // if LOC is too large for quite long time, decrease the threshold
+ // based on bin hit statistics.
+ // For this, redo cleanup from the beginnig.
+ // Note: on this iteration total usedSz can be not too large
+ // in comparison to total cachedSz, as we calculated it only
+ // partially. We are ok this it.
+ i = bitMask.getMaxTrue(numBins-1);
+ doThreshDecr = true;
+ binsSummary.reset();
+ continue;
+ }
+ if (doThreshDecr)
+ bin[i].decreaseThreshold();
+ if (bin[i].cleanToThreshold(backend, &bitMask, currTime, i))
released = true;
+ }
+
+ // We want to find if LOC was too large for some time continuously,
+ // so OK with races between incrementing and zeroing, but incrementing
+ // must be atomic.
+ if (binsSummary.isLOCTooLarge())
+ AtomicIncrement(tooLargeLOC);
+ else
+ tooLargeLOC = 0;
return released;
}
-bool ExtMemoryPool::softCachesCleanup()
+template<typename Props>
+bool LargeObjectCacheImpl<Props>::cleanAll(Backend *backend)
{
- // TODO: cleanup small objects as well
- return loc.regularCleanup(this, FencedLoad((intptr_t&)loCacheStat.age));
+ bool released = false;
+ for (int i = numBins-1; i >= 0; i--)
+ released |= bin[i].cleanAll(backend, &bitMask, i);
+ return released;
}
-uintptr_t LargeObjectCache::cleanupCacheIfNeed(ExtMemoryPool *extMemPool)
+#if __TBB_MALLOC_WHITEBOX_TEST
+template<typename Props>
+size_t LargeObjectCacheImpl<Props>::getLOCSize() const
{
- /* loCacheStat.age overflow is OK, as we only want difference between
- * its current value and some recent.
- *
- * Both malloc and free should increment loCacheStat.age, as in
- * a different case multiple cached blocks would have same age,
- * and accuracy of predictors suffers.
- */
- uintptr_t currAge = (uintptr_t)AtomicIncrement((intptr_t&)loCacheStat.age);
+ size_t size = 0;
+ for (int i = numBins-1; i >= 0; i--)
+ size += bin[i].getSize();
+ return size;
+}
- if ( 0 == currAge % cacheCleanupFreq )
- regularCleanup(extMemPool, currAge);
+size_t LargeObjectCache::getLOCSize() const
+{
+ return largeCache.getLOCSize() + hugeCache.getLOCSize();
+}
- return currAge;
+template<typename Props>
+size_t LargeObjectCacheImpl<Props>::getUsedSize() const
+{
+ size_t size = 0;
+ for (int i = numBins-1; i >= 0; i--)
+ size += bin[i].getUsedSize();
+ return size;
}
-LargeMemoryBlock *LargeObjectCache::get(ExtMemoryPool *extMemPool, size_t size)
+size_t LargeObjectCache::getUsedSize() const
{
- MALLOC_ASSERT( size%largeBlockCacheStep==0, ASSERT_TEXT );
- LargeMemoryBlock *lmb = NULL;
- size_t idx = sizeToIdx(size);
- if (idx<numLargeBlockBins) {
- lmb = bin[idx].get(extMemPool, size);
- if (lmb) {
- MALLOC_ITT_SYNC_ACQUIRED(bin+idx);
- STAT_increment(getThreadId(), ThreadCommonCounters, allocCachedLargeBlk);
- }
+ return largeCache.getUsedSize() + hugeCache.getUsedSize();
+}
+#endif // __TBB_MALLOC_WHITEBOX_TEST
+
+uintptr_t LargeObjectCache::getCurrTime()
+{
+ return (uintptr_t)AtomicIncrement((intptr_t&)cacheCurrTime);
+}
+
+uintptr_t LargeObjectCache::getCurrTimeRange(uintptr_t range)
+{
+ return (uintptr_t)AtomicAdd((intptr_t&)cacheCurrTime, range)+1;
+}
+
+void LargeObjectCache::cleanupCacheIfNeeded(Backend *backend, uintptr_t currTime)
+{
+ if ( 0 == currTime % cacheCleanupFreq )
+ doRegularCleanup(backend, currTime);
+}
+
+void LargeObjectCache::
+ cleanupCacheIfNeededOnRange(Backend *backend, uintptr_t range, uintptr_t currTime)
+{
+ if (range >= cacheCleanupFreq
+ || currTime+range < currTime-1 // overflow, 0 is power of 2, do cleanup
+ // (prev;prev+range] contains n*cacheCleanupFreq
+ || alignUp(currTime, cacheCleanupFreq)<=currTime+range)
+ doRegularCleanup(backend, currTime);
+}
+
+bool LargeObjectCache::doRegularCleanup(Backend *backend, uintptr_t currTime)
+{
+ return largeCache.regularCleanup(backend, currTime)
+ | hugeCache.regularCleanup(backend, currTime);
+}
+
+bool LargeObjectCache::cleanAll(Backend *backend)
+{
+ return largeCache.cleanAll(backend) | hugeCache.cleanAll(backend);
+}
+
+template<typename Props>
+LargeMemoryBlock *LargeObjectCacheImpl<Props>::get(uintptr_t currTime, size_t size)
+{
+ MALLOC_ASSERT( size%Props::CacheStep==0, ASSERT_TEXT );
+ int idx = sizeToIdx(size);
+ bool setNonEmpty = false;
+
+ LargeMemoryBlock *lmb = bin[idx].get(size, currTime, &setNonEmpty);
+ // Setting to true is possible out of lock. As bitmask is used only for cleanup,
+ // the lack of consistency is not violating correctness here.
+ if (setNonEmpty)
+ bitMask.set(idx, true);
+ if (lmb) {
+ MALLOC_ITT_SYNC_ACQUIRED(bin+idx);
+ STAT_increment(getThreadId(), ThreadCommonCounters, allocCachedLargeBlk);
}
return lmb;
}
-void *ExtMemoryPool::mallocLargeObject(size_t size, size_t alignment)
+template<typename Props>
+void LargeObjectCacheImpl<Props>::rollbackCacheState(size_t size)
+{
+ int idx = sizeToIdx(size);
+ MALLOC_ASSERT(idx<numBins, ASSERT_TEXT);
+ bin[idx].decrUsedSize(size, &bitMask, idx);
+}
+
+#if __TBB_MALLOC_LOCACHE_STAT
+template<typename Props>
+void LargeObjectCacheImpl<Props>::reportStat(FILE *f)
+{
+ size_t cachedSize = 0;
+ for (int i=0; i<numLargeBlockBins; i++)
+ cachedSize += bin[i].reportStat(i, f);
+ fprintf(f, "total LOC size %lu MB\nnow %lu\n", cachedSize/1024/1024,
+ loCacheStat.age);
+}
+
+void LargeObjectCache::reportStat(FILE *f)
+{
+ largeObjs.reportStat(f);
+ hugeObjs.reportStat(f);
+}
+#endif
+
+template<typename Props>
+void LargeObjectCacheImpl<Props>::putList(ExtMemoryPool *extMemPool, LargeMemoryBlock *toCache)
+{
+ int toBinIdx = sizeToIdx(toCache->unalignedSize);
+
+ MALLOC_ITT_SYNC_RELEASING(bin+toBinIdx);
+ if (LargeMemoryBlock *release = bin[toBinIdx].putList(extMemPool, toCache,
+ &bitMask, toBinIdx))
+ extMemPool->backend.returnLargeObject(release);
+}
+
+void LargeObjectCache::rollbackCacheState(size_t size)
+{
+ if (size < maxLargeSize)
+ largeCache.rollbackCacheState(size);
+ else if (size < maxHugeSize)
+ hugeCache.rollbackCacheState(size);
+}
+
+// return artifical bin index, it's used only during sorting and never saved
+int LargeObjectCache::sizeToIdx(size_t size)
+{
+ MALLOC_ASSERT(size < maxHugeSize, ASSERT_TEXT);
+ return size < maxLargeSize?
+ LargeCacheType::sizeToIdx(size) :
+ LargeCacheType::getNumBins()+HugeCacheType::sizeToIdx(size);
+}
+
+void LargeObjectCache::putList(ExtMemoryPool *extMemPool, LargeMemoryBlock *list)
+{
+ LargeMemoryBlock *toProcess, *n;
+
+ for (LargeMemoryBlock *curr = list; curr; curr = toProcess) {
+ LargeMemoryBlock *tail = curr;
+ toProcess = curr->next;
+ if (curr->unalignedSize >= maxHugeSize) {
+ extMemPool->backend.returnLargeObject(curr);
+ continue;
+ }
+ int currIdx = sizeToIdx(curr->unalignedSize);
+
+ // Find all blocks fitting to same bin. Not use more efficient sorting
+ // algorithm because list is short (commonly,
+ // LocalLOC's HIGH_MARK-LOW_MARK, i.e. 24 items).
+ for (LargeMemoryBlock *b = toProcess; b; b = n) {
+ n = b->next;
+ if (sizeToIdx(b->unalignedSize) == currIdx) {
+ tail->next = b;
+ tail = b;
+ if (toProcess == b)
+ toProcess = toProcess->next;
+ else {
+ b->prev->next = b->next;
+ if (b->next)
+ b->next->prev = b->prev;
+ }
+ }
+ }
+ tail->next = NULL;
+ if (curr->unalignedSize < maxLargeSize)
+ largeCache.putList(extMemPool, curr);
+ else
+ hugeCache.putList(extMemPool, curr);
+ }
+}
+
+void LargeObjectCache::put(ExtMemoryPool *extMemPool, LargeMemoryBlock *largeBlock)
+{
+ if (largeBlock->unalignedSize < maxHugeSize) {
+ largeBlock->next = NULL;
+ if (largeBlock->unalignedSize<maxLargeSize)
+ largeCache.putList(extMemPool, largeBlock);
+ else
+ hugeCache.putList(extMemPool, largeBlock);
+ } else
+ extMemPool->backend.returnLargeObject(largeBlock);
+}
+
+LargeMemoryBlock *LargeObjectCache::get(Backend *backend, size_t size)
{
- size_t headersSize = sizeof(LargeMemoryBlock)+sizeof(LargeObjectHdr);
- // TODO: take into account that they are already largeObjectAlignment-aligned
- size_t allocationSize = alignUp(size+headersSize+alignment, largeBlockCacheStep);
+ MALLOC_ASSERT( size%largeBlockCacheStep==0, ASSERT_TEXT );
+ MALLOC_ASSERT( size>=minLargeSize, ASSERT_TEXT );
+
+ if ( size < maxHugeSize) {
+ uintptr_t currTime = getCurrTime();
+ cleanupCacheIfNeeded(backend, currTime);
+ return size < maxLargeSize?
+ largeCache.get(currTime, size) : hugeCache.get(currTime, size);
+ }
+ return NULL;
+}
- if (allocationSize < size) // allocationSize is wrapped around after alignUp
- return NULL;
- LargeMemoryBlock* lmb = loc.get(this, allocationSize);
+LargeMemoryBlock *ExtMemoryPool::mallocLargeObject(size_t allocationSize)
+{
+#if __TBB_MALLOC_LOCACHE_STAT
+ AtomicIncrement(mallocCalls);
+ AtomicAdd(memAllocKB, allocationSize/1024);
+#endif
+ LargeMemoryBlock* lmb = loc.get(&backend, allocationSize);
if (!lmb) {
BackRefIdx backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/true);
if (backRefIdx.isInvalid())
@@ -229,51 +545,45 @@ void *ExtMemoryPool::mallocLargeObject(size_t size, size_t alignment)
lmb = backend.getLargeBlock(allocationSize);
if (!lmb) {
removeBackRef(backRefIdx);
+ loc.rollbackCacheState(allocationSize);
return NULL;
}
lmb->backRefIdx = backRefIdx;
STAT_increment(getThreadId(), ThreadCommonCounters, allocNewLargeObj);
+ } else {
+#if __TBB_MALLOC_LOCACHE_STAT
+ AtomicIncrement(cacheHits);
+ AtomicAdd(memHitKB, allocationSize/1024);
+#endif
}
+ return lmb;
+}
- void *alignedArea = (void*)alignUp((uintptr_t)lmb+headersSize, alignment);
- LargeObjectHdr *header = (LargeObjectHdr*)alignedArea-1;
- header->memoryBlock = lmb;
- header->backRefIdx = lmb->backRefIdx;
- setBackRef(header->backRefIdx, header);
-
- lmb->objectSize = size;
-
- MALLOC_ASSERT( isLargeObject(alignedArea), ASSERT_TEXT );
- return alignedArea;
+void ExtMemoryPool::freeLargeObject(LargeMemoryBlock *mBlock)
+{
+ loc.put(this, mBlock);
}
-bool LargeObjectCache::put(ExtMemoryPool *extMemPool, LargeMemoryBlock *largeBlock)
+void ExtMemoryPool::freeLargeObjectList(LargeMemoryBlock *head)
{
- size_t idx = sizeToIdx(largeBlock->unalignedSize);
- if (idx<numLargeBlockBins) {
- MALLOC_ITT_SYNC_RELEASING(bin+idx);
- if (bin[idx].put(extMemPool, largeBlock)) {
- STAT_increment(getThreadId(), ThreadCommonCounters, cacheLargeBlk);
- return true;
- } else
- return false;
- }
- return false;
+ loc.putList(this, head);
}
-void ExtMemoryPool::freeLargeObject(void *object)
+bool ExtMemoryPool::softCachesCleanup()
{
- LargeObjectHdr *header = (LargeObjectHdr*)object - 1;
+ // TODO: cleanup small objects as well
+ return loc.regularCleanup(&backend);
+}
- // overwrite backRefIdx to simplify double free detection
- header->backRefIdx = BackRefIdx();
- if (!loc.put(this, header->memoryBlock)) {
- removeBackRef(header->memoryBlock->backRefIdx);
- backend.putLargeBlock(header->memoryBlock);
- STAT_increment(getThreadId(), ThreadCommonCounters, freeLargeObj);
- }
+bool ExtMemoryPool::hardCachesCleanup()
+{
+ // thread-local caches must be cleaned before LOC,
+ // because object from thread-local cache can be released to LOC
+ bool tlCaches = releaseTLCaches(), locCaches = loc.cleanAll(&backend);
+ return tlCaches || locCaches;
}
+
/*********** End allocation of large objects **********/
} // namespace internal
diff --git a/src/tbbmalloc/lin32-proxy-export.def b/src/tbbmalloc/lin32-proxy-export.def
index a1e3937..f798297 100644
--- a/src/tbbmalloc/lin32-proxy-export.def
+++ b/src/tbbmalloc/lin32-proxy-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -38,6 +38,13 @@ valloc;
pvalloc;
mallinfo;
mallopt;
+__libc_malloc;
+__libc_realloc;
+__libc_calloc;
+__libc_free;
+__libc_memalign;
+__libc_pvalloc;
+__libc_valloc;
__TBB_malloc_proxy;
__TBB_internal_find_original_malloc;
_ZdaPv; /* next ones are new/delete */
diff --git a/src/tbbmalloc/lin32-tbbmalloc-export.def b/src/tbbmalloc/lin32-tbbmalloc-export.def
index f2fc293..58c95cf 100644
--- a/src/tbbmalloc/lin32-tbbmalloc-export.def
+++ b/src/tbbmalloc/lin32-tbbmalloc-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -43,6 +43,8 @@ __TBB_internal_malloc;
__TBB_internal_realloc;
__TBB_internal_posix_memalign;
scalable_msize;
+scalable_allocation_mode;
+
/* memory pool stuff */
_ZN3rml10pool_resetEPNS_10MemoryPoolE;
_ZN3rml11pool_createEiPKNS_13MemPoolPolicyE;
diff --git a/src/tbbmalloc/lin64-proxy-export.def b/src/tbbmalloc/lin64-proxy-export.def
index f14eba8..b6291f4 100644
--- a/src/tbbmalloc/lin64-proxy-export.def
+++ b/src/tbbmalloc/lin64-proxy-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -38,6 +38,13 @@ valloc;
pvalloc;
mallinfo;
mallopt;
+__libc_malloc;
+__libc_realloc;
+__libc_calloc;
+__libc_free;
+__libc_memalign;
+__libc_pvalloc;
+__libc_valloc;
__TBB_malloc_proxy;
__TBB_internal_find_original_malloc;
_ZdaPv; /* next ones are new/delete */
diff --git a/src/tbbmalloc/lin64-tbbmalloc-export.def b/src/tbbmalloc/lin64-tbbmalloc-export.def
index 2c8c885..ef6cb6f 100644
--- a/src/tbbmalloc/lin64-tbbmalloc-export.def
+++ b/src/tbbmalloc/lin64-tbbmalloc-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -43,6 +43,8 @@ __TBB_internal_malloc;
__TBB_internal_realloc;
__TBB_internal_posix_memalign;
scalable_msize;
+scalable_allocation_mode;
+
/* memory pool stuff */
_ZN3rml11pool_createElPKNS_13MemPoolPolicyE;
_ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE;
diff --git a/src/tbbmalloc/lin64ipf-proxy-export.def b/src/tbbmalloc/lin64ipf-proxy-export.def
index f14eba8..b6291f4 100644
--- a/src/tbbmalloc/lin64ipf-proxy-export.def
+++ b/src/tbbmalloc/lin64ipf-proxy-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -38,6 +38,13 @@ valloc;
pvalloc;
mallinfo;
mallopt;
+__libc_malloc;
+__libc_realloc;
+__libc_calloc;
+__libc_free;
+__libc_memalign;
+__libc_pvalloc;
+__libc_valloc;
__TBB_malloc_proxy;
__TBB_internal_find_original_malloc;
_ZdaPv; /* next ones are new/delete */
diff --git a/src/tbbmalloc/lin64ipf-tbbmalloc-export.def b/src/tbbmalloc/lin64ipf-tbbmalloc-export.def
index 2c8c885..ef6cb6f 100644
--- a/src/tbbmalloc/lin64ipf-tbbmalloc-export.def
+++ b/src/tbbmalloc/lin64ipf-tbbmalloc-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -43,6 +43,8 @@ __TBB_internal_malloc;
__TBB_internal_realloc;
__TBB_internal_posix_memalign;
scalable_msize;
+scalable_allocation_mode;
+
/* memory pool stuff */
_ZN3rml11pool_createElPKNS_13MemPoolPolicyE;
_ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE;
diff --git a/src/tbbmalloc/mac32-tbbmalloc-export.def b/src/tbbmalloc/mac32-tbbmalloc-export.def
index 0a66a5b..4eb11f7 100644
--- a/src/tbbmalloc/mac32-tbbmalloc-export.def
+++ b/src/tbbmalloc/mac32-tbbmalloc-export.def
@@ -1,21 +1,29 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
+ This file is part of Threading Building Blocks.
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
*/
_scalable_calloc
@@ -27,6 +35,7 @@ _scalable_aligned_malloc
_scalable_aligned_realloc
_scalable_aligned_free
_scalable_msize
+_scalable_allocation_mode
/* memory pool stuff */
__ZN3rml11pool_createElPKNS_13MemPoolPolicyE
__ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE
diff --git a/src/tbbmalloc/mac64-tbbmalloc-export.def b/src/tbbmalloc/mac64-tbbmalloc-export.def
index 0a66a5b..4eb11f7 100644
--- a/src/tbbmalloc/mac64-tbbmalloc-export.def
+++ b/src/tbbmalloc/mac64-tbbmalloc-export.def
@@ -1,21 +1,29 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
+ This file is part of Threading Building Blocks.
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
*/
_scalable_calloc
@@ -27,6 +35,7 @@ _scalable_aligned_malloc
_scalable_aligned_realloc
_scalable_aligned_free
_scalable_msize
+_scalable_allocation_mode
/* memory pool stuff */
__ZN3rml11pool_createElPKNS_13MemPoolPolicyE
__ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE
diff --git a/src/tbbmalloc/proxy.cpp b/src/tbbmalloc/proxy.cpp
index 7687432..f558729 100644
--- a/src/tbbmalloc/proxy.cpp
+++ b/src/tbbmalloc/proxy.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -27,6 +27,7 @@
*/
#include "proxy.h"
+#include "tbb/tbb_config.h"
#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)
#if TBB_USE_EXCEPTIONS
@@ -38,7 +39,7 @@
#define TBB_USE_EXCEPTIONS 1
#endif
-#if MALLOC_LD_PRELOAD
+#if MALLOC_UNIXLIKE_OVERLOAD_ENABLED
/*** service functions and variables ***/
@@ -52,8 +53,8 @@ static inline void initPageSize()
memoryPageSize = sysconf(_SC_PAGESIZE);
}
-/* For the expected behaviour (i.e., finding malloc/free/etc from libc.so,
- not from ld-linux.so) dlsym(RTLD_NEXT) should be called from
+/* For the expected behaviour (i.e., finding malloc/free/etc from libc.so,
+ not from ld-linux.so) dlsym(RTLD_NEXT) should be called from
a LD_PRELOADed library, not another dynamic library.
So we have to put find_original_malloc here.
*/
@@ -67,7 +68,7 @@ extern "C" bool __TBB_internal_find_original_malloc(int num, const char *names[]
return true;
}
-/* __TBB_malloc_proxy used as a weak symbol by libtbbmalloc for:
+/* __TBB_malloc_proxy used as a weak symbol by libtbbmalloc for:
1) detection that the proxy library is loaded
2) check that dlsym("malloc") found something different from our replacement malloc
*/
@@ -122,7 +123,7 @@ void * valloc(size_t size) __THROW
return scalable_aligned_malloc(size, memoryPageSize);
}
-/* pvalloc allocates smallest set of complete pages which can hold
+/* pvalloc allocates smallest set of complete pages which can hold
the requested number of bytes. Result is aligned on page boundary. */
void * pvalloc(size_t size) __THROW
{
@@ -138,6 +139,20 @@ int mallopt(int /*param*/, int /*value*/) __THROW
return 1;
}
+#if !__ANDROID__
+// Those non-standart functions are exported by GLIBC, and might be used
+// in conjunction with standart malloc/free, so we must ovberload them.
+// Bionic doesn't have them. Not removing from the linker scripts,
+// as absent entry points are ignored by the linker.
+void *__libc_malloc(size_t size) __attribute__ ((alias ("malloc")));
+void *__libc_realloc(void *ptr, size_t size) __attribute__ ((alias ("realloc")));
+void *__libc_calloc(size_t num, size_t size) __attribute__ ((alias ("calloc")));
+void __libc_free(void *ptr) __attribute__ ((alias ("free")));
+void *__libc_memalign(size_t alignment, size_t size) __attribute__ ((alias ("memalign")));
+void *__libc_pvalloc(size_t size) __attribute__ ((alias ("pvalloc")));
+void *__libc_valloc(size_t size) __attribute__ ((alias ("valloc")));
+#endif
+
} /* extern "C" */
#if __linux__
@@ -192,12 +207,14 @@ void operator delete[](void* ptr, const std::nothrow_t&) throw() {
scalable_free(ptr);
}
-#endif /* MALLOC_LD_PRELOAD */
+#endif /* MALLOC_UNIXLIKE_OVERLOAD_ENABLED */
#ifdef _WIN32
#include <windows.h>
+#if !__TBB_WIN8UI_SUPPORT
+
#include <stdio.h>
#include "tbb_function_replacement.h"
@@ -235,7 +252,7 @@ void* safer_scalable_aligned_realloc_##CRTLIB( void *ptr, size_t size, size_t al
{ \
orig_ptrs func_ptrs = {orig_free_##CRTLIB, orig_msize_##CRTLIB}; \
return safer_scalable_aligned_realloc( ptr, size, aligment, &func_ptrs ); \
-}
+}
// limit is 30 bytes/60 symbols per line
const char* known_bytecodes[] = {
@@ -250,6 +267,7 @@ const char* known_bytecodes[] = {
"558BEC6A018B", //debug free() & _msize() 8.0.50727.4053 win32
"6A1868********E8", //release free() 8.0.50727.4053 win32
"6A1C68********E8", //release _msize() 8.0.50727.4053 win32
+ "558BEC837D08000F", //release _msize() 11.0.51106.1 win32
"8BFF558BEC6A", //debug free() & _msize() 9.0.21022.8 win32
"8BFF558BEC83", //debug free() & _msize() 10.0.21003.1 win32
#endif
@@ -361,11 +379,11 @@ _aligned_malloc
_expand (by dummy implementation)
??2 at YAPAXI@Z operator new (ia32)
??_U at YAPAXI@Z void * operator new[] (size_t size) (ia32)
-??3 at YAXPAX@Z operator delete (ia32)
+??3 at YAXPAX@Z operator delete (ia32)
??_V at YAXPAX@Z operator delete[] (ia32)
??2 at YAPEAX_K@Z void * operator new(unsigned __int64) (intel64)
??_V at YAXPEAX@Z void * operator new[](unsigned __int64) (intel64)
-??3 at YAXPEAX@Z operator delete (intel64)
+??3 at YAXPEAX@Z operator delete (intel64)
??_V at YAXPEAX@Z operator delete[] (intel64)
??2 at YAPAXIABUnothrow_t@std@@@Z void * operator new (size_t sz, const std::nothrow_t&) throw() (optional)
??_U at YAPAXIABUnothrow_t@std@@@Z void * operator new[] (size_t sz, const std::nothrow_t&) throw() (optional)
@@ -395,7 +413,7 @@ FRDATA routines_to_replace[] = {
{ "??_U at YAPEAX_K@Z", (FUNCPTR)operator_new_arr, FRR_FAIL },
{ "??3 at YAXPEAX@Z", (FUNCPTR)operator_delete, FRR_FAIL },
{ "??_V at YAXPEAX@Z", (FUNCPTR)operator_delete_arr, FRR_FAIL },
-#else
+#else
{ "??2 at YAPAXI@Z", (FUNCPTR)operator_new, FRR_FAIL },
{ "??_U at YAPAXI@Z", (FUNCPTR)operator_new_arr, FRR_FAIL },
{ "??3 at YAXPAX@Z", (FUNCPTR)operator_delete, FRR_FAIL },
@@ -455,10 +473,13 @@ void doMallocReplacement()
}
}
+#endif // !__TBB_WIN8UI_SUPPORT
+
extern "C" BOOL WINAPI DllMain( HINSTANCE hInst, DWORD callReason, LPVOID reserved )
{
if ( callReason==DLL_PROCESS_ATTACH && reserved && hInst ) {
+#if !__TBB_WIN8UI_SUPPORT
#if TBBMALLOC_USE_TBB_FOR_ALLOCATOR_ENV_CONTROLLED
char pinEnvVariable[50];
if( GetEnvironmentVariable("TBBMALLOC_USE_TBB_FOR_ALLOCATOR", pinEnvVariable, 50))
@@ -468,6 +489,7 @@ extern "C" BOOL WINAPI DllMain( HINSTANCE hInst, DWORD callReason, LPVOID reserv
#else
doMallocReplacement();
#endif
+#endif // !__TBB_WIN8UI_SUPPORT
}
return TRUE;
diff --git a/src/tbbmalloc/proxy.h b/src/tbbmalloc/proxy.h
index a98f9b5..1a8cd19 100644
--- a/src/tbbmalloc/proxy.h
+++ b/src/tbbmalloc/proxy.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,11 +30,11 @@
#define _TBB_malloc_proxy_H_
#if __linux__
-#define MALLOC_LD_PRELOAD 1
+#define MALLOC_UNIXLIKE_OVERLOAD_ENABLED 1
#endif
-// MALLOC_LD_PRELOAD depends on MALLOC_CHECK_RECURSION stuff
-#if __linux__ || __APPLE__ || __sun || __FreeBSD__ || MALLOC_LD_PRELOAD
+// MALLOC_UNIXLIKE_OVERLOAD_ENABLED depends on MALLOC_CHECK_RECURSION stuff
+#if __linux__ || __APPLE__ || __sun || __FreeBSD__ || MALLOC_UNIXLIKE_OVERLOAD_ENABLED
#define MALLOC_CHECK_RECURSION 1
#endif
diff --git a/src/tbbmalloc/tbb_function_replacement.cpp b/src/tbbmalloc/tbb_function_replacement.cpp
index d13be8b..ed432ed 100644
--- a/src/tbbmalloc/tbb_function_replacement.cpp
+++ b/src/tbbmalloc/tbb_function_replacement.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,8 +26,10 @@
the GNU General Public License.
*/
-// Works on windows only
-#ifdef _WIN32
+#include "tbb/tbb_config.h"
+
+#if !__TBB_WIN8UI_SUPPORT && defined(_WIN32)
+
#define _CRT_SECURE_NO_DEPRECATE 1
#define __TBB_NO_IMPLICIT_LINKAGE 1
@@ -63,7 +65,7 @@ inline bool IsInDistance(UINT_PTR addr1, UINT_PTR addr2, __int64 dist)
/*
* When inserting a probe in 64 bits process the distance between the insertion
- * point and the target may be bigger than 2^32. In this case we are using
+ * point and the target may be bigger than 2^32. In this case we are using
* indirect jump through memory where the offset to this memory location
* is smaller than 2^32 and it contains the absolute address (8 bytes).
*
@@ -138,22 +140,22 @@ MemoryBuffer *CreateBuffer(UINT_PTR addr)
}
public:
- MemoryProvider()
- {
+ MemoryProvider()
+ {
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
- m_allocSize = sysInfo.dwAllocationGranularity;
+ m_allocSize = sysInfo.dwAllocationGranularity;
m_lastBuffer = &m_pages[0];
}
// We can't free the pages in the destructor because the trampolines
// are using these memory locations and a replaced function might be called
// after the destructor was called.
- ~MemoryProvider()
+ ~MemoryProvider()
{
}
- // Return a memory location in distance less than 2^31 from input address
+ // Return a memory location in distance less than 2^31 from input address
UINT_PTR GetLocation(UINT_PTR addr)
{
MemoryBuffer *pBuff = m_pages;
@@ -201,7 +203,7 @@ size_t compareStrings( const char *str1, const char *str2 )
// inpAddr - pointer to function prologue
// Dictionary contains opcodes for several full asm instructions
// + one opcode byte for the next asm instruction for safe address processing
-// RETURN: number of bytes for safe bytes replacement
+// RETURN: number of bytes for safe bytes replacement
// (matched_pattern/2-1)
UINT CheckOpcodes( const char ** opcodes, void *inpAddr )
{
@@ -216,7 +218,7 @@ UINT CheckOpcodes( const char ** opcodes, void *inpAddr )
// max length and number of patterns
if( !opcodesStringsCount || opcodes_pointer != (size_t)opcodes ){
while( *(opcodes + opcodesStringsCount)!= NULL ){
- if( (i=strlen(*(opcodes + opcodesStringsCount))) > maxOpcodesLength )
+ if( (i=strlen(*(opcodes + opcodesStringsCount))) > maxOpcodesLength )
maxOpcodesLength = i;
opcodesStringsCount++;
}
@@ -226,14 +228,14 @@ UINT CheckOpcodes( const char ** opcodes, void *inpAddr )
// Translate prologue opcodes to string format to compare
for( i=0; i< maxOpcodesLength/2; i++ ){
- sprintf( opcodeString + 2*i, "%.2X", *((unsigned char*)inpAddr+i) );
+ sprintf( opcodeString + 2*i, "%.2X", *((unsigned char*)inpAddr+i) );
}
opcodeString[maxOpcodesLength] = 0;
-
+
// Compare translated opcodes with patterns
for( i=0; i< opcodesStringsCount; i++ ){
result = compareStrings( opcodes[i],opcodeString );
- if( result )
+ if( result )
return (UINT)(result/2-1);
}
// TODO: to add more stuff to patterns
@@ -396,7 +398,7 @@ static bool InsertTrampoline(void *inpAddr, void *targetAddr, const char ** opco
FRR_TYPE ReplaceFunctionA(const char *dllName, const char *funcName, FUNCPTR newFunc, const char ** opcodes, FUNCPTR* origFunc)
{
// Cache the results of the last search for the module
- // Assume that there was no DLL unload between
+ // Assume that there was no DLL unload between
static char cachedName[MAX_PATH+1];
static HMODULE cachedHM = 0;
@@ -436,7 +438,7 @@ FRR_TYPE ReplaceFunctionA(const char *dllName, const char *funcName, FUNCPTR new
FRR_TYPE ReplaceFunctionW(const wchar_t *dllName, const char *funcName, FUNCPTR newFunc, const char ** opcodes, FUNCPTR* origFunc)
{
// Cache the results of the last search for the module
- // Assume that there was no DLL unload between
+ // Assume that there was no DLL unload between
static wchar_t cachedName[MAX_PATH+1];
static HMODULE cachedHM = 0;
@@ -473,4 +475,4 @@ FRR_TYPE ReplaceFunctionW(const wchar_t *dllName, const char *funcName, FUNCPTR
return FRR_OK;
}
-#endif //_WIN32
+#endif /* !__TBB_WIN8UI_SUPPORT && defined(_WIN32) */
diff --git a/src/tbbmalloc/tbb_function_replacement.h b/src/tbbmalloc/tbb_function_replacement.h
index 37eea33..40f9c42 100644
--- a/src/tbbmalloc/tbb_function_replacement.h
+++ b/src/tbbmalloc/tbb_function_replacement.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbbmalloc/tbbmalloc.cpp b/src/tbbmalloc/tbbmalloc.cpp
index b26534b..5870167 100644
--- a/src/tbbmalloc/tbbmalloc.cpp
+++ b/src/tbbmalloc/tbbmalloc.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -51,7 +51,7 @@
#include <errno.h>
#endif
-#if MALLOC_LD_PRELOAD
+#if MALLOC_UNIXLIKE_OVERLOAD_ENABLED
extern "C" {
@@ -62,7 +62,7 @@ bool __TBB_internal_find_original_malloc(int num, const char *names[], void *tab
}
-#endif /* MALLOC_LD_PRELOAD */
+#endif /* MALLOC_UNIXLIKE_OVERLOAD_ENABLED */
#endif /* MALLOC_CHECK_RECURSION */
namespace rml {
@@ -72,7 +72,7 @@ namespace internal {
void* (*original_malloc_ptr)(size_t) = 0;
void (*original_free_ptr)(void*) = 0;
-#if MALLOC_LD_PRELOAD
+#if MALLOC_UNIXLIKE_OVERLOAD_ENABLED
static void* (*original_calloc_ptr)(size_t,size_t) = 0;
static void* (*original_realloc_ptr)(void*,size_t) = 0;
#endif
@@ -97,16 +97,16 @@ extern "C" void MallocInitializeITT() {
#define MALLOCLIB_NAME "tbbmalloc" DEBUG_SUFFIX ".dll"
#elif __APPLE__
#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX ".dylib"
+#elif __FreeBSD__ || __NetBSD__ || __sun || _AIX || __ANDROID__
+#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX ".so"
#elif __linux__
#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION)
-#elif __FreeBSD__ || __NetBSD__ || __sun || _AIX
-#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX ".so"
#else
#error Unknown OS
#endif
void init_tbbmalloc() {
-#if MALLOC_LD_PRELOAD
+#if MALLOC_UNIXLIKE_OVERLOAD_ENABLED
if (malloc_proxy && __TBB_internal_find_original_malloc) {
const char *alloc_names[] = { "malloc", "free", "realloc", "calloc"};
void *orig_alloc_ptrs[4];
@@ -125,7 +125,7 @@ void init_tbbmalloc() {
original_malloc_found = 1;
}
}
-#endif /* MALLOC_LD_PRELOAD */
+#endif /* MALLOC_UNIXLIKE_OVERLOAD_ENABLED */
#if DO_ITT_NOTIFY
MallocInitializeITT();
@@ -134,18 +134,21 @@ void init_tbbmalloc() {
/* Preventing TBB allocator library from unloading to prevent
resource leak, as memory is not released on the library unload.
*/
-#if USE_WINTHREAD && !__TBB_SOURCE_DIRECTLY_INCLUDED
+#if USE_WINTHREAD && !__TBB_SOURCE_DIRECTLY_INCLUDED && !__TBB_WIN8UI_SUPPORT
// Prevent Windows from displaying message boxes if it fails to load library
UINT prev_mode = SetErrorMode (SEM_FAILCRITICALERRORS);
- HMODULE lib = LoadLibrary(MALLOCLIB_NAME);
- MALLOC_ASSERT(lib, "Allocator can't load ifself.");
+ HMODULE lib;
+ BOOL ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
+ |GET_MODULE_HANDLE_EX_FLAG_PIN,
+ (LPCTSTR)&scalable_malloc, &lib);
+ MALLOC_ASSERT(lib && ret, "Allocator can't find itself.");
SetErrorMode (prev_mode);
#endif /* USE_PTHREAD && !__TBB_SOURCE_DIRECTLY_INCLUDED */
}
#if !__TBB_SOURCE_DIRECTLY_INCLUDED
#if USE_WINTHREAD
-extern "C" BOOL WINAPI DllMain( HINSTANCE hInst, DWORD callReason, LPVOID )
+extern "C" BOOL WINAPI DllMain( HINSTANCE /*hInst*/, DWORD callReason, LPVOID )
{
if (callReason==DLL_THREAD_DETACH)
@@ -158,27 +161,29 @@ extern "C" BOOL WINAPI DllMain( HINSTANCE hInst, DWORD callReason, LPVOID )
}
return TRUE;
}
-#else
+#else /* !USE_WINTHREAD */
struct RegisterProcessShutdownNotification {
+// Work around non-reentrancy in dlopen() on Android
+#if !__TBB_USE_DLOPEN_REENTRANCY_WORKAROUND
RegisterProcessShutdownNotification() {
// prevents unloading, POSIX case
- void *ret = dlopen(MALLOCLIB_NAME, RTLD_NOW);
- MALLOC_ASSERT(ret, "Allocator can't load ifself.");
+ dlopen(MALLOCLIB_NAME, RTLD_NOW);
}
+#endif /* !__ANDROID__ */
~RegisterProcessShutdownNotification() {
__TBB_mallocProcessShutdownNotification();
}
};
static RegisterProcessShutdownNotification reg;
-#endif /* USE_WINTHREAD */
+#endif /* !USE_WINTHREAD */
#endif /* !__TBB_SOURCE_DIRECTLY_INCLUDED */
#if MALLOC_CHECK_RECURSION
bool original_malloc_found;
-#if MALLOC_LD_PRELOAD
+#if MALLOC_UNIXLIKE_OVERLOAD_ENABLED
extern "C" {
@@ -209,7 +214,7 @@ void __TBB_internal_free(void *object)
} /* extern "C" */
-#endif /* MALLOC_LD_PRELOAD */
+#endif /* MALLOC_UNIXLIKE_OVERLOAD_ENABLED */
#endif /* MALLOC_CHECK_RECURSION */
diff --git a/src/tbbmalloc/tbbmalloc.rc b/src/tbbmalloc/tbbmalloc.rc
index be0bd76..68ca40d 100644
--- a/src/tbbmalloc/tbbmalloc.rc
+++ b/src/tbbmalloc/tbbmalloc.rc
@@ -1,4 +1,4 @@
-// Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+// Copyright 2005-2013 Intel Corporation. All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
@@ -93,7 +93,7 @@ BEGIN
VALUE "FileDescription", "Scalable Allocator library\0"
VALUE "FileVersion", TBBMALLOC_VERSION "\0"
//what is it? VALUE "InternalName", "tbbmalloc\0"
- VALUE "LegalCopyright", "Copyright 2005-2012 Intel Corporation. All Rights Reserved.\0"
+ VALUE "LegalCopyright", "Copyright 2005-2013 Intel Corporation. All Rights Reserved.\0"
VALUE "LegalTrademarks", "\0"
#ifndef TBB_USE_DEBUG
VALUE "OriginalFilename", "tbbmalloc.dll\0"
diff --git a/src/tbbmalloc/tbbmalloc_internal.h b/src/tbbmalloc/tbbmalloc_internal.h
index 74cf8cd..bf529cd 100644
--- a/src/tbbmalloc/tbbmalloc_internal.h
+++ b/src/tbbmalloc/tbbmalloc_internal.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -43,6 +43,12 @@
#error Must define USE_PTHREAD or USE_WINTHREAD
#endif
+#include "tbb/tbb_config.h"
+#if __TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN
+ #define _EXCEPTION_PTR_H /* prevents exception_ptr.h inclusion */
+ #define _GLIBCXX_NESTED_EXCEPTION_H /* prevents nested_exception.h inclusion */
+#endif
+
#include <stdio.h>
#include <stdlib.h>
#include <limits.h> // for CHAR_BIT
@@ -73,15 +79,26 @@
#define ASSERT_TEXT NULL
-#define COLLECT_STATISTICS MALLOC_DEBUG && defined(MALLOCENV_COLLECT_STATISTICS)
+#define COLLECT_STATISTICS ( MALLOC_DEBUG && MALLOCENV_COLLECT_STATISTICS )
#include "Statistics.h"
+// call yield for whitebox testing, skip in real library
+#ifndef WhiteboxTestingYield
+#define WhiteboxTestingYield() ((void)0)
+#endif
+
+
/********* End compile-time options **************/
namespace rml {
namespace internal {
+#if __TBB_MALLOC_LOCACHE_STAT
+extern intptr_t mallocCalls, cacheHits;
+extern intptr_t memAllocKB, memHitKB;
+#endif
+
//! Utility template function to prevent "unused" warnings by various compilers.
template<typename T>
void suppress_unused_warning( const T& ) {}
@@ -89,15 +106,10 @@ void suppress_unused_warning( const T& ) {}
/********** Various numeric parameters controlling allocations ********/
/*
- * blockSize - the size of a block, it must be larger than maxSegregatedObjectSize.
- *
+ * smabSize - the size of a block for allocation of small objects,
+ * it must be larger than maxSegregatedObjectSize.
*/
-const uintptr_t blockSize = 16*1024;
-
-/*
- * Difference between object sizes in large block bins
- */
-const uint32_t largeBlockCacheStep = 8*1024;
+const uintptr_t slabSize = 16*1024;
/*
* Large blocks cache cleanup frequency.
@@ -145,14 +157,110 @@ public:
TLSData* createTLS(MemoryPool *memPool, Backend *backend);
};
-class LargeObjectCache {
+// TODO: make BitMaskBasic more general
+// (currenty, it fits BitMaskMin well, but not as suitable for BitMaskMax)
+template<unsigned NUM>
+class BitMaskBasic {
+ static const int SZ = (NUM-1)/(CHAR_BIT*sizeof(uintptr_t))+1;
+ static const unsigned WORD_LEN = CHAR_BIT*sizeof(uintptr_t);
+ uintptr_t mask[SZ];
+protected:
+ void set(size_t idx, bool val) {
+ MALLOC_ASSERT(idx<NUM, ASSERT_TEXT);
+
+ size_t i = idx / WORD_LEN;
+ int pos = WORD_LEN - idx % WORD_LEN - 1;
+ if (val)
+ AtomicOr(&mask[i], 1ULL << pos);
+ else
+ AtomicAnd(&mask[i], ~(1ULL << pos));
+ }
+ int getMinTrue(unsigned startIdx) const {
+ size_t idx = startIdx / WORD_LEN;
+ uintptr_t curr;
+ int pos;
+
+ if (startIdx % WORD_LEN) { // clear bits before startIdx
+ pos = WORD_LEN - startIdx % WORD_LEN;
+ curr = mask[idx] & ((1ULL<<pos) - 1);
+ } else
+ curr = mask[idx];
+
+ for (int i=idx; i<SZ; i++, curr=mask[i]) {
+ if (-1 != (pos = BitScanRev(curr)))
+ return (i+1)*WORD_LEN - pos - 1;
+ }
+ return -1;
+ }
+public:
+ void reset() { for (int i=0; i<SZ; i++) mask[i] = 0; }
+};
+
+template<unsigned NUM>
+class BitMaskMin : public BitMaskBasic<NUM> {
+public:
+ void set(size_t idx, bool val) { BitMaskBasic<NUM>::set(idx, val); }
+ int getMinTrue(unsigned startIdx) const {
+ return BitMaskBasic<NUM>::getMinTrue(startIdx);
+ }
+};
+
+template<unsigned NUM>
+class BitMaskMax : public BitMaskBasic<NUM> {
+public:
+ void set(size_t idx, bool val) {
+ BitMaskBasic<NUM>::set(NUM - 1 - idx, val);
+ }
+ int getMaxTrue(unsigned startIdx) const {
+ int p = BitMaskBasic<NUM>::getMinTrue(NUM-startIdx-1);
+ return -1==p? -1 : (int)NUM - 1 - p;
+ }
+};
+
+/* cache blocks in range [MinSize; MaxSize) in bins with CacheStep
+ TooLargeFactor -- when cache size treated "too large" in comparison to user data size
+ OnMissFactor -- If cache miss occurred and cache was cleaned,
+ set ageThreshold to OnMissFactor * the difference
+ between current time and last time cache was cleaned.
+ LongWaitFactor -- to detect rarely-used bins and forget about their usage history
+*/
+template<size_t MIN_SIZE, size_t MAX_SIZE, uint32_t CACHE_STEP, int TOO_LARGE,
+ int ON_MISS, int LONG_WAIT>
+struct LargeObjectCacheProps {
+ static const size_t MinSize = MIN_SIZE, MaxSize = MAX_SIZE;
+ static const uint32_t CacheStep = CACHE_STEP;
+ static const int TooLargeFactor = TOO_LARGE, OnMissFactor = ON_MISS,
+ LongWaitFactor = LONG_WAIT;
+};
+
+template<typename Props>
+class LargeObjectCacheImpl {
// The number of bins to cache large objects.
-#if __TBB_DEFINE_MIC
- static const uint32_t numLargeBlockBins = 11; // for 100KB max cached size
-#else
- static const uint32_t numLargeBlockBins = 1024; // for ~8MB max cached size
-#endif
- // 2-linked list of same-size cached blocks
+ static const uint32_t numBins = (Props::MaxSize-Props::MinSize)/Props::CacheStep;
+
+ typedef BitMaskMax<numBins> BinBitMask;
+
+ // Current sizes of used and cached objects. It's calculated while we are
+ // traversing bins, and used for isLOCTooLarge() check at the same time.
+ class BinsSummary {
+ size_t usedSz;
+ size_t cachedSz;
+ public:
+ BinsSummary() : usedSz(0), cachedSz(0) {}
+ // "too large" criteria
+ bool isLOCTooLarge() const { return cachedSz > Props::TooLargeFactor*usedSz; }
+ void update(size_t usedSize, size_t cachedSize) {
+ usedSz += usedSize;
+ cachedSz += cachedSize;
+ }
+ void reset() { usedSz = cachedSz = 0; }
+ };
+
+ // 2-linked list of same-size cached blocks ordered by age (oldest on top)
+ // TODO: are we really want the list to be 2-linked? This allows us
+ // reduce memory consumption and do less operations under lock.
+ // TODO: try to switch to 32-bit logical time to save space in CacheBin
+ // and move bins to different cache lines.
class CacheBin {
LargeMemoryBlock *first,
*last;
@@ -166,40 +274,137 @@ class LargeObjectCache {
Set on cache miss. */
intptr_t ageThreshold;
+ /* total size of all objects corresponding to the bin and allocated by user */
+ size_t usedSize,
+ /* total size of all objects cached in the bin */
+ cachedSize;
+ /* time of last hit for the bin */
+ intptr_t lastHit;
+ /* time of last get called for the bin */
+ uintptr_t lastGet;
+
MallocMutex lock;
/* should be placed in zero-initialized memory, ctor not needed. */
CacheBin();
+ void forgetOutdatedState(uintptr_t currT);
public:
void init() { memset(this, 0, sizeof(CacheBin)); }
- inline bool put(ExtMemoryPool *extMemPool, LargeMemoryBlock* ptr);
- inline LargeMemoryBlock *get(ExtMemoryPool *extMemPool, size_t size);
- bool cleanToThreshold(ExtMemoryPool *extMemPool, uintptr_t currAge);
- bool cleanAll(ExtMemoryPool *extMemPool);
+ LargeMemoryBlock *putList(ExtMemoryPool *extMemPool, LargeMemoryBlock *head, BinBitMask *bitMask, int idx);
+ inline LargeMemoryBlock *get(size_t size, uintptr_t currTime, bool *setNonEmpty);
+ void decreaseThreshold() {
+ if (ageThreshold)
+ ageThreshold = (ageThreshold + lastHit)/2;
+ }
+ void updateBinsSummary(BinsSummary *binsSummary) const {
+ binsSummary->update(usedSize, cachedSize);
+ }
+ bool cleanToThreshold(Backend *backend, BinBitMask *bitMask, uintptr_t currTime, int idx);
+ bool cleanAll(Backend *backend, BinBitMask *bitMask, int idx);
+ void decrUsedSize(size_t size, BinBitMask *bitMask, int idx) {
+ MallocMutex::scoped_lock scoped_cs(lock);
+ usedSize -= size;
+ if (!usedSize && !first)
+ bitMask->set(idx, false);
+ }
+ size_t getSize() const { return cachedSize; }
+ size_t getUsedSize() const { return usedSize; }
+ size_t reportStat(int num, FILE *f);
};
+ intptr_t tooLargeLOC; // how many times LOC was "too large"
+ // for fast finding of used bins and bins with non-zero usedSize;
+ // indexed from the end, as we need largest 1st
+ BinBitMask bitMask;
// bins with lists of recently freed large blocks cached for re-use
- CacheBin bin[numLargeBlockBins];
+ CacheBin bin[numBins];
+public:
static int sizeToIdx(size_t size) {
- // minLargeObjectSize is minimal size of a large object
- return (size-minLargeObjectSize)/largeBlockCacheStep;
+ MALLOC_ASSERT(Props::MinSize <= size && size < Props::MaxSize, ASSERT_TEXT);
+ return (size-Props::MinSize)/Props::CacheStep;
+ }
+ static int getNumBins() { return numBins; }
+
+ void putList(ExtMemoryPool *extMemPool, LargeMemoryBlock *largeBlock);
+ LargeMemoryBlock *get(uintptr_t currTime, size_t size);
+
+ void rollbackCacheState(size_t size);
+ uintptr_t cleanupCacheIfNeeded(ExtMemoryPool *extMemPool, uintptr_t currTime);
+ bool regularCleanup(Backend *backend, uintptr_t currAge);
+ bool cleanAll(Backend *backend);
+ void reset() {
+ tooLargeLOC = 0;
+ for (int i = numBins-1; i >= 0; i--)
+ bin[i].init();
+ bitMask.reset();
}
+#if __TBB_MALLOC_LOCACHE_STAT
+ void reportStat(FILE *f);
+#endif
+#if __TBB_MALLOC_WHITEBOX_TEST
+ size_t getLOCSize() const;
+ size_t getUsedSize() const;
+#endif
+};
+
+class LargeObjectCache {
+ static const size_t minLargeSize = 8*1024,
+ maxLargeSize = 8*1024*1024,
+ maxHugeSize = 128*1024*1024;
public:
- bool put(ExtMemoryPool *extMemPool, LargeMemoryBlock *largeBlock);
- LargeMemoryBlock *get(ExtMemoryPool *extMemPool, size_t size);
-
- uintptr_t cleanupCacheIfNeed(ExtMemoryPool *extMemPool);
- bool regularCleanup(ExtMemoryPool *extMemPool, uintptr_t currAge);
- bool cleanAll(ExtMemoryPool *extMemPool) {
- bool released = false;
- for (int i = numLargeBlockBins-1; i >= 0; i--)
- released |= bin[i].cleanAll(extMemPool);
- return released;
+ // Difference between object sizes in large block bins
+ static const uint32_t largeBlockCacheStep = 8*1024,
+ hugeBlockCacheStep = 512*1024;
+private:
+ typedef LargeObjectCacheImpl< LargeObjectCacheProps<minLargeSize, maxLargeSize, largeBlockCacheStep, 2, 2, 16> > LargeCacheType;
+ typedef LargeObjectCacheImpl< LargeObjectCacheProps<maxLargeSize, maxHugeSize, hugeBlockCacheStep, 1, 1, 4> > HugeCacheType;
+
+ LargeCacheType largeCache;
+ HugeCacheType hugeCache;
+
+ /* logical time, incremented on each put/get operation
+ To prevent starvation between pools, keep separatly for each pool.
+ Overflow is OK, as we only want difference between
+ its current value and some recent.
+
+ Both malloc and free should increment logical time, as in
+ a different case multiple cached blocks would have same age,
+ and accuracy of predictors suffers.
+ */
+ uintptr_t cacheCurrTime;
+
+ static int sizeToIdx(size_t size);
+ bool doRegularCleanup(Backend *backend, uintptr_t currTime);
+public:
+ void put(ExtMemoryPool *extMemPool, LargeMemoryBlock *largeBlock);
+ void putList(ExtMemoryPool *extMemPool, LargeMemoryBlock *head);
+ LargeMemoryBlock *get(Backend *backend, size_t size);
+
+ void rollbackCacheState(size_t size);
+ void cleanupCacheIfNeeded(Backend *backend, uintptr_t currTime);
+ void cleanupCacheIfNeededOnRange(Backend *backend, uintptr_t range, uintptr_t currTime);
+ bool regularCleanup(Backend *backend) {
+ return doRegularCleanup(backend, FencedLoad((intptr_t&)cacheCurrTime));
}
+ bool cleanAll(Backend *backend);
void reset() {
- for (int i = numLargeBlockBins-1; i >= 0; i--)
- bin[i].init();
+ largeCache.reset();
+ hugeCache.reset();
}
+#if __TBB_MALLOC_LOCACHE_STAT
+ void reportStat(FILE *f);
+#endif
+#if __TBB_MALLOC_WHITEBOX_TEST
+ size_t getLOCSize() const;
+ size_t getUsedSize() const;
+#endif
+ static size_t alignToBin(size_t size) {
+ return size<maxLargeSize? alignUp(size, largeBlockCacheStep)
+ : alignUp(size, hugeBlockCacheStep);
+ }
+
+ uintptr_t getCurrTime();
+ uintptr_t getCurrTimeRange(uintptr_t range);
};
class BackRefIdx { // composite index to backreference array
@@ -229,7 +434,7 @@ struct LargeMemoryBlock : public BlockI {
*prev,
// 2-linked list of pool's large objects
// Used to destroy backrefs on pool destroy/reset (backrefs are global)
- // and for releasing all non-bined blocks.
+ // and for releasing all non-binned blocks.
*gPrev,
*gNext;
uintptr_t age; // age of block while in cache
@@ -245,32 +450,40 @@ class BackendSync {
intptr_t blocksInProcessing; // to another
intptr_t binsModifications; // incremented on every bin modification
public:
- void consume() { AtomicIncrement(blocksInProcessing); }
- void pureSignal() { AtomicIncrement(binsModifications); }
- void signal() {
+ void blockConsumed() { AtomicIncrement(blocksInProcessing); }
+ void binsModified() { AtomicIncrement(binsModifications); }
+ void blockReleased() {
+#if __TBB_MALLOC_BACKEND_STAT
MALLOC_ITT_SYNC_RELEASING(&blocksInProcessing);
+#endif
AtomicIncrement(binsModifications);
intptr_t prev = AtomicAdd(blocksInProcessing, -1);
MALLOC_ASSERT(prev > 0, ASSERT_TEXT);
suppress_unused_warning(prev);
}
intptr_t getNumOfMods() const { return FencedLoad(binsModifications); }
- // return true if need re-do the search
- bool waitTillSignalled(intptr_t startModifiedCnt) {
- intptr_t myBlocksNum = FencedLoad(blocksInProcessing);
- if (!myBlocksNum) {
- // no threads, but were bins modified since scanned?
- return startModifiedCnt != getNumOfMods();
- }
+ // return true if need re-do the blocks search
+ bool waitTillBlockReleased(intptr_t startModifiedCnt) {
+#if __TBB_MALLOC_BACKEND_STAT
MALLOC_ITT_SYNC_PREPARE(&blocksInProcessing);
- for (;;) {
+#endif
+ for (intptr_t myBlocksNum = FencedLoad(blocksInProcessing);
+ // no blocks in processing, stop waiting
+ myBlocksNum; ) {
SpinWaitWhileEq(blocksInProcessing, myBlocksNum);
- if (myBlocksNum > blocksInProcessing)
+ WhiteboxTestingYield();
+ intptr_t newBlocksNum = FencedLoad(blocksInProcessing);
+ // stop waiting iff blocks were removed from processing,
+ // if blocks were added, there is no reason to stop waiting
+ if (newBlocksNum < myBlocksNum)
break;
- myBlocksNum = FencedLoad(blocksInProcessing);
+ myBlocksNum = newBlocksNum;
}
+#if __TBB_MALLOC_BACKEND_STAT
MALLOC_ITT_SYNC_ACQUIRED(&blocksInProcessing);
- return true;
+#endif
+ // were bins modified since scanned?
+ return startModifiedCnt != getNumOfMods();
}
};
@@ -281,42 +494,6 @@ public:
void putBlock(FreeBlock *fBlock);
};
-template<unsigned NUM>
-class BitMask {
- static const int SZ = NUM/( CHAR_BIT*sizeof(uintptr_t)) + (NUM % sizeof(uintptr_t) ? 1:0);
- static const unsigned WORD_LEN = CHAR_BIT*sizeof(uintptr_t);
- uintptr_t mask[SZ];
-public:
- void set(size_t idx, bool val) {
- MALLOC_ASSERT(idx<NUM, ASSERT_TEXT);
-
- size_t i = idx / WORD_LEN;
- int pos = WORD_LEN - idx % WORD_LEN - 1;
- if (val)
- AtomicOr(&mask[i], 1ULL << pos);
- else
- AtomicAnd(&mask[i], ~(1ULL << pos));
- }
- int getMinTrue(unsigned startIdx) const {
- size_t idx = startIdx / WORD_LEN;
- uintptr_t curr;
- int pos;
-
- if (startIdx % WORD_LEN) { // clear bits before startIdx
- pos = WORD_LEN - startIdx % WORD_LEN;
- curr = mask[idx] & ((1ULL<<pos) - 1);
- } else
- curr = mask[idx];
-
- for (int i=idx; i<SZ; i++, curr=mask[i]) {
- if (-1 != (pos = BitScanRev(curr)))
- return (i+1)*WORD_LEN - pos - 1;
- }
- return -1;
- }
- void reset() { for (int i=0; i<SZ; i++) mask[i] = 0; }
-};
-
class MemExtendingSema {
intptr_t active;
public:
@@ -342,20 +519,27 @@ public:
};
class Backend {
+private:
+/* Blocks in range [minBinnedSize; getMaxBinnedSize()] are kept in bins,
+ one region can contains several blocks. Larger blocks are allocated directly
+ and one region always contains one block.
+*/
+ enum {
+ minBinnedSize = 8*1024UL,
+ /* If huge pages are available, maxBinned_HugePage used.
+ If not, maxBinned_SmallPage is the thresold.
+ TODO: use pool's granularity for upper bound setting.*/
+ maxBinned_SmallPage = 1024*1024UL,
+ // TODO: support other page sizes
+ maxBinned_HugePage = 4*1024*1024UL
+ };
public:
- static const unsigned minPower2 = 3+10;
- static const unsigned maxPower2 = 12+10;
- // 2^13 B, i.e. 8KB
- static const size_t minBinedSize = 1 << minPower2;
- // 2^22 B, i.e. 4MB
- static const size_t maxBinedSize = 1 << maxPower2;
-
static const int freeBinsNum =
- (maxBinedSize-minBinedSize)/largeBlockCacheStep + 1;
+ (maxBinned_HugePage-minBinnedSize)/LargeObjectCache::largeBlockCacheStep + 1;
- // if previous access missed per-thread 16KB blocks pool,
- // allocate numOfBlocksAllocOnMiss blocks in advance
- static const int numOfBlocksAllocOnMiss = 2;
+ // if previous access missed per-thread slabs pool,
+ // allocate numOfSlabAllocOnMiss blocks in advance
+ static const int numOfSlabAllocOnMiss = 2;
enum {
NO_BIN = -1,
@@ -371,7 +555,7 @@ public:
void removeBlock(FreeBlock *fBlock);
void reset() { head = tail = 0; }
-#if _TBBMALLOC_BACKEND_LOG
+#if __TBB_MALLOC_BACKEND_STAT
size_t countFreeBlocks();
#endif
bool empty() const { return !head; }
@@ -379,25 +563,32 @@ public:
// array of bins accomplished bitmask for fast finding of non-empty bins
class IndexedBins {
- BitMask<Backend::freeBinsNum> bitMask;
+ BitMaskMin<Backend::freeBinsNum> bitMask;
Bin freeBins[Backend::freeBinsNum];
public:
FreeBlock *getBlock(int binIdx, BackendSync *sync, size_t size,
- bool res16Kaligned, bool alignedBin, bool wait,
+ bool resSlabAligned, bool alignedBin, bool wait,
int *resLocked);
void lockRemoveBlock(int binIdx, FreeBlock *fBlock);
- void addBlock(int binIdx, FreeBlock *fBlock, size_t blockSz);
+ void addBlock(int binIdx, FreeBlock *fBlock, size_t blockSz, bool addToTail);
bool tryAddBlock(int binIdx, FreeBlock *fBlock, bool addToTail);
int getMinNonemptyBin(unsigned startBin) const {
int p = bitMask.getMinTrue(startBin);
return p == -1 ? Backend::freeBinsNum : p;
}
void verify();
-#if _TBBMALLOC_BACKEND_LOG
+#if __TBB_MALLOC_BACKEND_STAT
void reportStat(FILE *f);
#endif
void reset();
};
+ // number of OS/pool callback calls for more memory
+ class AskMemFromOSCounter {
+ intptr_t cnt;
+ public:
+ void OSasked() { AtomicIncrement(cnt); }
+ intptr_t get() const { return FencedLoad(cnt); }
+ };
private:
ExtMemoryPool *extMemPool;
@@ -422,13 +613,16 @@ private:
void startUseBlock(MemRegion *region, FreeBlock *fBlock);
void releaseRegion(MemRegion *region);
- FreeBlock *genericGetBlock(int num, size_t size, bool res16Kaligned);
+ bool askMemFromOS(size_t totalReqSize, intptr_t startModifiedCnt,
+ int *lockedBinsThreshold,
+ int numOfLockedBins, bool *largeBinsUpdated);
+ FreeBlock *genericGetBlock(int num, size_t size, bool resSlabAligned);
void genericPutBlock(FreeBlock *fBlock, size_t blockSz);
- FreeBlock *getFromAlignedSpace(int binIdx, int num, size_t size, bool res16Kaligned, bool wait, int *locked);
- FreeBlock *getFromBin(int binIdx, int num, size_t size, bool res16Kaligned, int *locked);
+ FreeBlock *getFromAlignedSpace(int binIdx, int num, size_t size, bool resSlabAligned, bool wait, int *locked);
+ FreeBlock *getFromBin(int binIdx, int num, size_t size, bool resSlabAligned, int *locked);
FreeBlock *doCoalesc(FreeBlock *fBlock, MemRegion **memRegion);
- void coalescAndPutList(FreeBlock *head, bool forceCoalescQDrop, bool doStat);
+ void coalescAndPutList(FreeBlock *head, bool forceCoalescQDrop);
bool scanCoalescQ(bool forceCoalescQDrop);
void coalescAndPut(FreeBlock *fBlock, size_t blockSz);
@@ -437,9 +631,10 @@ private:
void *getRawMem(size_t &size) const;
void freeRawMem(void *object, size_t size) const;
+ void putLargeBlock(LargeMemoryBlock *lmb);
public:
void verify();
-#if _TBBMALLOC_BACKEND_LOG
+#if __TBB_MALLOC_BACKEND_STAT
void reportStat(FILE *f);
#endif
bool bootstrap(ExtMemoryPool *extMemoryPool) {
@@ -449,14 +644,14 @@ public:
void reset();
bool destroy();
- BlockI *get16KBlock(int num) {
+ BlockI *getSlabBlock(int num) {
BlockI *b = (BlockI*)
- genericGetBlock(num, blockSize, /*res16Kaligned=*/true);
- MALLOC_ASSERT(isAligned(b, blockSize), ASSERT_TEXT);
+ genericGetBlock(num, slabSize, /*resSlabAligned=*/true);
+ MALLOC_ASSERT(isAligned(b, slabSize), ASSERT_TEXT);
return b;
}
- void put16KBlock(BlockI *block) {
- genericPutBlock((FreeBlock *)block, blockSize);
+ void putSlabBlock(BlockI *block) {
+ genericPutBlock((FreeBlock *)block, slabSize);
}
void *getBackRefSpace(size_t size, bool *rawMemUsed);
void putBackRefSpace(void *b, size_t size, bool rawMemUsed);
@@ -464,22 +659,33 @@ public:
bool inUserPool() const;
LargeMemoryBlock *getLargeBlock(size_t size);
- void putLargeBlock(LargeMemoryBlock *lmb);
+ void returnLargeObject(LargeMemoryBlock *lmb);
+
+ AskMemFromOSCounter askMemFromOSCounter;
private:
static int sizeToBin(size_t size) {
- if (size >= maxBinedSize)
+ if (size >= maxBinned_HugePage)
return HUGE_BIN;
- else if (size < minBinedSize)
+ else if (size < minBinnedSize)
return NO_BIN;
- int bin = (size - minBinedSize)/largeBlockCacheStep;
+ int bin = (size - minBinnedSize)/LargeObjectCache::largeBlockCacheStep;
MALLOC_ASSERT(bin < HUGE_BIN, "Invalid size.");
return bin;
}
+#if __TBB_MALLOC_BACKEND_STAT
+ static size_t binToSize(int bin) {
+ MALLOC_ASSERT(bin < HUGE_BIN, "Invalid bin.");
+
+ return bin*largeBlockCacheStep + minBinnedSize;
+ }
+#endif
static bool toAlignedBin(FreeBlock *block, size_t size) {
- return isAligned((uintptr_t)block+size, blockSize) && size >= blockSize;
+ return isAligned((char*)block+size, slabSize)
+ && size >= slabSize;
}
+ inline size_t getMaxBinnedSize();
IndexedBins freeLargeBins,
freeAlignedBins;
@@ -495,9 +701,76 @@ public:
void removeAll(Backend *backend);
};
+// An TBB allocator mode that can be controlled by user
+// via API/environment variable. Must be placed in zero-initialized memory.
+// External synchronization assumed.
+// TODO: TBB_VERSION support
+class AllocControlledMode {
+ intptr_t val;
+ bool setDone;
+public:
+ intptr_t get() const {
+ MALLOC_ASSERT(setDone, ASSERT_TEXT);
+ return val;
+ }
+ void set(intptr_t newVal) { // note set() can be called before init()
+ val = newVal;
+ setDone = true;
+ }
+ // envName - environment variable to get controlled mode
+ void initReadEnv(const char *envName, intptr_t defaultVal);
+};
+
+// init() and printStatus() is called only under global initialization lock.
+// Race is possible between registerAllocation() and registerReleasing(),
+// harm is that up to single huge page releasing is missed (because failure
+// to get huge page is registred only 1st time), that is negligible.
+// setMode is also can be called concurrently.
+// Object must reside in zero-initialized memory
+class HugePagesStatus {
+private:
+ AllocControlledMode requestedMode; // changed only by user
+ // to keep enabled and requestedMode consistent
+ MallocMutex setModeLock;
+ size_t pageSize;
+ intptr_t needActualStatusPrint;
+
+ static void doPrintStatus(bool state, const char *stateName);
+public:
+ // both variables are changed only inside HugePagesStatus
+ intptr_t enabled;
+ // Have we got huge pages at all? It's used when large hugepage-aligned
+ // region is releasing, to find can it release some huge pages or not.
+ intptr_t wasObserved;
+
+ size_t getSize() const {
+ MALLOC_ASSERT(pageSize, ASSERT_TEXT);
+ return pageSize;
+ }
+ void printStatus();
+ void registerAllocation(bool available);
+ void registerReleasing(size_t size);
+
+ void init(size_t hugePageSize) {
+ MALLOC_ASSERT(!hugePageSize || isPowerOfTwo(hugePageSize),
+ "Only memory pages of a power-of-two size are supported.");
+ MALLOC_ASSERT(!pageSize, "Huge page size can't be set twice.");
+ pageSize = hugePageSize;
+
+ MallocMutex::scoped_lock lock(setModeLock);
+ requestedMode.initReadEnv("TBB_MALLOC_USE_HUGE_PAGES", 0);
+ enabled = pageSize && requestedMode.get();
+ }
+ void setMode(intptr_t newVal) {
+ MallocMutex::scoped_lock lock(setModeLock);
+ requestedMode.set(newVal);
+ enabled = pageSize && newVal;
+ }
+};
+
+extern HugePagesStatus hugePages;
+
struct ExtMemoryPool {
- static size_t hugePageSize;
- static bool useHugePages;
Backend backend;
intptr_t poolId;
@@ -514,22 +787,18 @@ struct ExtMemoryPool {
LargeObjectCache loc;
- static bool tooLargeToBeBined(size_t sz) { return sz >= Backend::maxBinedSize; }
-
bool init(intptr_t poolId, rawAllocType rawAlloc, rawFreeType rawFree,
size_t granularity, bool keepAllMemory, bool fixedPool);
void initTLS();
- inline TLSData *getTLS();
- void clearTLS();
// i.e., not system default pool for scalable_malloc/scalable_free
bool userPool() const { return rawAlloc; }
// true if something has beed released
bool softCachesCleanup();
- bool release16KBCaches();
+ bool releaseTLCaches();
// TODO: to release all thread's pools, not just current thread
- bool hardCachesCleanup() { return loc.cleanAll(this) | release16KBCaches(); }
+ bool hardCachesCleanup();
void reset() {
lmbList.removeAll(&backend);
loc.reset();
@@ -547,8 +816,9 @@ struct ExtMemoryPool {
void delayRegionsReleasing(bool mode) { delayRegsReleasing = mode; }
inline bool regionsAreReleaseable() const;
- void *mallocLargeObject(size_t size, size_t alignment);
- void freeLargeObject(void *object);
+ LargeMemoryBlock *mallocLargeObject(size_t allocationSize);
+ void freeLargeObject(LargeMemoryBlock *lmb);
+ void freeLargeObjectList(LargeMemoryBlock *head);
};
inline bool Backend::inUserPool() const { return extMemPool->userPool(); }
diff --git a/src/tbbmalloc/tbbmalloc_internal_api.h b/src/tbbmalloc/tbbmalloc_internal_api.h
index aeb2599..c678449 100644
--- a/src/tbbmalloc/tbbmalloc_internal_api.h
+++ b/src/tbbmalloc/tbbmalloc_internal_api.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/tbbmalloc/win32-gcc-tbbmalloc-export.def b/src/tbbmalloc/win32-gcc-tbbmalloc-export.def
index 45e5589..bbf6d71 100644
--- a/src/tbbmalloc/win32-gcc-tbbmalloc-export.def
+++ b/src/tbbmalloc/win32-gcc-tbbmalloc-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -39,6 +39,7 @@ scalable_aligned_free;
safer_scalable_free;
safer_scalable_realloc;
scalable_msize;
+scalable_allocation_mode;
safer_scalable_msize;
safer_scalable_aligned_realloc;
/* memory pool stuff */
diff --git a/src/tbbmalloc/win32-tbbmalloc-export.def b/src/tbbmalloc/win32-tbbmalloc-export.def
index 48a92e3..43c97d7 100644
--- a/src/tbbmalloc/win32-tbbmalloc-export.def
+++ b/src/tbbmalloc/win32-tbbmalloc-export.def
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
@@ -38,6 +38,7 @@ scalable_aligned_free
safer_scalable_free
safer_scalable_realloc
scalable_msize
+scalable_allocation_mode
safer_scalable_msize
safer_scalable_aligned_realloc
?pool_create at rml@@YAPAVMemoryPool at 1@HPBUMemPoolPolicy at 1@@Z
diff --git a/src/tbbmalloc/win64-gcc-tbbmalloc-export.def b/src/tbbmalloc/win64-gcc-tbbmalloc-export.def
index 762828c..646f338 100644
--- a/src/tbbmalloc/win64-gcc-tbbmalloc-export.def
+++ b/src/tbbmalloc/win64-gcc-tbbmalloc-export.def
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -39,6 +39,7 @@ scalable_aligned_free;
safer_scalable_free;
safer_scalable_realloc;
scalable_msize;
+scalable_allocation_mode;
safer_scalable_msize;
safer_scalable_aligned_realloc;
/* memory pool stuff */
diff --git a/src/tbbmalloc/win64-tbbmalloc-export.def b/src/tbbmalloc/win64-tbbmalloc-export.def
index 5e07e82..7b18b03 100644
--- a/src/tbbmalloc/win64-tbbmalloc-export.def
+++ b/src/tbbmalloc/win64-tbbmalloc-export.def
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
@@ -38,6 +38,7 @@ scalable_aligned_free
safer_scalable_free
safer_scalable_realloc
scalable_msize
+scalable_allocation_mode
safer_scalable_msize
safer_scalable_aligned_realloc
; memory pool stuff
diff --git a/src/tbbmalloc/xbox360-tbbmalloc-export.def b/src/tbbmalloc/xbox360-tbbmalloc-export.def
index ae0bb71..4a41694 100644
--- a/src/tbbmalloc/xbox360-tbbmalloc-export.def
+++ b/src/tbbmalloc/xbox360-tbbmalloc-export.def
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
diff --git a/src/tbbproxy/tbbproxy-windows.asm b/src/tbbproxy/tbbproxy-windows.asm
index 6570207..734cc2e 100644
--- a/src/tbbproxy/tbbproxy-windows.asm
+++ b/src/tbbproxy/tbbproxy-windows.asm
@@ -1,4 +1,4 @@
-; Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+; Copyright 2005-2013 Intel Corporation. All Rights Reserved.
;
; This file is part of Threading Building Blocks.
;
diff --git a/src/tbbproxy/tbbproxy.cpp b/src/tbbproxy/tbbproxy.cpp
index d97b70b..49e4332 100644
--- a/src/tbbproxy/tbbproxy.cpp
+++ b/src/tbbproxy/tbbproxy.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,8 @@
the GNU General Public License.
*/
+#include "tbb/tbb_config.h"
+#if !__TBB_WIN8UI_SUPPORT
#define TBB_PREVIEW_RUNTIME_LOADER 1
#include "tbb/runtime_loader.h"
#include "tbb/tbb_stddef.h"
@@ -298,7 +300,7 @@ void cat_file( char const * dir, char const * file, char * buffer, size_t len )
} else {
/*
FormatMessage() returns Windows-style end-of-lines, "\r\n". When string is printed,
- printf() also replaces all the occurences of "\n" with "\r\n" (again!), so sequences
+ printf() also replaces all the occurrences of "\n" with "\r\n" (again!), so sequences
like "\r\r\r\n" appear in output. It is not too good. Stripping all "\r" normalizes
string and returns it to canonical form, so printf() will produce correct end-of-line
sequences.
@@ -612,5 +614,5 @@ int __tbb_internal_runtime_loader_stub() {
return tbb::interface6::internal::runtime_loader::error( tbb::interface6::internal::runtime_loader::stub_mode, tbb::runtime_loader::ec_no_lib, msg );
} // stub
-
+#endif // !__TBB_WIN8UI_SUPPORT //
// end of file //
diff --git a/src/test/harness.h b/src/test/harness.h
index e435b39..95b6bc6 100644
--- a/src/test/harness.h
+++ b/src/test/harness.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -37,6 +37,7 @@
#define tbb_tests_harness_H
#include "tbb/tbb_config.h"
+#include "harness_defs.h"
namespace Harness {
enum TestResult {
@@ -61,20 +62,6 @@ namespace Harness {
before including harness.h **/
int TestMain ();
-#if __INTEL_COMPILER
-#define __TBB_LAMBDAS_PRESENT ( _TBB_CPP0X && __INTEL_COMPILER > 1100 )
-#elif __GNUC__
-#define __TBB_LAMBDAS_PRESENT ( _TBB_CPP0X && __TBB_GCC_VERSION >= 40500 )
-#elif _MSC_VER
-#define __TBB_LAMBDAS_PRESENT ( _MSC_VER>=1600 )
-#endif
-
-#if defined(_MSC_VER) && _MSC_VER < 1400
- #define __TBB_EXCEPTION_TYPE_INFO_BROKEN 1
-#else
- #define __TBB_EXCEPTION_TYPE_INFO_BROKEN 0
-#endif
-
#if __SUNPRO_CC
#include <stdlib.h>
#include <string.h>
@@ -106,6 +93,9 @@ int TestMain ();
#undef HARNESS_NO_PARSE_COMMAND_LINE
#define HARNESS_NO_PARSE_COMMAND_LINE 1
#endif
+#if __TBB_WIN8UI_SUPPORT
+#include <thread>
+#endif
#include <process.h>
#else
#include <pthread.h>
@@ -118,6 +108,7 @@ int TestMain ();
#include "harness_report.h"
#if !HARNESS_NO_ASSERT
+
#include "harness_assert.h"
typedef void (*test_error_extra_t)(void);
@@ -127,6 +118,7 @@ void SetHarnessErrorProcessing( test_error_extra_t extra_call ) {
ErrorExtraCall = extra_call;
// TODO: add tbb::set_assertion_handler(ReportError);
}
+
//! Reports errors issued by failed assertions
void ReportError( const char* filename, int line, const char* expression, const char * message ) {
#if __TBB_ICL_11_1_CODE_GEN_BROKEN
@@ -140,6 +132,8 @@ void ReportError( const char* filename, int line, const char* expression, const
TerminateProcess(GetCurrentProcess(), 1);
#elif HARNESS_EXIT_ON_ASSERT
exit(1);
+#elif HARNESS_CONTINUE_ON_ASSERT
+ // continue testing
#else
abort();
#endif /* HARNESS_EXIT_ON_ASSERT */
@@ -148,13 +142,31 @@ void ReportError( const char* filename, int line, const char* expression, const
void ReportWarning( const char* filename, int line, const char* expression, const char * message ) {
REPORT("Warning: %s:%d, assertion %s: %s\n", filename, line, expression, message ? message : "failed" );
}
-#else
-//! Utility template function to prevent "unused" warnings by various compilers.
-template<typename T> void suppress_unused_warning( const T& ) {}
-#define ASSERT(p,msg) (suppress_unused_warning(p), (void)0)
-#define ASSERT_WARNING(p,msg) (suppress_unused_warning(p), (void)0)
-#endif /* HARNESS_NO_ASSERT */
+#else /* !HARNESS_NO_ASSERT */
+
+#define ASSERT(p,msg) (Harness::suppress_unused_warning(p), (void)0)
+#define ASSERT_WARNING(p,msg) (Harness::suppress_unused_warning(p), (void)0)
+
+#endif /* !HARNESS_NO_ASSERT */
+
+//TODO: unify with utility::internal::array_length from examples common utilities
+template<typename T, size_t N>
+inline size_t array_length(const T(&)[N])
+{
+ return N;
+}
+
+//TODO: remove this #if __TBB_INITIALIZER_LISTS_PRESENT
+//it looks like all other compilers except gcc issue warnings/errors then they see
+//declaration of zero sized array
+#if __TBB_INITIALIZER_LISTS_PRESENT
+template<typename T>
+inline size_t array_length(const T[0])
+{
+ return 0;
+}
+#endif //__TBB_INITIALIZER_LISTS_PRESENT
#if !HARNESS_NO_PARSE_COMMAND_LINE
@@ -280,11 +292,16 @@ int main(int argc, char* argv[]) {
MPI_Send (&size, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
}
#endif
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
int res = Harness::Unknown;
#pragma offload target(mic:-1) out(res)
{
+ #if __MIC__
res = TestMain ();
+ #else
+ ASSERT( 0, "Host execution in offload mode!" );
+ exit(1);
+ #endif
}
#else
int res = TestMain ();
@@ -335,7 +352,13 @@ public:
void start() {
#if _WIN32||_WIN64
unsigned thread_id;
+#if __TBB_WIN8UI_SUPPORT
+ std::thread* thread_tmp=new std::thread(thread_function, this);
+ thread_handle = thread_tmp->native_handle();
+ thread_id = 0;
+#else
thread_handle = (HANDLE)_beginthreadex( NULL, 0, thread_function, this, 0, &thread_id );
+#endif
ASSERT( thread_handle!=0, "NativeParallelFor: _beginthreadex failed" );
#else
#if __ICC==1100
@@ -348,7 +371,7 @@ public:
// Therefore we set the stack size explicitly (as for TBB worker threads).
// TODO: make a single definition of MByte used by all tests.
const size_t MByte = 1024*1024;
-#if __i386__||__i386
+#if __i386__||__i386||__arm__
const size_t stack_size = 1*MByte;
#elif __x86_64__
const size_t stack_size = 2*MByte;
@@ -372,7 +395,7 @@ public:
//! Wait for task to finish
void wait_to_finish() {
#if _WIN32||_WIN64
- DWORD status = WaitForSingleObject( thread_handle, INFINITE );
+ DWORD status = WaitForSingleObjectEx( thread_handle, INFINITE, FALSE );
ASSERT( status!=WAIT_FAILED, "WaitForSingleObject failed" );
CloseHandle( thread_handle );
#else
@@ -524,7 +547,15 @@ public:
#endif /* !HARNESS_NO_ASSERT */
#if _WIN32 || _WIN64
- void Sleep ( int ms ) { ::Sleep(ms); }
+ void Sleep ( int ms ) {
+#if !__TBB_WIN8UI_SUPPORT
+ ::Sleep(ms);
+#else
+ std::chrono::milliseconds sleep_time( ms );
+ std::this_thread::sleep_for( sleep_time );
+#endif
+
+ }
typedef DWORD tid_t;
tid_t CurrentTid () { return GetCurrentThreadId(); }
diff --git a/src/test/harness_allocator.h b/src/test/harness_allocator.h
index 43e124e..f36c139 100644
--- a/src/test/harness_allocator.h
+++ b/src/test/harness_allocator.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -36,6 +36,7 @@
#elif _WIN32
#include "tbb/machine/windows_api.h"
#endif /* OS specific */
+#include <memory>
#include <new>
#if !TBB_USE_EXCEPTIONS && _MSC_VER
diff --git a/src/test/harness_assert.h b/src/test/harness_assert.h
index 8b0e822..6868d9c 100644
--- a/src/test/harness_assert.h
+++ b/src/test/harness_assert.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/harness_bad_expr.h b/src/test/harness_bad_expr.h
index c8cc7aa..f29109e 100644
--- a/src/test/harness_bad_expr.h
+++ b/src/test/harness_bad_expr.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/harness_barrier.h b/src/test/harness_barrier.h
index 3923df7..148959c 100644
--- a/src/test/harness_barrier.h
+++ b/src/test/harness_barrier.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -27,12 +27,44 @@
*/
#include "tbb/atomic.h"
+#include "tbb/tick_count.h"
#ifndef harness_barrier_H
#define harness_barrier_H
namespace Harness {
+//! Spin WHILE the value of the variable is equal to a given value
+/** T and U should be comparable types. */
+class TimedWaitWhileEq {
+ //! Assignment not allowed
+ void operator=( const TimedWaitWhileEq& );
+ double &my_limit;
+public:
+ TimedWaitWhileEq(double &n_seconds) : my_limit(n_seconds) {}
+ TimedWaitWhileEq(const TimedWaitWhileEq &src) : my_limit(src.my_limit) {}
+ template<typename T, typename U>
+ void operator()( const volatile T& location, U value ) const {
+ tbb::tick_count start = tbb::tick_count::now();
+ double time_passed;
+ do {
+ time_passed = (tbb::tick_count::now()-start).seconds();
+ if( time_passed < 0.0001 ) __TBB_Pause(10); else __TBB_Yield();
+ } while( time_passed < my_limit && location == value);
+ my_limit -= time_passed;
+ }
+};
+//! Spin WHILE the value of the variable is equal to a given value
+/** T and U should be comparable types. */
+class WaitWhileEq {
+ //! Assignment not allowed
+ void operator=( const WaitWhileEq& );
+public:
+ template<typename T, typename U>
+ void operator()( const volatile T& location, U value ) const {
+ tbb::internal::spin_wait_while_eq(location, value);
+ }
+};
class SpinBarrier
{
unsigned numThreads;
@@ -41,6 +73,8 @@ class SpinBarrier
struct DummyCallback {
void operator() () const {}
+ template<typename T, typename U>
+ void operator()( const T&, U) const {}
};
SpinBarrier( const SpinBarrier& ); // no copy ctor
@@ -55,15 +89,15 @@ public:
};
// onOpenBarrierCallback is called by last thread arrived on a barrier
- template<typename Callback>
- bool wait(const Callback &onOpenBarrierCallback)
+ template<typename WaitEq, typename Callback>
+ bool custom_wait(const WaitEq &onWaitCallback, const Callback &onOpenBarrierCallback)
{ // return true if last thread
unsigned myEpoch = epoch;
int threadsLeft = numThreads - numThreadsFinished.fetch_and_increment() - 1;
ASSERT(threadsLeft>=0, "Broken barrier");
if (threadsLeft > 0) {
/* not the last threading reaching barrier, wait until epoch changes & return 0 */
- tbb::internal::spin_wait_while_eq(epoch, myEpoch);
+ onWaitCallback(epoch, myEpoch);
return false;
}
/* No more threads left to enter, so I'm the last one reaching this epoch;
@@ -73,10 +107,23 @@ public:
epoch = myEpoch+1; /* wakes up threads waiting to exit this epoch */
return true;
}
- bool wait()
- {
+ bool timed_wait(double n_seconds, const char *msg="Time is out while waiting on a barrier") {
+ bool is_last = custom_wait(TimedWaitWhileEq(n_seconds), DummyCallback());
+ ASSERT( n_seconds >= 0, msg); // TODO: refactor to avoid passing msg here and rising assertion
+ return is_last;
+ }
+ //! onOpenBarrierCallback is called by last thread arrived on a barrier
+ template<typename Callback>
+ bool wait(const Callback &onOpenBarrierCallback) {
+ return custom_wait(WaitWhileEq(), onOpenBarrierCallback);
+ }
+ bool wait(){
return wait(DummyCallback());
}
+ //! signal to the barrier, rather a semaphore functionality
+ bool signal_nowait() {
+ return custom_wait(DummyCallback(),DummyCallback());
+ }
};
}
diff --git a/src/test/harness_checktype.h b/src/test/harness_checktype.h
new file mode 100644
index 0000000..5c0f767
--- /dev/null
+++ b/src/test/harness_checktype.h
@@ -0,0 +1,106 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#ifndef tbb_tests_harness_checktype_H
+#define tbb_tests_harness_checktype_H
+
+// type that checks construction and destruction.
+
+#ifndef __HARNESS_CHECKTYPE_DEFAULT_CTOR
+ #define __HARNESS_CHECKTYPE_DEFAULT_CTOR 1
+#endif
+
+template<class Counter>
+class check_type : Harness::NoAfterlife {
+ Counter id;
+ bool am_ready;
+public:
+ static tbb::atomic<int> check_type_counter;
+ // if only non-default constructors are desired, set __HARNESS_CHECKTYPE_NODEFAULT_CTOR
+ check_type(Counter _n
+#if __HARNESS_CHECKTYPE_DEFAULT_CTOR
+ = 0
+#endif
+ ) : id(_n), am_ready(false) {
+ ++check_type_counter;
+ }
+
+ check_type(const check_type& other) : Harness::NoAfterlife(other) {
+ other.AssertLive();
+ AssertLive();
+ id = other.id;
+ am_ready = other.am_ready;
+ ++check_type_counter;
+ }
+
+ operator int() const { return (int)my_id(); }
+
+ ~check_type() {
+ AssertLive();
+ --check_type_counter;
+ ASSERT(check_type_counter >= 0, "too many destructions");
+ }
+
+ check_type &operator=(const check_type &other) {
+ other.AssertLive();
+ AssertLive();
+ id = other.id;
+ am_ready = other.am_ready;
+ return *this;
+ }
+
+ Counter my_id() const { AssertLive(); return id; }
+ bool is_ready() { AssertLive(); return am_ready; }
+ void function() {
+ AssertLive();
+ if( id == (Counter)0 ) {
+ id = (Counter)1;
+ am_ready = true;
+ }
+ }
+
+};
+
+template<class Counter>
+tbb::atomic<int> check_type<Counter>::check_type_counter;
+
+// provide a class that for a check_type will initialize the counter on creation, and on
+// destruction will check that the constructions and destructions of check_type match.
+template<class MyClass>
+struct Check {
+ Check() {} // creation does nothing
+ ~Check() {} // destruction checks nothing
+};
+
+template<class Counttype>
+struct Check<check_type< Counttype > > {
+ Check() { check_type<Counttype>::check_type_counter = 0; }
+ ~Check() { ASSERT(check_type<Counttype>::check_type_counter == 0, "check_type constructions and destructions don't match"); }
+};
+
+#endif // tbb_tests_harness_checktype_H
diff --git a/src/test/harness_concurrency_tracker.h b/src/test/harness_concurrency_tracker.h
index a0c562f..f1c6ee0 100644
--- a/src/test/harness_concurrency_tracker.h
+++ b/src/test/harness_concurrency_tracker.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/harness_cpu.h b/src/test/harness_cpu.h
index 1e58c38..20b6dbc 100644
--- a/src/test/harness_cpu.h
+++ b/src/test/harness_cpu.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -42,7 +42,7 @@
//! Return time (in seconds) spent by the current process in user mode.
/* Returns 0 if not implemented on platform. */
static double GetCPUUserTime() {
-#if _XBOX
+#if _XBOX || __TBB_WIN8UI_SUPPORT
return 0;
#elif _WIN32
FILETIME my_times[4];
diff --git a/src/test/harness_defs.h b/src/test/harness_defs.h
index 9a13a68..b9b2965 100644
--- a/src/test/harness_defs.h
+++ b/src/test/harness_defs.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,6 +30,9 @@
#define __TBB_harness_defs_H
#include "tbb/tbb_config.h"
+#if __FreeBSD__
+#include <sys/param.h> // for __FreeBSD_version
+#endif
#if __TBB_TEST_PIC && !__PIC__
#define __TBB_TEST_SKIP_PIC_MODE 1
@@ -37,14 +40,103 @@
#define __TBB_TEST_SKIP_PIC_MODE 0
#endif
-#if __TBB_TEST_GCC_BUILTINS && !__TBB_GCC_BUILTIN_ATOMICS_PRESENT
-#define __TBB_TEST_SKIP_BUILTINS_MODE 1
+// no need to test gcc builtins mode on ICC
+#define __TBB_TEST_SKIP_GCC_BUILTINS_MODE ( __TBB_TEST_BUILTINS && (!__TBB_GCC_BUILTIN_ATOMICS_PRESENT || __INTEL_COMPILER) )
+
+#define __TBB_TEST_SKIP_ICC_BUILTINS_MODE ( __TBB_TEST_BUILTINS && !__TBB_ICC_BUILTIN_ATOMICS_PRESENT )
+
+#ifndef TBB_USE_GCC_BUILTINS
+ //Force TBB to use GCC intrinsics port, but not on ICC, as no need
+ #define TBB_USE_GCC_BUILTINS ( __TBB_TEST_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT && !__INTEL_COMPILER )
+#endif
+
+#ifndef TBB_USE_ICC_BUILTINS
+ //Force TBB to use ICC c++11 style intrinsics port
+ #define TBB_USE_ICC_BUILTINS ( __TBB_TEST_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT )
+#endif
+
+#if (_WIN32 && !__TBB_WIN8UI_SUPPORT) || (__linux__ && !__ANDROID__) || __FreeBSD_version >= 701000
+#define __TBB_TEST_SKIP_AFFINITY 0
#else
-#define __TBB_TEST_SKIP_BUILTINS_MODE 0
+#define __TBB_TEST_SKIP_AFFINITY 1
#endif
-#ifndef TBB_USE_GCC_BUILTINS
- #define TBB_USE_GCC_BUILTINS __TBB_TEST_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT
+#if __INTEL_COMPILER
+ #define __TBB_LAMBDAS_PRESENT ( _TBB_CPP0X && __INTEL_COMPILER > 1100 )
+#elif __clang__
+ #define __TBB_LAMBDAS_PRESENT ( _TBB_CPP0X && __has_feature(cxx_lambdas))
+#elif __GNUC__
+ #define __TBB_LAMBDAS_PRESENT ( _TBB_CPP0X && __TBB_GCC_VERSION >= 40500 )
+#elif _MSC_VER
+ #define __TBB_LAMBDAS_PRESENT ( _MSC_VER >= 1600 )
+#endif
+
+#if __GNUC__ && __ANDROID__
+ /** Android GCC does not support _thread keyword **/
+ #define __TBB_THREAD_LOCAL_VARIABLES_PRESENT 0
+#else
+ #define __TBB_THREAD_LOCAL_VARIABLES_PRESENT 1
+#endif
+
+#if __ANDROID__
+ /** Android Bionic library does not support posix_memalign() **/
+ #define __TBB_POSIX_MEMALIGN_PRESENT 0
+ /** Android Bionic library does not support pvalloc() **/
+ #define __TBB_PVALLOC_PRESENT 0
+#else
+ #define __TBB_POSIX_MEMALIGN_PRESENT 1
+ #define __TBB_PVALLOC_PRESENT 1
#endif
+#if __GNUC__ && __ANDROID__
+ #define __TBB_EXCEPTION_TYPE_INFO_BROKEN ( __TBB_GCC_VERSION < 40600 )
+#elif _MSC_VER
+ #define __TBB_EXCEPTION_TYPE_INFO_BROKEN ( _MSC_VER < 1400 )
+#elif __clang__ //TODO: recheck on different clang versions
+ #define __TBB_EXCEPTION_TYPE_INFO_BROKEN 1
+#else
+ #define __TBB_EXCEPTION_TYPE_INFO_BROKEN 0
+#endif
+
+//! a function ptr cannot be converted to const T& template argument without explicit cast
+#define __TBB_FUNC_PTR_AS_TEMPL_PARAM_BROKEN ( ((__linux__ || __APPLE__) && __INTEL_COMPILER && __INTEL_COMPILER < 1100) || __SUNPRO_CC )
+#define __TBB_UNQUALIFIED_CALL_OF_DTOR_BROKEN (__GNUC__==3 && __GNUC_MINOR__<=3)
+
+#define __TBB_CAS_8_CODEGEN_BROKEN (__TBB_x86_32 && __PIC__ && __TBB_GCC_VERSION == 40102 && !__INTEL_COMPILER)
+
+#if __TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN
+ #define _EXCEPTION_PTR_H /* prevents exception_ptr.h inclusion */
+ #define _GLIBCXX_NESTED_EXCEPTION_H /* prevents nested_exception.h inclusion */
+#endif
+
+// The tuple-based tests with more inputs take a long time to compile. If changes
+// are made to the tuple implementation or any switch that controls it, or if testing
+// with a new platform implementation of std::tuple, the test should be compiled with
+// MAX_TUPLE_TEST_SIZE >= 10 (or the largest number of elements supported) to ensure
+// all tuple sizes are tested. Expect a very long compile time.
+#ifndef MAX_TUPLE_TEST_SIZE
+ #if TBB_USE_DEBUG
+ #define MAX_TUPLE_TEST_SIZE 3
+ #else
+ #define MAX_TUPLE_TEST_SIZE 5
+ #endif
+#else
+ #if _MSC_VER
+// test sizes <= 8 don't get "decorated name length exceeded" errors. (disable : 4503)
+ #if MAX_TUPLE_TEST_SIZE > 8
+ #undef MAX_TUPLE_TEST_SIZE
+ #define MAX_TUPLE_TEST_SIZE 8
+ #endif
+ #endif
+ #if MAX_TUPLE_TEST_SIZE > __TBB_VARIADIC_MAX
+ #undef MAX_TUPLE_TEST_SIZE
+ #define MAX_TUPLE_TEST_SIZE __TBB_VARIADIC_MAX
+ #endif
+#endif
+
+namespace Harness {
+ //! Utility template function to prevent "unused" warnings by various compilers.
+ template<typename T> void suppress_unused_warning( const T& ) {}
+}
+
#endif /* __TBB_harness_defs_H */
diff --git a/src/test/harness_dynamic_libs.h b/src/test/harness_dynamic_libs.h
index 2b26f85..3077836 100644
--- a/src/test/harness_dynamic_libs.h
+++ b/src/test/harness_dynamic_libs.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -34,6 +34,35 @@
namespace Harness {
+#if TBB_USE_DEBUG
+#define SUFFIX1 "_debug"
+#define SUFFIX2
+#else
+#define SUFFIX1
+#define SUFFIX2 "_debug"
+#endif /* TBB_USE_DEBUG */
+
+#if _WIN32||_WIN64
+#define PREFIX
+#define EXT ".dll"
+#else
+#define PREFIX "lib"
+#if __APPLE__
+#define EXT ".dylib"
+// Android SDK build system does not support .so file name versioning
+#elif __FreeBSD__ || __NetBSD__ || __sun || _AIX || __ANDROID__
+#define EXT ".so"
+#elif __linux__ // Order of these elif's matters!
+#define EXT __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION)
+#else
+#error Unknown OS
+#endif
+#endif
+
+// Form the names of the TBB memory allocator binaries.
+#define MALLOCLIB_NAME1 PREFIX "tbbmalloc" SUFFIX1 EXT
+#define MALLOCLIB_NAME2 PREFIX "tbbmalloc" SUFFIX2 EXT
+
#if _WIN32 || _WIN64
typedef HMODULE LIBRARY_HANDLE;
#else
@@ -51,7 +80,13 @@ typedef void *LIBRARY_HANDLE;
LIBRARY_HANDLE OpenLibrary(const char *name)
{
#if _WIN32 || _WIN64
+#if __TBB_WIN8UI_SUPPORT
+ TCHAR wlibrary[MAX_PATH];
+ if ( MultiByteToWideChar(CP_UTF8, 0, name, -1, wlibrary, MAX_PATH) == 0 ) return false;
+ return :: LoadPackagedLibrary( wlibrary, 0 );
+#else
return ::LoadLibrary(name);
+#endif
#else
return dlopen(name, RTLD_NOW|RTLD_GLOBAL);
#endif
diff --git a/src/test/harness_eh.h b/src/test/harness_eh.h
index 7c93435..9b3c46b 100644
--- a/src/test/harness_eh.h
+++ b/src/test/harness_eh.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,35 +29,91 @@
#include <typeinfo>
#include "tbb/tbb_exception.h"
#include "tbb/atomic.h"
+#if USE_TASK_SCHEDULER_OBSERVER
+#include "tbb/task_scheduler_observer.h"
+#endif
#include "harness.h"
#include "harness_concurrency_tracker.h"
int g_NumThreads = 0;
Harness::tid_t g_Master = 0;
+const char * g_Orig_Wakeup_Msg = "Missed wakeup or machine is overloaded?";
+const char * g_Wakeup_Msg = g_Orig_Wakeup_Msg;
tbb::atomic<intptr_t> g_CurExecuted,
- g_ExecutedAtCatch,
- g_ExceptionsThrown;
+ g_ExecutedAtLastCatch,
+ g_ExecutedAtFirstCatch,
+ g_ExceptionsThrown,
+ g_MasterExecutedThrow, // number of times master entered exception code
+ g_NonMasterExecutedThrow, // number of times nonmaster entered exception code
+ g_PipelinesStarted;
volatile bool g_ExceptionCaught = false,
g_UnknownException = false;
+#if USE_TASK_SCHEDULER_OBSERVER
+tbb::atomic<intptr_t> g_ActualMaxThreads;
+tbb::atomic<intptr_t> g_ActualCurrentThreads;
+#endif
+
volatile bool g_ThrowException = true,
- g_Flog = false;
+ // g_Flog is true for nested construct tests with catches (exceptions are not allowed to
+ // propagate to the tbb construct itself.)
+ g_Flog = false,
+ g_MasterExecuted = false,
+ g_NonMasterExecuted = false;
bool g_ExceptionInMaster = false;
bool g_SolitaryException = false;
+bool g_NestedPipelines = false;
//! Number of exceptions propagated into the user code (i.e. intercepted by the tests)
-tbb::atomic<intptr_t> g_Exceptions;
+tbb::atomic<intptr_t> g_NumExceptionsCaught;
+
+//-----------------------------------------------------------
+
+#if USE_TASK_SCHEDULER_OBSERVER
+class eh_test_observer : public tbb::task_scheduler_observer {
+public:
+ /*override*/
+ void on_scheduler_entry(bool is_worker) {
+ if(is_worker) { // we've already counted the master
+ size_t p = ++g_ActualCurrentThreads;
+ size_t q = g_ActualMaxThreads;
+ while(q < p) {
+ q = g_ActualMaxThreads.compare_and_swap(p,q);
+ }
+ }
+ else {
+ // size_t q = g_ActualMaxThreads;
+ }
+ }
+ /*override*/
+ void on_scheduler_exit(bool is_worker) {
+ if(is_worker) {
+ --g_ActualCurrentThreads;
+ }
+ }
+};
+#endif
+//-----------------------------------------------------------
inline void ResetEhGlobals ( bool throwException = true, bool flog = false ) {
Harness::ConcurrencyTracker::Reset();
- g_CurExecuted = g_ExecutedAtCatch = 0;
+ g_CurExecuted = g_ExecutedAtLastCatch = g_ExecutedAtFirstCatch = 0;
g_ExceptionCaught = false;
g_UnknownException = false;
+ g_NestedPipelines = false;
g_ThrowException = throwException;
+ g_MasterExecutedThrow = 0;
+ g_NonMasterExecutedThrow = 0;
g_Flog = flog;
- g_ExceptionsThrown = g_Exceptions = 0;
+ g_MasterExecuted = false;
+ g_NonMasterExecuted = false;
+#if USE_TASK_SCHEDULER_OBSERVER
+ g_ActualMaxThreads = 1; // count master
+ g_ActualCurrentThreads = 1; // count master
+#endif
+ g_ExceptionsThrown = g_NumExceptionsCaught = g_PipelinesStarted = 0;
}
#if TBB_USE_EXCEPTIONS
@@ -94,27 +150,57 @@ static void ThrowTestException () {
#else /* !HARNESS_EH_SIMPLE_MODE */
static void ThrowTestException ( intptr_t threshold ) {
- if ( !g_ThrowException || (!g_Flog && (g_ExceptionInMaster ^ (Harness::CurrentTid() == g_Master))) )
+ bool inMaster = (Harness::CurrentTid() == g_Master);
+ if ( !g_ThrowException || // if we're not supposed to throw
+ (!g_Flog && // if we're not catching throw in bodies and
+ (g_ExceptionInMaster ^ inMaster)) ) { // we're the master and not expected to throw
+ // or are the master and the master is not the one to throw (??)
return;
+ }
while ( Existed() < threshold )
__TBB_Yield();
if ( !g_SolitaryException ) {
++g_ExceptionsThrown;
+ if(inMaster) ++g_MasterExecutedThrow; else ++g_NonMasterExecutedThrow;
throw test_exception(EXCEPTION_DESCR);
}
- if ( g_ExceptionsThrown.compare_and_swap(1, 0) == 0 )
- throw solitary_test_exception(EXCEPTION_DESCR);
+ // g_SolitaryException == true
+ if(g_NestedPipelines) {
+ // only throw exception if we have started at least two inner pipelines
+ // else return
+ if(g_PipelinesStarted >= 3) {
+ if ( g_ExceptionsThrown.compare_and_swap(1, 0) == 0 ) {
+ if(inMaster) ++g_MasterExecutedThrow; else ++g_NonMasterExecutedThrow;
+ throw solitary_test_exception(EXCEPTION_DESCR);
+ }
+ }
+ }
+ else {
+ if ( g_ExceptionsThrown.compare_and_swap(1, 0) == 0 ) {
+ if(inMaster) ++g_MasterExecutedThrow; else ++g_NonMasterExecutedThrow;
+ throw solitary_test_exception(EXCEPTION_DESCR);
+ }
+ }
}
#endif /* !HARNESS_EH_SIMPLE_MODE */
+#define UPDATE_COUNTS() \
+ { \
+ ++g_CurExecuted; \
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true; \
+ else g_NonMasterExecuted = true; \
+ if( tbb::task::self().is_cancelled() ) ++g_TGCCancelled; \
+ }
+
#define CATCH() \
} catch ( PropagatedException& e ) { \
- g_ExecutedAtCatch = g_CurExecuted; \
+ g_ExecutedAtFirstCatch.compare_and_swap(g_CurExecuted,0); \
+ g_ExecutedAtLastCatch = g_CurExecuted; \
ASSERT( e.what(), "Empty what() string" ); \
ASSERT (__TBB_EXCEPTION_TYPE_INFO_BROKEN || strcmp(EXCEPTION_NAME(e), (g_SolitaryException ? typeid(solitary_test_exception) : typeid(test_exception)).name() ) == 0, "Unexpected original exception name"); \
ASSERT (__TBB_EXCEPTION_TYPE_INFO_BROKEN || strcmp(e.what(), EXCEPTION_DESCR) == 0, "Unexpected original exception info"); \
- g_ExceptionCaught = exceptionCaught = true; \
- ++g_Exceptions; \
+ g_ExceptionCaught = l_ExceptionCaughtAtCurrentLevel = true; \
+ ++g_NumExceptionsCaught; \
} catch ( tbb::tbb_exception& e ) { \
REPORT("Unexpected %s\n", e.name()); \
ASSERT (g_UnknownException && !g_UnknownException, "Unexpected tbb::tbb_exception" ); \
@@ -122,17 +208,19 @@ static void ThrowTestException ( intptr_t threshold ) {
REPORT("Unexpected %s\n", typeid(e).name()); \
ASSERT (g_UnknownException && !g_UnknownException, "Unexpected std::exception" ); \
} catch ( ... ) { \
- g_ExceptionCaught = exceptionCaught = true; \
+ g_ExceptionCaught = l_ExceptionCaughtAtCurrentLevel = true; \
g_UnknownException = unknownException = true; \
} \
if ( !g_SolitaryException ) \
REMARK_ONCE ("Multiple exceptions mode: %d throws", (intptr_t)g_ExceptionsThrown);
#define ASSERT_EXCEPTION() \
- ASSERT (g_ExceptionsThrown ? g_ExceptionCaught : true, "throw without catch"); \
- ASSERT (!g_ExceptionsThrown ? !g_ExceptionCaught : true, "catch without throw"); \
- ASSERT (g_ExceptionCaught, "no exception occurred"); \
- ASSERT (__TBB_EXCEPTION_TYPE_INFO_BROKEN || !g_UnknownException, "unknown exception was caught")
+ { \
+ ASSERT (!g_ExceptionsThrown || g_ExceptionCaught, "throw without catch"); \
+ ASSERT (!g_ExceptionCaught || g_ExceptionsThrown, "catch without throw"); \
+ ASSERT (g_ExceptionCaught || (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow), "no exception occurred"); \
+ ASSERT (__TBB_EXCEPTION_TYPE_INFO_BROKEN || !g_UnknownException, "unknown exception was caught"); \
+ }
#define CATCH_AND_ASSERT() \
CATCH() \
@@ -145,13 +233,13 @@ inline void ThrowTestException ( intptr_t ) {}
#endif /* !TBB_USE_EXCEPTIONS */
#define TRY() \
- bool exceptionCaught = false, unknownException = false; \
+ bool l_ExceptionCaughtAtCurrentLevel = false, unknownException = false; \
__TBB_TRY {
-// "exceptionCaught || unknownException" is used only to "touch" otherwise unused local variables
+// "l_ExceptionCaughtAtCurrentLevel || unknownException" is used only to "touch" otherwise unused local variables
#define CATCH_AND_FAIL() } __TBB_CATCH(...) { \
- ASSERT (false, "Canceling tasks must not cause any exceptions"); \
- (void)(exceptionCaught && unknownException); \
+ ASSERT (false, "Cancelling tasks must not cause any exceptions"); \
+ (void)(l_ExceptionCaughtAtCurrentLevel && unknownException); \
}
const int c_Timeout = 1000000;
@@ -163,7 +251,10 @@ void WaitUntilConcurrencyPeaks ( int expected_peak ) {
retry:
while ( ++n < c_Timeout && (int)Harness::ConcurrencyTracker::PeakParallelism() < expected_peak )
__TBB_Yield();
- ASSERT_WARNING( n < c_Timeout, "Missed wakeup or machine is overloaded?" );
+#if USE_TASK_SCHEDULER_OBSERVER
+ ASSERT_WARNING( g_NumThreads == g_ActualMaxThreads, "Library did not provide sufficient threads");
+#endif
+ ASSERT_WARNING(n < c_Timeout,g_Wakeup_Msg);
// Workaround in case a missed wakeup takes place
if ( n == c_Timeout ) {
tbb::task &r = *new( tbb::task::allocate_root() ) tbb::empty_task();
@@ -194,7 +285,7 @@ class CancellatorTask : public tbb::task {
while ( g_CurExecuted < m_cancellationThreshold )
__TBB_Yield();
m_groupToCancel.cancel_group_execution();
- g_ExecutedAtCatch = g_CurExecuted;
+ g_ExecutedAtLastCatch = g_CurExecuted;
return NULL;
}
public:
@@ -212,6 +303,7 @@ public:
do {
__TBB_Yield();
} while( !s_Ready && ++n < limit );
+ // should yield once, then continue if Cancellator is ready.
ASSERT( s_Ready || n == limit, NULL );
return s_Ready;
}
diff --git a/src/test/harness_graph.h b/src/test/harness_graph.h
index da8bf8d..5c71626 100644
--- a/src/test/harness_graph.h
+++ b/src/test/harness_graph.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -38,6 +38,7 @@
#include "tbb/null_rw_mutex.h"
#include "tbb/atomic.h"
#include "tbb/concurrent_unordered_map.h"
+#include "tbb/task.h"
// Needed conversion to and from continue_msg, but didn't want to add
// conversion operators to the class, since we don't want it in general,
@@ -68,7 +69,7 @@ template<size_t N>
struct mof_helper {
template<typename InputType, typename ports_type>
static inline void output_converted_value(const InputType &i, ports_type &p) {
- (void)std::get<N-1>(p).try_put(convertor<InputType,typename std::tuple_element<N-1,ports_type>::type::output_type>::convert_value(i));
+ (void)tbb::flow::get<N-1>(p).try_put(convertor<InputType,typename tbb::flow::tuple_element<N-1,ports_type>::type::output_type>::convert_value(i));
output_converted_value<N-1>(i, p);
}
};
@@ -78,7 +79,7 @@ struct mof_helper<1> {
template<typename InputType, typename ports_type>
static inline void output_converted_value(const InputType &i, ports_type &p) {
// just emit a default-constructed object
- (void)std::get<0>(p).try_put(convertor<InputType,typename std::tuple_element<0,ports_type>::type::output_type>::convert_value(i));
+ (void)tbb::flow::get<0>(p).try_put(convertor<InputType,typename tbb::flow::tuple_element<0,ports_type>::type::output_type>::convert_value(i));
}
};
@@ -112,29 +113,30 @@ struct harness_graph_default_functor< tbb::flow::continue_msg, tbb::flow::contin
template<typename InputType, typename OutputSet>
struct harness_graph_default_multifunction_functor {
- static const int N = std::tuple_size<OutputSet>::value;
+ static const int N = tbb::flow::tuple_size<OutputSet>::value;
typedef typename tbb::flow::multifunction_node<InputType,OutputSet>::output_ports_type ports_type;
static void construct(const InputType &i, ports_type &p) {
mof_helper<N>::output_converted_value(i, p);
}
};
-static tbb::atomic<size_t> current_executors;
-
//! An executor that accepts InputType and generates OutputType
-template< typename InputType, typename OutputType, typename M=tbb::null_rw_mutex >
+template< typename InputType, typename OutputType >
struct harness_graph_executor {
typedef OutputType (*function_ptr_type)( InputType v );
- static M mutex;
+ template<typename RW>
+ struct mutex_holder { static RW mutex; };
+
static function_ptr_type fptr;
static tbb::atomic<size_t> execute_count;
+ static tbb::atomic<size_t> current_executors;
static size_t max_executors;
static inline OutputType func( InputType v ) {
- typename M::scoped_lock l( mutex );
- size_t c = current_executors.fetch_and_increment();
+ size_t c; // Declaration separate from initialization to avoid ICC internal error on IA-64
+ c = current_executors.fetch_and_increment();
ASSERT( max_executors == 0 || c <= max_executors, NULL );
++execute_count;
OutputType v2 = (*fptr)(v);
@@ -142,91 +144,113 @@ struct harness_graph_executor {
return v2;
}
- struct functor {
+ template< typename RW >
+ static inline OutputType tfunc( InputType v ) {
+ // Invocations allowed to be concurrent, the lock is acquired in shared ("read") mode.
+ // A test can take it exclusively, thus creating a barrier for invocations.
+ typename RW::scoped_lock l( mutex_holder<RW>::mutex, /*write=*/false );
+ return func(v);
+ }
+
+ template< typename RW >
+ struct tfunctor {
tbb::atomic<size_t> my_execute_count;
- functor() { my_execute_count = 0; }
- functor( const functor &f ) { my_execute_count = f.my_execute_count; }
+ tfunctor() { my_execute_count = 0; }
+ tfunctor( const tfunctor &f ) { my_execute_count = f.my_execute_count; }
OutputType operator()( InputType i ) {
- typename M::scoped_lock l( harness_graph_executor::mutex );
- size_t c = current_executors.fetch_and_increment();
- ASSERT( harness_graph_executor::max_executors == 0 || c <= harness_graph_executor::max_executors, NULL );
- ++execute_count;
+ typename RW::scoped_lock l( harness_graph_executor::mutex_holder<RW>::mutex, /*write=*/false );
my_execute_count.fetch_and_increment();
- OutputType v2 = (*harness_graph_executor::fptr)(i);
- current_executors.fetch_and_decrement();
- return v2;
+ return harness_graph_executor::func(i);
}
};
+ typedef tfunctor<tbb::null_rw_mutex> functor;
};
//! A multifunction executor that accepts InputType and has only one Output of OutputType.
-template< typename InputType, typename OutputTuple, typename M=tbb::null_rw_mutex >
+template< typename InputType, typename OutputTuple >
struct harness_graph_multifunction_executor {
typedef typename tbb::flow::multifunction_node<InputType,OutputTuple>::output_ports_type ports_type;
- typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type OutputType;
typedef void (*mfunction_ptr_type)( const InputType& v, ports_type &p );
- static M mutex;
+ template<typename RW>
+ struct mutex_holder { static RW mutex; };
+
static mfunction_ptr_type fptr;
static tbb::atomic<size_t> execute_count;
+ static tbb::atomic<size_t> current_executors;
static size_t max_executors;
static inline void func( const InputType &v, ports_type &p ) {
- typename M::scoped_lock l( mutex );
- size_t c = current_executors.fetch_and_increment();
+ size_t c; // Declaration separate from initialization to avoid ICC internal error on IA-64
+ c = current_executors.fetch_and_increment();
ASSERT( max_executors == 0 || c <= max_executors, NULL );
- ASSERT(std::tuple_size<OutputTuple>::value == 1, NULL);
+ ASSERT(tbb::flow::tuple_size<OutputTuple>::value == 1, NULL);
++execute_count;
(*fptr)(v,p);
current_executors.fetch_and_decrement();
}
- struct functor {
+ template< typename RW >
+ static inline void tfunc( const InputType& v, ports_type &p ) {
+ // Shared lock in invocations, exclusive in a test; see a comment in harness_graph_executor.
+ typename RW::scoped_lock l( mutex_holder<RW>::mutex, /*write=*/false );
+ func(v,p);
+ }
+
+ template< typename RW >
+ struct tfunctor {
tbb::atomic<size_t> my_execute_count;
- functor() { my_execute_count = 0; }
- functor( const functor &f ) { my_execute_count = f.my_execute_count; }
+ tfunctor() { my_execute_count = 0; }
+ tfunctor( const tfunctor &f ) { my_execute_count = f.my_execute_count; }
void operator()( const InputType &i, ports_type &p ) {
- typename M::scoped_lock l( harness_graph_multifunction_executor::mutex );
- size_t c = current_executors.fetch_and_increment();
- ASSERT( harness_graph_multifunction_executor::max_executors == 0 || c <= harness_graph_multifunction_executor::max_executors, NULL );
- ++execute_count;
+ typename RW::scoped_lock l( harness_graph_multifunction_executor::mutex_holder<RW>::mutex, /*write=*/false );
my_execute_count.fetch_and_increment();
- (*harness_graph_multifunction_executor::fptr)(i,p);
- current_executors.fetch_and_decrement();
+ harness_graph_multifunction_executor::func(i,p);
}
};
+ typedef tfunctor<tbb::null_rw_mutex> functor;
};
-template< typename InputType, typename OutputType, typename M >
-M harness_graph_executor<InputType, OutputType, M>::mutex;
+// static vars for function_node tests
+template< typename InputType, typename OutputType >
+template< typename RW >
+RW harness_graph_executor<InputType, OutputType>::mutex_holder<RW>::mutex;
-template< typename InputType, typename OutputType, typename M >
-tbb::atomic<size_t> harness_graph_executor<InputType, OutputType, M>::execute_count;
+template< typename InputType, typename OutputType >
+tbb::atomic<size_t> harness_graph_executor<InputType, OutputType>::execute_count;
-template< typename InputType, typename OutputType, typename M >
-typename harness_graph_executor<InputType, OutputType, M>::function_ptr_type harness_graph_executor<InputType, OutputType, M>::fptr
+template< typename InputType, typename OutputType >
+typename harness_graph_executor<InputType, OutputType>::function_ptr_type harness_graph_executor<InputType, OutputType>::fptr
= harness_graph_default_functor< InputType, OutputType >::construct;
-template< typename InputType, typename OutputType, typename M >
-size_t harness_graph_executor<InputType, OutputType, M>::max_executors = 0;
+template< typename InputType, typename OutputType >
+tbb::atomic<size_t> harness_graph_executor<InputType, OutputType>::current_executors;
+
+template< typename InputType, typename OutputType >
+size_t harness_graph_executor<InputType, OutputType>::max_executors = 0;
// static vars for multifunction_node tests
-template< typename InputType, typename OutputTuple, typename M >
-M harness_graph_multifunction_executor<InputType, OutputTuple, M>::mutex;
+template< typename InputType, typename OutputTuple >
+template< typename RW >
+RW harness_graph_multifunction_executor<InputType, OutputTuple>::mutex_holder<RW>::mutex;
-template< typename InputType, typename OutputTuple, typename M >
-tbb::atomic<size_t> harness_graph_multifunction_executor<InputType, OutputTuple, M>::execute_count;
+template< typename InputType, typename OutputTuple >
+tbb::atomic<size_t> harness_graph_multifunction_executor<InputType, OutputTuple>::execute_count;
-template< typename InputType, typename OutputTuple, typename M >
-typename harness_graph_multifunction_executor<InputType, OutputTuple, M>::mfunction_ptr_type harness_graph_multifunction_executor<InputType, OutputTuple, M>::fptr
+template< typename InputType, typename OutputTuple >
+typename harness_graph_multifunction_executor<InputType, OutputTuple>::mfunction_ptr_type harness_graph_multifunction_executor<InputType, OutputTuple>::fptr
= harness_graph_default_multifunction_functor< InputType, OutputTuple >::construct;
-template< typename InputType, typename OutputTuple, typename M >
-size_t harness_graph_multifunction_executor<InputType, OutputTuple, M>::max_executors = 0;
+template< typename InputType, typename OutputTuple >
+tbb::atomic<size_t> harness_graph_multifunction_executor<InputType, OutputTuple>::current_executors;
+
+template< typename InputType, typename OutputTuple >
+size_t harness_graph_multifunction_executor<InputType, OutputTuple>::max_executors = 0;
//! Counts the number of puts received
template< typename T >
@@ -246,9 +270,9 @@ struct harness_counting_receiver : public tbb::flow::receiver<T>, NoCopy {
num_copies = c;
}
- /* override */ bool try_put( const T & ) {
+ /* override */ tbb::task *try_put_task( const T & ) {
++my_count;
- return true;
+ return const_cast<tbb::task *>(tbb::flow::interface6::SUCCESSFULLY_ENQUEUED);
}
void validate() {
@@ -256,6 +280,8 @@ struct harness_counting_receiver : public tbb::flow::receiver<T>, NoCopy {
ASSERT( n == num_copies*max_value, NULL );
}
+ /*override*/void reset_receiver() { my_count = 0; }
+
};
//! Counts the number of puts received
@@ -284,7 +310,7 @@ struct harness_mapped_receiver : public tbb::flow::receiver<T>, NoCopy {
my_map = new map_type;
}
- /* override */ bool try_put( const T &t ) {
+ /* override */ tbb::task * try_put_task( const T &t ) {
if ( my_map ) {
tbb::atomic<size_t> a;
a = 1;
@@ -296,7 +322,7 @@ struct harness_mapped_receiver : public tbb::flow::receiver<T>, NoCopy {
} else {
++my_count;
}
- return true;
+ return const_cast<tbb::task *>(tbb::flow::interface6::SUCCESSFULLY_ENQUEUED);
}
void validate() {
@@ -311,6 +337,8 @@ struct harness_mapped_receiver : public tbb::flow::receiver<T>, NoCopy {
}
}
+ /*override*/void reset_receiver() { my_count = 0; if(my_map) delete my_map; my_map = new map_type; }
+
};
//! Counts the number of puts received
diff --git a/src/test/harness_inject_scheduler.h b/src/test/harness_inject_scheduler.h
index 44751b9..747664e 100644
--- a/src/test/harness_inject_scheduler.h
+++ b/src/test/harness_inject_scheduler.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -61,6 +61,7 @@
#include "../tbb/spin_rw_mutex.cpp"
#include "../tbb/spin_mutex.cpp"
#include "../tbb/private_server.cpp"
+#include "../tbb/concurrent_monitor.cpp"
#if _WIN32||_WIN64
#include "../tbb/semaphore.cpp"
#endif
diff --git a/src/test/harness_iterator.h b/src/test/harness_iterator.h
index 3fc9c69..cc5299a 100644
--- a/src/test/harness_iterator.h
+++ b/src/test/harness_iterator.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/harness_m128.h b/src/test/harness_m128.h
index 5a7a123..6fdbb3d 100644
--- a/src/test/harness_m128.h
+++ b/src/test/harness_m128.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -35,6 +35,12 @@
// Do not create file-scope objects of the class, because MinGW (as of May 2010)
// did not always provide proper stack alignment in destructors of such objects.
+#if (_MSC_VER>=1600)
+//TODO: handle /arch:AVX in the right way.
+#pragma warning (push)
+#pragma warning (disable: 4752)
+#endif
+
template<typename __Mvec>
class ClassWithVectorType {
static const int n = 16;
@@ -110,3 +116,7 @@ bool have_AVX() {
#define HAVE_m128 1
typedef ClassWithVectorType<__m128> ClassWithSSE;
#endif
+
+#if (_MSC_VER>=1600)
+#pragma warning (pop)
+#endif
diff --git a/src/test/harness_memory.h b/src/test/harness_memory.h
index 8e24a8a..f51d13d 100644
--- a/src/test/harness_memory.h
+++ b/src/test/harness_memory.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -62,7 +62,7 @@ const size_t shared_size = 0;
//! Return estimate of number of bytes of memory that this program is currently using.
/* Returns 0 if not implemented on platform. */
size_t GetMemoryUsage() {
-#if _XBOX
+#if _XBOX || __TBB_WIN8UI_SUPPORT
return 0;
#elif _WIN32
PROCESS_MEMORY_COUNTERS mem;
diff --git a/examples/pipeline/square/gen_input.cpp b/src/test/harness_mic.h
similarity index 67%
copy from examples/pipeline/square/gen_input.cpp
copy to src/test/harness_mic.h
index b870952..ccc2e15 100644
--- a/examples/pipeline/square/gen_input.cpp
+++ b/src/test/harness_mic.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,19 +26,29 @@
the GNU General Public License.
*/
+#ifndef tbb_test_harness_mic_H
+#define tbb_test_harness_mic_H
+
+#if ! __TBB_DEFINE_MIC
+ #error test/harness_mic.h should be included only when building for Intel(R) Many Integrated Core Architecture
+#endif
+
+// test for unifed sources. See makefiles
+#undef HARNESS_INCOMPLETE_SOURCES
+
#include <stdlib.h>
#include <stdio.h>
-//! Generates sample input for square.cpp
-int main( int argc, char* argv[] ) {
- long num = argc>1 ? atol(argv[1]) : 1000000;
- int a=0;
- int b=1;
- for( long j=0; j<num; ++j ) {
- printf("%u\n",a);
- b+=a;
- a=(b-a)%10000;
- if (a<0) a=-a;
- }
- return 0;
-}
+#define TBB_TEST_LOW_WORKLOAD 1
+
+#define REPORT_FATAL_ERROR REPORT
+#define HARNESS_EXPORT
+
+#if __TBB_MIC_NATIVE
+ #define HARNESS_EXIT_ON_ASSERT 1
+ #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1
+#else
+ #define HARNESS_TERMINATE_ON_ASSERT 1
+#endif
+
+#endif /* tbb_test_harness_mic_H */
diff --git a/src/test/harness_report.h b/src/test/harness_report.h
index 6caf642..be4f3bc 100644
--- a/src/test/harness_report.h
+++ b/src/test/harness_report.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/harness_task.h b/src/test/harness_task.h
index 1f7d4d9..a039bbf 100644
--- a/src/test/harness_task.h
+++ b/src/test/harness_task.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/harness_tbb_independence.h b/src/test/harness_tbb_independence.h
index d07f0dd..90025f2 100644
--- a/src/test/harness_tbb_independence.h
+++ b/src/test/harness_tbb_independence.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/harness_test_cases_framework.h b/src/test/harness_test_cases_framework.h
index e8f673a..d2b42f8 100644
--- a/src/test/harness_test_cases_framework.h
+++ b/src/test/harness_test_cases_framework.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -146,7 +146,7 @@ namespace test_framework_unit_tests{
}
struct silent_switch_fixture{
- test_helper::test_case<test_helper::tag<__LINE__> > do_nothing_tc;
+ test_helper::test_case<test_helper::tag<__LINE__> > empty_test_case;
};
struct run_all_and_print_results_should_respect_silent_mode: silent_switch_fixture{
void operator()(){
diff --git a/src/test/test_ScalableAllocator.cpp b/src/test/test_ScalableAllocator.cpp
index 7a12496..3d48780 100644
--- a/src/test/test_ScalableAllocator.cpp
+++ b/src/test/test_ScalableAllocator.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -85,6 +85,8 @@ public:
}
};
+#if TBB_USE_EXCEPTIONS
+
class NullAllocator {
public:
typedef char value_type;
@@ -106,6 +108,24 @@ void TestZeroSpaceMemoryPool()
}
}
+#else // TBB_USE_EXCEPTIONS
+
+void TestZeroSpaceMemoryPool() { }
+
+struct FixedPool {
+ void *buf;
+ size_t size;
+ FixedPool(void *buf, size_t size) : buf(buf), size(size) {}
+};
+
+static void *fixedBufGetMem(intptr_t pool_id, size_t &bytes)
+{
+ bytes = ((FixedPool*)pool_id)->size;
+ return ((FixedPool*)pool_id)->buf;
+}
+
+#endif // TBB_USE_EXCEPTIONS
+
/* test that pools in small space are either usable or not created
(i.e., exception raised) */
void TestSmallFixedSizePool()
@@ -115,17 +135,43 @@ void TestSmallFixedSizePool()
for (size_t sz = 0; sz < 64*1024; sz = sz? 3*sz : 3) {
buf = (char*)malloc(sz);
+#if TBB_USE_EXCEPTIONS
try {
tbb::fixed_pool pool(buf, sz);
+/* Check that pool is usable, i.e. such an allocation exists,
+ that can be fulfilled from the pool. 16B allocation fits in 16KB slabs,
+ so it requires at least 16KB. Requirement of 9KB allocation is more modest.
+*/
allocated = pool.malloc( 16 ) || pool.malloc( 9*1024 );
- ASSERT(allocated, NULL);
+ ASSERT(allocated, "If pool created, it must be useful.");
} catch (std::bad_alloc) {
} catch (...) {
ASSERT(0, "wrong exception type; expected bad_alloc");
}
+#else
+/* Do not test high-level pool interface because pool ctor emit exception
+ on creation failure. Instead test same functionality via low-level interface.
+ TODO: add support for configuration with disabled exceptions to pools.
+*/
+ rml::MemPoolPolicy pol(fixedBufGetMem, NULL, 0, /*fixedSizePool=*/true,
+ /*keepMemTillDestroy=*/false);
+ rml::MemoryPool *pool;
+ FixedPool fixedPool(buf, sz);
+
+ rml::MemPoolError ret = pool_create_v1((intptr_t)&fixedPool, &pol, &pool);
+
+ if (ret == rml::POOL_OK) {
+ allocated = pool_malloc(pool, 16) || pool_malloc(pool, 9*1024);
+ ASSERT(allocated, "If pool created, it must be useful.");
+ pool_destroy(pool);
+ } else
+ ASSERT(ret == rml::NO_MEMORY, "Expected that pool either valid "
+ "or have no memory to be created");
+#endif
free(buf);
}
ASSERT(allocated, "Maximal buf size should be enough to create working fixed_pool");
+#if TBB_USE_EXCEPTIONS
try {
tbb::fixed_pool pool(NULL, 10*1024*1024);
ASSERT(0, "Useless allocator with no memory must not be created");
@@ -133,10 +179,11 @@ void TestSmallFixedSizePool()
} catch (...) {
ASSERT(0, "wrong exception type; expected bad_alloc");
}
+#endif
}
int TestMain () {
-#if _MSC_VER && !__TBBMALLOC_NO_IMPLICIT_LINKAGE
+#if _MSC_VER && !__TBBMALLOC_NO_IMPLICIT_LINKAGE && !__TBB_WIN8UI_SUPPORT
#ifdef _DEBUG
ASSERT(!GetModuleHandle("tbbmalloc.dll") && GetModuleHandle("tbbmalloc_debug.dll"),
"test linked with wrong (non-debug) tbbmalloc library");
diff --git a/src/test/test_ScalableAllocator_STL.cpp b/src/test/test_ScalableAllocator_STL.cpp
index 63e33dc..48c1aca 100644
--- a/src/test/test_ScalableAllocator_STL.cpp
+++ b/src/test/test_ScalableAllocator_STL.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_aggregator.cpp b/src/test/test_aggregator.cpp
index fc9e553..807ea6b 100644
--- a/src/test/test_aggregator.cpp
+++ b/src/test/test_aggregator.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_aligned_space.cpp b/src/test/test_aligned_space.cpp
index 486bd0a..152ae6e 100644
--- a/src/test/test_aligned_space.cpp
+++ b/src/test/test_aligned_space.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_allocator.h b/src/test/test_allocator.h
index 0958632..7f295a0 100644
--- a/src/test/test_allocator.h
+++ b/src/test/test_allocator.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_allocator_STL.h b/src/test/test_allocator_STL.h
index 4e9a8fe..cf11c3c 100644
--- a/src/test/test_allocator_STL.h
+++ b/src/test/test_allocator_STL.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -84,9 +84,11 @@ void TestMap(const typename Map::allocator_type &a) {
template<typename Allocator>
void TestAllocatorWithSTL(const Allocator &a = Allocator() ) {
typedef typename Allocator::template rebind<int>::other Ai;
- typedef typename Allocator::template rebind<const int>::other Aci;
typedef typename Allocator::template rebind<std::pair<const int, int> >::other Acii;
+#if _MSC_VER
+ typedef typename Allocator::template rebind<const int>::other Aci;
typedef typename Allocator::template rebind<std::pair<int, int> >::other Aii;
+#endif
// Sequenced containers
TestSequence<std::deque <int,Ai> >(a);
diff --git a/src/test/test_assembly.cpp b/src/test/test_assembly.cpp
index d737dec..b511173 100644
--- a/src/test/test_assembly.cpp
+++ b/src/test/test_assembly.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -28,8 +28,10 @@
// Program for basic correctness testing of assembly-language routines.
#include "harness_defs.h"
-
-#if __TBB_TEST_SKIP_BUILTINS_MODE
+//for ICC builtins mode the test will be skipped as
+//macro __TBB_GCC_BUILTIN_ATOMICS_PRESENT used to define __TBB_TEST_SKIP_GCC_BUILTINS_MODE
+//will not be defined (it is explicitly disabled for ICC)
+#if __TBB_TEST_SKIP_GCC_BUILTINS_MODE
#include "harness.h"
int TestMain() {
REPORT("Known issue: GCC builtins aren't available\n");
@@ -44,6 +46,7 @@ int TestMain() {
using tbb::internal::reference_count;
+//TODO: remove this function when atomic function __TBB_XXX are dropped
//! Test __TBB_CompareAndSwapW
static void TestCompareExchange() {
ASSERT( intptr_t(-10)<10, "intptr_t not a signed integral type?" );
@@ -67,6 +70,7 @@ static void TestCompareExchange() {
}
}
+//TODO: remove this function when atomic function __TBB_XXX are dropped
//! Test __TBB___TBB_FetchAndIncrement and __TBB___TBB_FetchAndDecrement
static void TestAtomicCounter() {
// "canary" is a value used to detect illegal overwrites.
@@ -108,12 +112,12 @@ static void TestTinyLock() {
#endif
__TBB_LockByte(flags[8]);
for( unsigned int i=0; i<16; ++i )
- #ifdef __sparc
+ #ifdef __sparc
ASSERT( flags[i]==(i==8?0xff:i), NULL );
- #else
+ #else
ASSERT( flags[i]==(i==8?1:i), NULL );
- #endif
- __TBB_UnlockByte(flags[8], 0);
+ #endif
+ __TBB_UnlockByte(flags[8]);
for( unsigned int i=0; i<16; ++i )
ASSERT( flags[i] == (i==8?0:i), NULL );
}
diff --git a/src/test/test_atomic.cpp b/src/test/test_atomic.cpp
index 85949e9..42205b1 100644
--- a/src/test/test_atomic.cpp
+++ b/src/test/test_atomic.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -28,11 +28,11 @@
#include "harness_defs.h"
-#if __TBB_TEST_SKIP_PIC_MODE || __TBB_TEST_SKIP_BUILTINS_MODE
+#if __TBB_TEST_SKIP_PIC_MODE || (__TBB_TEST_SKIP_GCC_BUILTINS_MODE && __TBB_TEST_SKIP_ICC_BUILTINS_MODE)
#include "harness.h"
int TestMain() {
REPORT("Known issue: %s\n",
- __TBB_TEST_SKIP_PIC_MODE? "PIC mode is not supported" : "GCC builtins aren't available");
+ __TBB_TEST_SKIP_PIC_MODE? "PIC mode is not supported" : "Compiler builtins for atomic operations aren't available");
return Harness::Skipped;
}
#else
@@ -42,7 +42,11 @@ int TestMain() {
#include "tbb/atomic.h"
#include "harness_assert.h"
-#include <string.h> // memcmp
+#include <cstring> // memcmp
+#include "tbb/aligned_space.h"
+#include <new> //for placement new
+
+using std::memcmp;
#if _MSC_VER && !defined(__INTEL_COMPILER)
// Unary minus operator applied to unsigned type, result still unsigned
@@ -50,6 +54,11 @@ int TestMain() {
#pragma warning( disable: 4127 4310 )
#endif
+#if __TBB_GCC_STRICT_ALIASING_BROKEN && __TBB_GCC_WARNING_SUPPRESSION_PRESENT
+ // Suppress crazy warnings about strict aliasing
+ #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#endif
+
enum LoadStoreExpression {
UseOperators,
UseImplicitAcqRel,
@@ -281,8 +290,256 @@ void TestConst( T i ) {
ASSERT( z.counter.template load<tbb::full_fence>() == i, "sequentially consistent read of atomic<T> broken?" );
}
+#include "harness.h"
+
+#include <sstream>
+
+//TODO: consider moving it to separate file, and unify with one in examples command line interface
+template<typename T>
+std::string to_string(const T& a){
+ std::stringstream str; str <<a;
+ return str.str();
+}
+namespace initialization_tests {
+ template<typename T>
+ struct test_initialization_fixture{
+ typedef tbb::atomic<T> atomic_t;
+ tbb::aligned_space<atomic_t,1> non_zeroed_storage;
+ enum {fill_value = 0xFF };
+ test_initialization_fixture(){
+ memset(non_zeroed_storage.begin(),fill_value,sizeof(non_zeroed_storage));
+ ASSERT( char(fill_value)==*(reinterpret_cast<char*>(non_zeroed_storage.begin()))
+ ,"failed to fill the storage; memset error?");
+ }
+ //TODO: consider move it to destructor, even in a price of UB
+ void tear_down(){
+ non_zeroed_storage.begin()->~atomic_t();
+ }
+ };
+
+ template<typename T>
+ struct TestValueInitialization : test_initialization_fixture<T>{
+ void operator()(){
+ typedef typename test_initialization_fixture<T>::atomic_t atomic_type;
+ //please note that explicit braces below are needed to get zero initialization.
+ //in C++11, 8.5 Initializers [dcl.init], see paragraphs 10,7,5
+ new (this->non_zeroed_storage.begin()) atomic_type();
+ //TODO: add use of KNOWN_ISSUE macro on SunCC 5.11
+ #if !__SUNPRO_CC || __SUNPRO_CC > 0x5110
+ //TODO: add printing of typename to the assertion
+ ASSERT(char(0)==*(reinterpret_cast<char*>(this->non_zeroed_storage.begin()))
+ ,("value initialization for tbb::atomic should do zero initialization; "
+ "actual value:"+to_string(this->non_zeroed_storage.begin()->load())).c_str());
+ #endif
+ this->tear_down();
+ };
+ };
+
+ template<typename T>
+ struct TestDefaultInitialization : test_initialization_fixture<T>{
+ void operator ()(){
+ typedef typename test_initialization_fixture<T>::atomic_t atomic_type;
+ new (this->non_zeroed_storage.begin()) atomic_type;
+ ASSERT( char(this->fill_value)==*(reinterpret_cast<char*>(this->non_zeroed_storage.begin()))
+ ,"default initialization for atomic should do no initialization");
+ this->tear_down();
+ }
+ };
+# if __TBB_ATOMIC_CTORS
+ template<typename T>
+ struct TestDirectInitialization : test_initialization_fixture<T> {
+ void operator()(T i){
+ typedef typename test_initialization_fixture<T>::atomic_t atomic_type;
+ new (this->non_zeroed_storage.begin()) atomic_type(i);
+ ASSERT(i == this->non_zeroed_storage.begin()->load()
+ ,("tbb::atomic initialization failed; "
+ "value:"+to_string(this->non_zeroed_storage.begin()->load())+
+ "; expected:"+to_string(i)).c_str());
+ this->tear_down();
+ }
+ };
+# endif
+}
+template<typename T>
+void TestValueInitialization(){
+ initialization_tests::TestValueInitialization<T>()();
+}
+template<typename T>
+void TestDefaultInitialization(){
+ initialization_tests::TestDefaultInitialization<T>()();
+}
+
+#if __TBB_ATOMIC_CTORS
+template<typename T>
+void TestDirectInitialization(T i){
+ initialization_tests::TestDirectInitialization<T>()(i);
+}
+//TODO: it would be great to have constructor doing dynamic initialization of local atomic objects implicitly (with zero?),
+// but do no dynamic initializations by default for static objects
+namespace test_constexpr_initialization_helper {
+ struct white_box_ad_hoc_type {
+ int _int;
+ constexpr white_box_ad_hoc_type(int a =0) : _int(a) {};
+ constexpr operator int() const { return _int;}
+ };
+}
+//some white boxing
+namespace tbb { namespace internal {
+ template<>
+ struct atomic_impl<test_constexpr_initialization_helper::white_box_ad_hoc_type>: atomic_impl<int> {
+ atomic_impl() = default;
+ constexpr atomic_impl(test_constexpr_initialization_helper::white_box_ad_hoc_type value):atomic_impl<int>(value){}
+ constexpr operator int(){ return this->my_storage.my_value;}
+ };
+}}
+
+//TODO: make this a parameterized macro
+void TestConstExprInitializationIsTranslationTime(){
+ const char* ct_init_failed_msg = "translation time init failed?";
+ typedef tbb::atomic<int> atomic_t;
+ constexpr atomic_t a(8);
+ ASSERT(a == 8,ct_init_failed_msg);
+
+ constexpr tbb::atomic<test_constexpr_initialization_helper::white_box_ad_hoc_type> ct_atomic(10);
+ enum {ct_atomic_value_ten = (int)ct_atomic};
+ __TBB_STATIC_ASSERT(ct_atomic_value_ten == 10, "translation time init failed?");
+ ASSERT(ct_atomic_value_ten == 10,ct_init_failed_msg);
+ int array[ct_atomic_value_ten];
+ ASSERT(array_length(array) == 10,ct_init_failed_msg);
+}
+
+#include <string>
+#include <vector>
+namespace TestConstExprInitializationOfGlobalObjectsHelper{
+ struct static_objects_dynamic_init_order_tester {
+ static int order_hash;
+ template<int N> struct nth {
+ nth(){ order_hash = (order_hash<<4)+N; }
+ };
+
+ static nth<2> second;
+ static nth<3> third;
+ };
+
+ int static_objects_dynamic_init_order_tester::order_hash=1;
+ static_objects_dynamic_init_order_tester::nth<2> static_objects_dynamic_init_order_tester::second;
+ static_objects_dynamic_init_order_tester::nth<3> static_objects_dynamic_init_order_tester::third;
+
+ void TestStaticsDynamicInitializationOrder(){
+ ASSERT(static_objects_dynamic_init_order_tester::order_hash==0x123,"Statics dynamic initialization order is broken? ");
+ }
+
+ template<typename T>
+ void TestStaticInit();
+
+ namespace auto_registered_tests_helper {
+ template<typename T>
+ struct type_name ;
+
+ #define REGISTER_TYPE_NAME(T) \
+ namespace auto_registered_tests_helper{ \
+ template<> \
+ struct type_name<T> { \
+ static const char* name; \
+ }; \
+ const char* type_name<T>::name = #T; \
+ } \
+
+ typedef void (* p_test_function_type)();
+ static std::vector<p_test_function_type> const_expr_tests;
+
+ template <typename T>
+ struct registration{
+ registration(){const_expr_tests.push_back(TestStaticInit<T>);}
+ };
+ }
+ //according to ISO C++11 [basic.start.init], static data fields of class template have unordered
+ //initialization unless it is an explicit specialization
+ template<typename T>
+ struct tester;
+
+ #define TESTER_SPECIALIZATION(T,ct_value) \
+ template<> \
+ struct tester<T> { \
+ struct static_before; \
+ static bool result; \
+ static static_before static_before_; \
+ static tbb::atomic<T> static_atomic; \
+ \
+ static auto_registered_tests_helper::registration<T> registered; \
+ }; \
+ bool tester<T>::result = false; \
+ \
+ struct tester<T>::static_before { \
+ static_before(){ result = (static_atomic==ct_value); } \
+ } ; \
+ \
+ typename tester<T>::static_before tester<T>::static_before_; \
+ tbb::atomic<T> tester<T>::static_atomic(ct_value); \
+ \
+ auto_registered_tests_helper::registration<T> tester<T>::registered; \
+ REGISTER_TYPE_NAME(T) \
+
+ template<typename T>
+ void TestStaticInit(){
+ //TODO: add printing of values to the assertion
+ std::string type_name = auto_registered_tests_helper::type_name<T>::name;
+ ASSERT(tester<T>::result,("Static initialization failed for atomic " + type_name).c_str());
+ }
+
+ void CallExprInitTests(){
+ using namespace auto_registered_tests_helper;
+ for (size_t i =0; i<const_expr_tests.size(); ++i){
+ (*const_expr_tests[i])();
+ }
+ REMARK("ran %d consrexpr static init test \n",const_expr_tests.size());
+ }
+
+ //TODO: unify somehow list of tested types with one in TestMain
+ //TODO: add specializations for:
+ //T,T(-T(1)
+ //T,1
+# if __TBB_64BIT_ATOMICS
+ TESTER_SPECIALIZATION(long long,8LL)
+ TESTER_SPECIALIZATION(unsigned long long,8ULL)
+# endif
+ TESTER_SPECIALIZATION(unsigned long,8UL)
+ TESTER_SPECIALIZATION(long,8L)
+ TESTER_SPECIALIZATION(unsigned int,8U)
+ TESTER_SPECIALIZATION(int,8)
+ TESTER_SPECIALIZATION(unsigned short,8)
+ TESTER_SPECIALIZATION(short,8)
+ TESTER_SPECIALIZATION(unsigned char,8)
+ TESTER_SPECIALIZATION(signed char,8)
+ TESTER_SPECIALIZATION(char,8)
+ TESTER_SPECIALIZATION(wchar_t,8)
+
+ int dummy;
+ TESTER_SPECIALIZATION(void*,&dummy);
+ TESTER_SPECIALIZATION(bool,false);
+ //TODO: add test for constexpt initialization of floating types
+ //for some unknown reasons 0.1 becomes 0.10000001 and equality comparison fails
+ enum written_number_enum{one=2,two};
+ TESTER_SPECIALIZATION(written_number_enum,one);
+ //TODO: add test for ArrayElement<> as in TestMain
+}
+
+void TestConstExprInitializationOfGlobalObjects(){
+ //first assert that assumption the test based on are correct
+ TestConstExprInitializationOfGlobalObjectsHelper::TestStaticsDynamicInitializationOrder();
+ TestConstExprInitializationOfGlobalObjectsHelper::CallExprInitTests();
+}
+#endif //__TBB_ATOMIC_CTORS
template<typename T>
void TestOperations( T i, T j, T k ) {
+ TestValueInitialization<T>();
+ TestDefaultInitialization<T>();
+# if __TBB_ATOMIC_CTORS
+ TestConstExprInitializationIsTranslationTime();
+ TestDirectInitialization<T>(i);
+ TestDirectInitialization<T>(j);
+ TestDirectInitialization<T>(k);
+# endif
TestConst(i);
TestCompareAndSwap(i,j,k);
TestFetchAndStore(i,k); // Pass i,k instead of i,j, because callee requires two distinct values.
@@ -299,7 +556,59 @@ struct AlignmentChecker {
tbb::atomic<T> i;
};
-#include "harness.h"
+//TODO: candidate for test_compiler?
+template<typename T>
+void TestAlignment( const char* name ) {
+ AlignmentChecker<T> ac;
+ tbb::atomic<T> x;
+ x = T(0);
+ bool is_stack_variable_aligned = tbb::internal::is_aligned(&x,sizeof(T));
+ bool is_member_variable_aligned = tbb::internal::is_aligned(&ac.i,sizeof(T));
+ bool is_struct_size_correct = (sizeof(AlignmentChecker<T>)==2*sizeof(tbb::atomic<T>));
+ bool known_issue_condition = __TBB_FORCE_64BIT_ALIGNMENT_BROKEN && ( sizeof(T)==8);
+ //TODO: replace these ifs with KNOWN_ISSUE macro when it available
+ if (!is_stack_variable_aligned){
+ std::string msg = "Compiler failed to properly align local atomic variable?; size:"+to_string(sizeof(T)) + " type: "
+ +to_string(name) + " location:" + to_string(&x) +"\n";
+ if (known_issue_condition) {
+ REPORT(("Known issue: "+ msg).c_str());
+ }else{
+ ASSERT(false,msg.c_str());
+ }
+ }
+ if (!is_member_variable_aligned){
+ std::string msg = "Compiler failed to properly align atomic member variable?; size:"+to_string(sizeof(T)) + " type: "
+ +to_string(name) + " location:" + to_string(&ac.i) +"\n";
+ if (known_issue_condition) {
+ REPORT(("Known issue: "+ msg).c_str());
+ }else{
+ ASSERT(false,msg.c_str());
+ }
+ }
+ if (!is_struct_size_correct){
+ std::string msg = "Compiler failed to properly add padding to structure with atomic member variable?; Structure size:"+to_string(sizeof(AlignmentChecker<T>))
+ + " atomic size:"+to_string(sizeof(tbb::atomic<T>)) + " type: " + to_string(name) +"\n";
+ if (known_issue_condition) {
+ REPORT(("Known issue: "+ msg).c_str());
+ }else{
+ ASSERT(false,msg.c_str());
+ }
+ }
+
+ AlignmentChecker<T> array[5];
+ for( int k=0; k<5; ++k ) {
+ bool is_member_variable_in_array_aligned = tbb::internal::is_aligned(&array[k].i,sizeof(T));
+ if (!is_member_variable_in_array_aligned) {
+ std::string msg = "Compiler failed to properly align atomic member variable inside an array?; size:"+to_string(sizeof(T)) + " type:"+to_string(name)
+ + " location:" + to_string(&array[k].i) + "\n";
+ if (known_issue_condition){
+ REPORT(("Known issue: "+ msg).c_str());
+ }else{
+ ASSERT(false,msg.c_str());
+ }
+ }
+ }
+}
#if _MSC_VER && !defined(__INTEL_COMPILER)
// unary minus operator applied to unsigned type, result still unsigned
@@ -310,16 +619,7 @@ struct AlignmentChecker {
template<typename T>
void TestAtomicInteger( const char* name ) {
REMARK("testing atomic<%s> (size=%d)\n",name,sizeof(tbb::atomic<T>));
-#if ( __linux__ && __TBB_x86_32 && __GNUC__==3 && __GNUC_MINOR__==3 ) || defined(__SUNPRO_CC)
- // gcc 3.3 has known problem for 32-bit Linux, so only warn if there is a problem.
- // SUNPRO_CC does have this problem as well
- if( sizeof(T)==8 ) {
- if( sizeof(AlignmentChecker<T>)!=2*sizeof(tbb::atomic<T>) ) {
- REPORT("Known issue: alignment for atomic<%s> is wrong with gcc 3.3 and sunCC 5.9 2008/01/28 for IA32\n",name);
- }
- } else
-#endif /* ( __linux__ && __TBB_x86_32 && __GNUC__==3 && __GNUC_MINOR__==3 ) || defined(__SUNPRO_CC) */
- ASSERT( sizeof(AlignmentChecker<T>)==2*sizeof(tbb::atomic<T>), NULL );
+ TestAlignment<T>(name);
TestOperations<T>(0L,T(-T(1)),T(1));
for( int k=0; k<int(sizeof(long))*8-1; ++k ) {
TestOperations<T>(T(1L<<k),T(~(1L<<k)),T(1-(1L<<k)));
@@ -329,13 +629,19 @@ void TestAtomicInteger( const char* name ) {
TestParallel<T>( name );
}
-template<typename T>
-struct Foo {
- T x, y, z;
-};
+namespace test_indirection_helpers {
+ template<typename T>
+ struct Foo {
+ //this constructor is needed to workaround ICC intrinsics port (compiler ?)bug, firing assertion below
+ //TODO: move this under #if
+ Foo(): x(), y(), z() {}
+ T x, y, z;
+ };
+}
template<typename T>
void TestIndirection() {
+ using test_indirection_helpers::Foo;
Foo<T> item;
tbb::atomic<Foo<T>*> pointer;
pointer = &item;
@@ -343,15 +649,28 @@ void TestIndirection() {
// Test various syntaxes for indirection to fields with non-zero offset.
T value1=T(), value2=T();
for( size_t j=0; j<sizeof(T); ++j ) {
- *(char*)&value1 = char(k^j);
- *(char*)&value2 = char(k^j*j);
+ ((char*)&value1)[j] = char(k^j);
+ ((char*)&value2)[j] = char(k^j*j);
}
pointer->y = value1;
(*pointer).z = value2;
T result1 = (*pointer).y;
T result2 = pointer->z;
- ASSERT( memcmp(&value1,&result1,sizeof(T))==0, NULL );
- ASSERT( memcmp(&value2,&result2,sizeof(T))==0, NULL );
+ //TODO: investigate (fill a bug?)assertion failure below for ICC (12.1.2?) intrinsic port for sizes of 4,6,7
+ //and remove default constructor for test_indirection_helpers::Foo
+ #if !TBB_USE_ICC_BUILTINS
+ ASSERT( memcmp(&value1,&result1,sizeof(T))==0, NULL );
+ ASSERT( memcmp(&value2,&result2,sizeof(T))==0, NULL );
+ #elif __APPLE__
+ //ICC 12.1 generates incorrect code that crashes when icc builtins port is used
+ #else
+ if ( (memcmp(&value1,&result1,sizeof(T))!=0)
+ || (memcmp(&value2,&result2,sizeof(T))!=0))
+ {
+ REMARK_ONCE("Known Issue: ICC builtins port seems to generate wrong code of atomic::operator* "
+ "and operator*-> for some types \n");
+ }
+ #endif
}
}
@@ -364,6 +683,7 @@ void TestAtomicPointer() {
TestFetchAndAdd<T*>(&array[500]);
TestIndirection<T>();
TestParallel<T*>( "pointer" );
+
}
//! Test atomic<Ptr> where Ptr is a pointer to a type of unknown size
@@ -393,17 +713,43 @@ void TestAtomicEnum() {
template<typename T>
void TestAtomicFloat( const char* name ) {
REMARK("testing atomic<%s>\n", name );
+ TestAlignment<T>(name);
TestOperations<T>(0.5,3.25,10.75);
TestParallel<T>( name );
}
-#if __TBB_BIG_ENDIAN!=-1
+#define __TBB_TEST_GENERIC_PART_WORD_CAS (__TBB_ENDIANNESS!=__TBB_ENDIAN_UNSUPPORTED)
+#if __TBB_TEST_GENERIC_PART_WORD_CAS
+void TestEndianness() {
+ // Test for pure endianness (assumed by simpler probe in __TBB_MaskedCompareAndSwap()).
+ bool is_big_endian = true, is_little_endian = true;
+ const tbb::internal::uint32_t probe = 0x03020100;
+ ASSERT (tbb::internal::is_aligned(&probe,4), NULL);
+ for( const char *pc_begin = reinterpret_cast<const char*>(&probe)
+ , *pc = pc_begin, *pc_end = pc_begin + sizeof(probe)
+ ; pc != pc_end; ++pc) {
+ if (*pc != pc_end-1-pc) is_big_endian = false;
+ if (*pc != pc-pc_begin) is_little_endian = false;
+ }
+ ASSERT (!is_big_endian || !is_little_endian, NULL);
+ #if __TBB_ENDIANNESS==__TBB_ENDIAN_DETECT
+ ASSERT (is_big_endian || is_little_endian, "__TBB_ENDIANNESS should be set to __TBB_ENDIAN_UNSUPPORTED");
+ #elif __TBB_ENDIANNESS==__TBB_ENDIAN_BIG
+ ASSERT (is_big_endian, "__TBB_ENDIANNESS should NOT be set to __TBB_ENDIAN_BIG");
+ #elif __TBB_ENDIANNESS==__TBB_ENDIAN_LITTLE
+ ASSERT (is_little_endian, "__TBB_ENDIANNESS should NOT be set to __TBB_ENDIAN_LITTLE");
+ #elif __TBB_ENDIANNESS==__TBB_ENDIAN_UNSUPPORTED
+ #error Generic implementation of part-word CAS may not be used: unsupported endianness
+ #else
+ #error Unexpected value of __TBB_ENDIANNESS
+ #endif
+}
+
namespace masked_cas_helpers {
const int numMaskedOperations = 100000;
const int testSpaceSize = 8;
int prime[testSpaceSize] = {3,5,7,11,13,17,19,23};
-
template<typename T>
class TestMaskedCAS_Body: NoAssign {
T* test_space_uncontended;
@@ -412,7 +758,7 @@ namespace masked_cas_helpers {
TestMaskedCAS_Body( T* _space1, T* _space2 ) : test_space_uncontended(_space1), test_space_contended(_space2) {}
void operator()( int my_idx ) const {
using tbb::internal::__TBB_MaskedCompareAndSwap;
- const T my_prime = T(prime[my_idx]);
+ const volatile T my_prime = T(prime[my_idx]); // 'volatile' prevents erroneous optimizations by SunCC
T* const my_ptr = test_space_uncontended+my_idx;
T old_value=0;
for( int i=0; i<numMaskedOperations; ++i, old_value+=my_prime ){
@@ -476,6 +822,7 @@ namespace masked_cas_helpers {
return slot.result;
}
} // namespace masked_cas_helpers
+
template<typename T>
void TestMaskedCAS() {
using namespace masked_cas_helpers;
@@ -498,7 +845,8 @@ void TestMaskedCAS() {
ASSERT( arr2[i+1]==correctContendedValue, "unexpected value in a contended slot" );
}
}
-#endif
+#endif // __TBB_TEST_GENERIC_PART_WORD_CAS
+
template <typename T>
class TestRelaxedLoadStorePlainBody {
static T s_turn,
@@ -583,7 +931,7 @@ namespace bit_operation_test_suite{
const uintptr_t random_value ;
const uintptr_t inverted_random_value ;
fixture():
- random_value (tbb::internal::size_t_select(0x9E3779B9,0x9E3779B97F4A7C15ULL)),
+ random_value (tbb::internal::select_size_t_constant<0x9E3779B9,0x9E3779B97F4A7C15ULL>::value),
inverted_random_value ( ~random_value)
{}
};
@@ -655,13 +1003,18 @@ void TestBitOperations(){
}
int TestMain () {
- #if __TBB_64BIT_ATOMICS
- TestAtomicInteger<unsigned long long>("unsigned long long");
- TestAtomicInteger<long long>("long long");
- #else
- REPORT("64-bit atomics not supported\n");
- ASSERT(sizeof(long long)==8, "type long long is not 64 bits");
- #endif
+# if __TBB_ATOMIC_CTORS
+ TestConstExprInitializationOfGlobalObjects();
+# endif //__TBB_ATOMIC_CTORS
+# if __TBB_64BIT_ATOMICS && !__TBB_CAS_8_CODEGEN_BROKEN
+ TestAtomicInteger<unsigned long long>("unsigned long long");
+ TestAtomicInteger<long long>("long long");
+# elif __TBB_CAS_8_CODEGEN_BROKEN
+ REPORT("Known issue: compiler generates incorrect code for 64-bit atomics on this configuration\n");
+# else
+ REPORT("64-bit atomics not supported\n");
+ ASSERT(sizeof(long long)==8, "type long long is not 64 bits");
+# endif
TestAtomicInteger<unsigned long>("unsigned long");
TestAtomicInteger<long>("long");
TestAtomicInteger<unsigned int>("unsigned int");
@@ -687,21 +1040,28 @@ int TestMain () {
TestAtomicBool();
TestAtomicEnum();
TestAtomicFloat<float>("float");
- #if __TBB_64BIT_ATOMICS
- TestAtomicFloat<double>("double");
- #else
- ASSERT(sizeof(double)==8, "type double is not 64 bits");
- #endif
+# if __TBB_64BIT_ATOMICS && !__TBB_CAS_8_CODEGEN_BROKEN
+ TestAtomicFloat<double>("double");
+# else
+ ASSERT(sizeof(double)==8, "type double is not 64 bits");
+# endif
ASSERT( !ParallelError, NULL );
- #if __TBB_BIG_ENDIAN!=-1
- TestMaskedCAS<unsigned char>();
+# if __TBB_TEST_GENERIC_PART_WORD_CAS
+ TestEndianness();
+ ASSERT (sizeof(short)==2, NULL);
TestMaskedCAS<unsigned short>();
- #else
- REPORT("Generic part-word CAS is not available\n");
- #endif
-#if __TBB_64BIT_ATOMICS
- TestRegisterPromotionSuppression<tbb::internal::int64_t>();
-#endif
+ TestMaskedCAS<short>();
+ TestMaskedCAS<unsigned char>();
+ TestMaskedCAS<signed char>();
+ TestMaskedCAS<char>();
+# elif __TBB_USE_GENERIC_PART_WORD_CAS
+# error Generic part-word CAS is enabled, but not covered by the test
+# else
+ REPORT("Skipping test for generic part-word CAS\n");
+# endif
+# if __TBB_64BIT_ATOMICS && !__TBB_CAS_8_CODEGEN_BROKEN
+ TestRegisterPromotionSuppression<tbb::internal::int64_t>();
+# endif
TestRegisterPromotionSuppression<tbb::internal::int32_t>();
TestRegisterPromotionSuppression<tbb::internal::int16_t>();
TestRegisterPromotionSuppression<tbb::internal::int8_t>();
@@ -710,14 +1070,38 @@ int TestMain () {
return Harness::Done;
}
-template<typename T>
-struct FlagAndMessage {
+template<typename T, bool aligned>
+class AlignedAtomic: NoAssign {
+ //tbb::aligned_space can not be used here, because internally it utilize align pragma/attribute,
+ //which has bugs on 8byte alignment on ia32 on some compilers( see according ****_BROKEN macro)
+ // Allocate space big enough to always contain sizeof(T)-byte locations that are aligned and misaligned.
+ char raw_space[2*sizeof(T) -1];
+public:
+ tbb::atomic<T>& construct_atomic(){
+ std::memset(&raw_space[0],0, sizeof(raw_space));
+ uintptr_t delta = aligned ? 0 : sizeof(T)/2;
+ size_t index=sizeof(T)-1;
+ tbb::atomic<T>* y = reinterpret_cast<tbb::atomic<T>*>((reinterpret_cast<uintptr_t>(&raw_space[index+delta])&~index) - delta);
+ // Assertion checks that y really did end up somewhere inside "raw_space".
+ ASSERT( raw_space<=reinterpret_cast<char*>(y), "y starts before raw_space" );
+ ASSERT( reinterpret_cast<char*>(y+1) <= raw_space+sizeof(raw_space), "y starts after raw_space" );
+ ASSERT( !(aligned ^ tbb::internal::is_aligned(y,sizeof(T))), "y is not aligned as it required" );
+ new (y) tbb::atomic<T> ();
+ return *y;
+ }
+};
+
+template<typename T, bool aligned>
+struct FlagAndMessage: AlignedAtomic<T,aligned> {
//! 0 if message not set yet, 1 if message is set.
- tbb::atomic<T> flag;
+ tbb::atomic<T>& flag;
/** Force flag and message to be on distinct cache lines for machines with cache line size <= 4096 bytes */
char pad[4096/sizeof(T)];
//! Non-zero if message is ready
T message;
+ FlagAndMessage(): flag(FlagAndMessage::construct_atomic()) {
+ std::memset(pad,0,sizeof(pad));
+ }
};
// A special template function used for summation.
@@ -805,21 +1189,23 @@ struct LoadStoreTraits<T, UseGlobalHelperRelaxed> {
static void store ( tbb::atomic<T>& dst, const T& src ) { tbb::store<tbb::relaxed>(dst, src); }
};
-template<typename T, LoadStoreExpression E>
-class HammerLoadAndStoreFence: NoAssign {
+template<typename T, bool aligned, LoadStoreExpression E>
+struct HammerLoadAndStoreFence: NoAssign {
+ typedef FlagAndMessage<T,aligned> fam_type;
+private:
typedef LoadStoreTraits<T, E> trait;
- FlagAndMessage<T>* fam;
+ fam_type* fam;
const int n;
const int p;
const int trial;
const char* name;
mutable T accum;
public:
- HammerLoadAndStoreFence( FlagAndMessage<T>* fam_, int n_, int p_, const char* name_, int trial_ ) : fam(fam_), n(n_), p(p_), trial(trial_), name(name_) {}
+ HammerLoadAndStoreFence( fam_type* fam_, int n_, int p_, const char* name_, int trial_ ) : fam(fam_), n(n_), p(p_), trial(trial_), name(name_) {}
void operator()( int k ) const {
int one = One;
- FlagAndMessage<T>* s = fam+k;
- FlagAndMessage<T>* s_next = fam + (k+1)%p;
+ fam_type* s = fam+k;
+ fam_type* s_next = fam + (k+1)%p;
for( int i=0; i<n; ++i ) {
// The inner for loop is a spin-wait loop, which is normally considered very bad style.
// But we must use it here because we are interested in examining subtle hardware effects.
@@ -881,17 +1267,18 @@ public:
//! Test that atomic<T> has acquire semantics for loads and release semantics for stores.
/** Test performs round-robin passing of message among p processors,
where p goes from MinThread to MaxThread. */
-template<typename T, LoadStoreExpression E>
+template<typename T, bool aligned, LoadStoreExpression E>
void TestLoadAndStoreFences( const char* name ) {
+ typedef HammerLoadAndStoreFence<T, aligned, E> hammer_load_store_type;
+ typedef typename hammer_load_store_type::fam_type fam_type;
for( int p=MinThread<2 ? 2 : MinThread; p<=MaxThread; ++p ) {
- FlagAndMessage<T>* fam = new FlagAndMessage<T>[p];
+ fam_type * fam = new fam_type[p];
// Each of four trials exercise slightly different expression pattern within the test.
// See occurrences of COMPLICATED_ZERO for details.
for( int trial=0; trial<4; ++trial ) {
- memset( fam, 0, p*sizeof(FlagAndMessage<T>) );
fam->message = (T)-1;
fam->flag = (T)-1;
- NativeParallelFor( p, HammerLoadAndStoreFence<T, E>( fam, 100, p, name, trial ) );
+ NativeParallelFor( p, hammer_load_store_type( fam, 100, p, name, trial ) );
if ( !IsRelaxed(E) ) {
for( int k=0; k<p; ++k ) {
ASSERT( fam[k].message==(k==0 ? (T)-1 : 0), "incomplete round-robin?" );
@@ -996,13 +1383,13 @@ class SparseValueSet<float>: public SparseFloatSet<float> {};
template<>
class SparseValueSet<double>: public SparseFloatSet<double> {};
-template<typename T>
-class HammerAssignment: NoAssign {
+template<typename T, bool aligned>
+class HammerAssignment: AlignedAtomic<T,aligned> {
tbb::atomic<T>& x;
const char* name;
SparseValueSet<T> set;
public:
- HammerAssignment( tbb::atomic<T>& x_, const char* name_ ) : x(x_), name(name_) {}
+ HammerAssignment(const char* name_ ) : x(HammerAssignment::construct_atomic()), name(name_) {}
void operator()( int k ) const {
const int n = 1000000;
if( k ) {
@@ -1037,34 +1424,10 @@ template<typename T> void TestAssignmentSignature( T& (T::*)(const T&) ) {}
#pragma warning( disable: 4355 4800 )
#endif
-template<typename T>
+template<typename T, bool aligned>
void TestAssignment( const char* name ) {
TestAssignmentSignature( &tbb::atomic<T>::operator= );
- tbb::atomic<T> x;
- x = T(0);
- NativeParallelFor( 2, HammerAssignment<T>( x, name ) );
-#if __TBB_x86_32 && (__linux__ || __FreeBSD__ || _WIN32)
- if( sizeof(T)==8 ) {
- // Some compilers for IA-32 fail to provide 8-byte alignment of objects on the stack,
- // even if the object specifies 8-byte alignment. On such platforms, the IA-32 implementation
- // of atomic<long long> and atomic<unsigned long long> use different tactics depending upon
- // whether the object is properly aligned or not. The following abusive test ensures that we
- // cover both the proper and improper alignment cases, one with the x above and the other with
- // the y below, perhaps not respectively.
-
- // Allocate space big enough to always contain 8-byte locations that are aligned and misaligned.
- char raw_space[15];
- // Set delta to 0 if x is aligned, 4 otherwise.
- uintptr_t delta = ((reinterpret_cast<uintptr_t>(&x)&7) ? 0 : 4);
- // y crosses 8-byte boundary if and only if x does not cross.
- tbb::atomic<T>& y = *reinterpret_cast<tbb::atomic<T>*>((reinterpret_cast<uintptr_t>(&raw_space[7+delta])&~7u) - delta);
- // Assertion checks that y really did end up somewhere inside "raw_space".
- ASSERT( raw_space<=reinterpret_cast<char*>(&y), "y starts before raw_space" );
- ASSERT( reinterpret_cast<char*>(&y+1) <= raw_space+sizeof(raw_space), "y starts after raw_space" );
- y = T(0);
- NativeParallelFor( 2, HammerAssignment<T>( y, name ) );
- }
-#endif /* __TBB_x86_32 && (__linux__ || __FreeBSD__ || _WIN32) */
+ NativeParallelFor( 2, HammerAssignment<T,aligned>(name ) );
}
static const unsigned Primes[] = {
@@ -1092,16 +1455,17 @@ public:
}
};
-template <typename T, LoadStoreExpression E>
-class ArbitrationBody : NoAssign, Harness::NoAfterlife {
+template <typename T, bool aligned, LoadStoreExpression E>
+class DekkerArbitrationBody : NoAssign, Harness::NoAfterlife {
typedef LoadStoreTraits<T, E> trait;
mutable FastRandom my_rand;
static const unsigned short c_rand_ceil = 10;
-
- static tbb::atomic<T> s_ready[2];
- static tbb::atomic<T> s_turn;
- static volatile bool s_inside;
+ mutable AlignedAtomic<T,aligned> s_ready_storage[2];
+ mutable AlignedAtomic<T,aligned> s_turn_storage;
+ mutable tbb::atomic<T>* s_ready[2];
+ tbb::atomic<T>& s_turn;
+ mutable volatile bool s_inside;
public:
void operator() ( int id ) const {
@@ -1110,11 +1474,11 @@ public:
cleared = T(0),
signaled = T(1);
for ( int i = 0; i < 100000; ++i ) {
- trait::store( s_ready[me], signaled );
+ trait::store( *s_ready[me], signaled );
trait::store( s_turn, other );
T r, t;
for ( int j = 0; ; ++j ) {
- trait::load(r, s_ready[(uintptr_t)other]);
+ trait::load(r, *s_ready[(uintptr_t)other]);
trait::load(t, s_turn);
if ( r != signaled || t != other )
break;
@@ -1133,38 +1497,60 @@ public:
s_inside = false;
ASSERT( !s_inside, "Peterson lock is broken - some fences are missing" );
// leaving critical section
- trait::store( s_ready[me], cleared );
+ trait::store( *s_ready[me], cleared );
spin = my_rand.get() % c_rand_ceil;
for ( volatile int j = 0; j < spin; ++j )
continue;
}
}
- ArbitrationBody () : my_rand((unsigned)(uintptr_t)this) {}
+ DekkerArbitrationBody ()
+ : my_rand((unsigned)(uintptr_t)this)
+ , s_turn(s_turn_storage.construct_atomic())
+ , s_inside (false)
+ {
+ //atomics pointed to by s_ready and s_turn will be zeroed by the
+ //according construct_atomic() calls
+ s_ready[0] = &s_ready_storage[0].construct_atomic();
+ s_ready[1] = &s_ready_storage[1].construct_atomic();
+ }
};
-template<typename T, LoadStoreExpression E> tbb::atomic<T> ArbitrationBody<T, E>::s_ready[2];
-template<typename T, LoadStoreExpression E> tbb::atomic<T> ArbitrationBody<T, E>::s_turn;
-template<typename T, LoadStoreExpression E> volatile bool ArbitrationBody<T, E>::s_inside = false;
-
-template <typename T, LoadStoreExpression E>
+template <typename T, bool aligned, LoadStoreExpression E>
void TestDekkerArbitration () {
- NativeParallelFor( 2, ArbitrationBody<T, E>() );
+ NativeParallelFor( 2, DekkerArbitrationBody<T,aligned, E>() );
}
template<typename T>
void TestParallel( const char* name ) {
- TestLoadAndStoreFences<T, UseOperators>(name);
- TestLoadAndStoreFences<T, UseImplicitAcqRel>(name);
- TestLoadAndStoreFences<T, UseExplicitFullyFenced>(name);
- TestLoadAndStoreFences<T, UseExplicitAcqRel>(name);
- TestLoadAndStoreFences<T, UseExplicitRelaxed>(name);
- TestLoadAndStoreFences<T, UseGlobalHelperFullyFenced>(name);
- TestLoadAndStoreFences<T, UseGlobalHelperAcqRel>(name);
- TestLoadAndStoreFences<T, UseGlobalHelperRelaxed>(name);
- TestAssignment<T>(name);
- TestDekkerArbitration<T, UseExplicitFullyFenced>();
- TestDekkerArbitration<T, UseGlobalHelperFullyFenced>();
+ //TODO: looks like there are no tests for operations other than load/store ?
+#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN
+ if (sizeof(T)==8){
+ TestLoadAndStoreFences<T, false, UseOperators>(name);
+ TestLoadAndStoreFences<T, false, UseImplicitAcqRel>(name);
+ TestLoadAndStoreFences<T, false, UseExplicitFullyFenced>(name);
+ TestLoadAndStoreFences<T, false, UseExplicitAcqRel>(name);
+ TestLoadAndStoreFences<T, false, UseExplicitRelaxed>(name);
+ TestLoadAndStoreFences<T, false, UseGlobalHelperFullyFenced>(name);
+ TestLoadAndStoreFences<T, false, UseGlobalHelperAcqRel>(name);
+ TestLoadAndStoreFences<T, false, UseGlobalHelperRelaxed>(name);
+ TestAssignment<T,false>(name);
+ TestDekkerArbitration<T, false, UseExplicitFullyFenced>();
+ TestDekkerArbitration<T, false, UseGlobalHelperFullyFenced>();
+ }
+#endif
+
+ TestLoadAndStoreFences<T, true, UseOperators>(name);
+ TestLoadAndStoreFences<T, true, UseImplicitAcqRel>(name);
+ TestLoadAndStoreFences<T, true, UseExplicitFullyFenced>(name);
+ TestLoadAndStoreFences<T, true, UseExplicitAcqRel>(name);
+ TestLoadAndStoreFences<T, true, UseExplicitRelaxed>(name);
+ TestLoadAndStoreFences<T, true, UseGlobalHelperFullyFenced>(name);
+ TestLoadAndStoreFences<T, true, UseGlobalHelperAcqRel>(name);
+ TestLoadAndStoreFences<T, true, UseGlobalHelperRelaxed>(name);
+ TestAssignment<T,true>(name);
+ TestDekkerArbitration<T, true, UseExplicitFullyFenced>();
+ TestDekkerArbitration<T, true, UseGlobalHelperFullyFenced>();
}
#endif // __TBB_TEST_SKIP_PIC_MODE || __TBB_TEST_SKIP_BUILTINS_MODE
diff --git a/src/test/test_blocked_range.cpp b/src/test/test_blocked_range.cpp
index cf53d78..d6d1290 100644
--- a/src/test/test_blocked_range.cpp
+++ b/src/test/test_blocked_range.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_blocked_range2d.cpp b/src/test/test_blocked_range2d.cpp
index 175985f..d04fcc0 100644
--- a/src/test/test_blocked_range2d.cpp
+++ b/src/test/test_blocked_range2d.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_blocked_range3d.cpp b/src/test/test_blocked_range3d.cpp
index 27b5833..9d1ee19 100644
--- a/src/test/test_blocked_range3d.cpp
+++ b/src/test/test_blocked_range3d.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_broadcast_node.cpp b/src/test/test_broadcast_node.cpp
index 39f4b43..a362a29 100644
--- a/src/test/test_broadcast_node.cpp
+++ b/src/test/test_broadcast_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -28,6 +28,7 @@
#include "harness.h"
#include "tbb/flow_graph.h"
+#include "tbb/task.h"
#include "tbb/atomic.h"
@@ -63,11 +64,13 @@ public:
return v;
}
- /* override */ bool try_put( const T &v ) {
+ /* override */ tbb::task * try_put_task( const T &v ) {
++my_counters[(int)v];
- return true;
+ return const_cast<tbb::task *>(tbb::flow::interface6::SUCCESSFULLY_ENQUEUED);
}
+ /*override*/void reset_receiver() { }
+
};
template< typename T >
diff --git a/src/test/test_buffer_node.cpp b/src/test/test_buffer_node.cpp
index 6165078..178825a 100644
--- a/src/test/test_buffer_node.cpp
+++ b/src/test/test_buffer_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_cache_aligned_allocator.cpp b/src/test/test_cache_aligned_allocator.cpp
index c194cbc..59f1851 100644
--- a/src/test/test_cache_aligned_allocator.cpp
+++ b/src/test/test_cache_aligned_allocator.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_cache_aligned_allocator_STL.cpp b/src/test/test_cache_aligned_allocator_STL.cpp
index 1cb6dc4..71c0d6b 100644
--- a/src/test/test_cache_aligned_allocator_STL.cpp
+++ b/src/test/test_cache_aligned_allocator_STL.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_cilk_common.h b/src/test/test_cilk_common.h
index ce7162b..474a099 100644
--- a/src/test/test_cilk_common.h
+++ b/src/test/test_cilk_common.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_cilk_dynamic_load.cpp b/src/test/test_cilk_dynamic_load.cpp
index 57630e9..645d82a 100644
--- a/src/test/test_cilk_dynamic_load.cpp
+++ b/src/test/test_cilk_dynamic_load.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -39,7 +39,7 @@
//2) Cilk, and it should be dynamically loaded with dlopen/LoadLibrary (possibly via a 3rd party module);
//3) TBB again;
//4) Cilk again.
-#define HEAVY_NESTED_INTEROP_SUPPORT __INTEL_COMPILER_BUILD_DATE < 20110427
+#define HEAVY_NESTED_INTEROP_SUPPORT ( __INTEL_COMPILER_BUILD_DATE < 20110427 )
#if __TBB_CILK_INTEROP && CILK_SYMBOLS_VISIBLE && !CILK_LINKAGE_BROKEN && HEAVY_NESTED_INTEROP_SUPPORT
diff --git a/src/test/test_cilk_interop.cpp b/src/test/test_cilk_interop.cpp
index 8c68ae9..d5506e5 100644
--- a/src/test/test_cilk_interop.cpp
+++ b/src/test/test_cilk_interop.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_combinable.cpp b/src/test/test_combinable.cpp
index dad8451..255360b 100644
--- a/src/test/test_combinable.cpp
+++ b/src/test/test_combinable.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_concurrent_hash_map.cpp b/src/test/test_concurrent_hash_map.cpp
index 50b6915..9bc65db 100644
--- a/src/test/test_concurrent_hash_map.cpp
+++ b/src/test/test_concurrent_hash_map.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -86,7 +86,7 @@ namespace tbb {
tbb::concurrent_hash_map<UserDefinedKeyType,int> TestInstantiationWithUserDefinedKeyType;
-// Test whether a sufficient set of headers were included to instantiate a concurernt_hash_map. OSS Bug #120 (& #130):
+// Test whether a sufficient set of headers were included to instantiate a concurrent_hash_map. OSS Bug #120 (& #130):
// http://www.threadingbuildingblocks.org/bug_desc.php?id=120
tbb::concurrent_hash_map<std::pair<std::pair<int,std::string>,const char*>,int> TestInstantiation;
diff --git a/src/test/test_concurrent_lru_cache.cpp b/src/test/test_concurrent_lru_cache.cpp
index 5361fe0..28f8ea8 100644
--- a/src/test/test_concurrent_lru_cache.cpp
+++ b/src/test/test_concurrent_lru_cache.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -72,9 +72,9 @@ namespace helpers{
}
namespace helpers{
template<class T> void ignore( const T& ) { }
- //TODO: add test cases for prevent_optimizng_out function
+ //TODO: add test cases for prevent_optimizing_out function
template<typename type>
- void prevent_optimizng_out(type volatile const& s){
+ void prevent_optimizing_out(type volatile const& s){
volatile const type* dummy = &s;
ignore(dummy);
}
@@ -101,44 +101,44 @@ namespace helpers{
};
template <typename counter_type = size_t>
- struct object_instanses_counting_type{
+ struct object_instances_counting_type{
counter_type * m_p_count;
- object_instanses_counting_type(): m_p_count (new counter_type){*m_p_count =1; } //to overcome absense of constructor in tbb::atomic
- ~object_instanses_counting_type(){ if (! --(*m_p_count)){delete(m_p_count);}}
- object_instanses_counting_type(object_instanses_counting_type const& other): m_p_count(other.m_p_count){
+ object_instances_counting_type(): m_p_count (new counter_type){*m_p_count =1; } //to overcome absense of constructor in tbb::atomic
+ ~object_instances_counting_type(){ if (! --(*m_p_count)){delete(m_p_count);}}
+ object_instances_counting_type(object_instances_counting_type const& other): m_p_count(other.m_p_count){
++(*m_p_count);
}
- object_instanses_counting_type& operator=(object_instanses_counting_type other){
+ object_instances_counting_type& operator=(object_instances_counting_type other){
std::swap(this->m_p_count,other.m_p_count);
return *this;
}
size_t instances_count()const {return *m_p_count;}
};
- typedef object_instanses_counting_type<> object_instanses_counting_serial_type;
- typedef object_instanses_counting_type<tbb::atomic<std::size_t> > object_instanses_counting_concurent_type;
+ typedef object_instances_counting_type<> object_instances_counting_serial_type;
+ typedef object_instances_counting_type<tbb::atomic<std::size_t> > object_instances_counting_concurrent_type;
- namespace object_instanses_counting_type_test_cases{
+ namespace object_instances_counting_type_test_cases{
namespace serial_tests{
- TEST_CASE_WITH_FIXTURE(test_object_instanses_counting_type_creation,empty_fixture){
- ASSERT(object_instanses_counting_serial_type().instances_count()==1,"newly created instance by definition has instances_count equal to 1");
+ TEST_CASE_WITH_FIXTURE(test_object_instances_counting_type_creation,empty_fixture){
+ ASSERT(object_instances_counting_serial_type().instances_count()==1,"newly created instance by definition has instances_count equal to 1");
}
- TEST_CASE_WITH_FIXTURE(test_object_instanses_counting_type_copy,empty_fixture){
- object_instanses_counting_serial_type source;
- ASSERT(object_instanses_counting_serial_type(source).instances_count()==2,"copy should increase ref count");
+ TEST_CASE_WITH_FIXTURE(test_object_instances_counting_type_copy,empty_fixture){
+ object_instances_counting_serial_type source;
+ ASSERT(object_instances_counting_serial_type(source).instances_count()==2,"copy should increase ref count");
}
- TEST_CASE_WITH_FIXTURE(test_object_instanses_counting_type_assignment,empty_fixture){
- object_instanses_counting_serial_type source;
- object_instanses_counting_serial_type assigned;
+ TEST_CASE_WITH_FIXTURE(test_object_instances_counting_type_assignment,empty_fixture){
+ object_instances_counting_serial_type source;
+ object_instances_counting_serial_type assigned;
assigned = source;
ASSERT(source.instances_count()==2,"assign should increase ref count");
ASSERT(assigned.instances_count()==2,"assign should increase ref count");
}
}
- namespace concurent_tests{
- typedef native_for_concurrent_op_repeated<object_instanses_counting_concurent_type> native_for_concurrent_op;
+ namespace concurrent_tests{
+ typedef native_for_concurrent_op_repeated<object_instances_counting_concurrent_type> native_for_concurrent_op;
struct native_for_single_op_repeated_fixture{
- object_instanses_counting_concurent_type source;
+ object_instances_counting_concurrent_type source;
void run_native_for_and_assert_source_is_unique(native_for_concurrent_op::test_function_pointer_type operation,const char* msg){
//TODO: refactor number of threads into separate fixture
const size_t number_of_threads = min(4,tbb::task_scheduler_init::default_num_threads());
@@ -149,18 +149,18 @@ namespace helpers{
}
};
- TEST_CASE_WITH_FIXTURE(test_object_instanses_counting_type_copy,native_for_single_op_repeated_fixture){
- struct _{ static void copy(object_instanses_counting_concurent_type& source){
- object_instanses_counting_concurent_type copy(source);
- helpers::prevent_optimizng_out(copy);
+ TEST_CASE_WITH_FIXTURE(test_object_instances_counting_type_copy,native_for_single_op_repeated_fixture){
+ struct _{ static void copy(object_instances_counting_concurrent_type& source){
+ object_instances_counting_concurrent_type copy(source);
+ helpers::prevent_optimizing_out(copy);
}};
run_native_for_and_assert_source_is_unique(&_::copy,"reference counting during copy construction/destruction is not thread safe ?");
}
- TEST_CASE_WITH_FIXTURE(test_object_instanses_counting_type_assignment,native_for_single_op_repeated_fixture){
- struct _{ static void assign(object_instanses_counting_concurent_type& source){
- object_instanses_counting_concurent_type assigned;
+ TEST_CASE_WITH_FIXTURE(test_object_instances_counting_type_assignment,native_for_single_op_repeated_fixture){
+ struct _{ static void assign(object_instances_counting_concurrent_type& source){
+ object_instances_counting_concurrent_type assigned;
assigned = source;
- helpers::prevent_optimizng_out(assigned);
+ helpers::prevent_optimizing_out(assigned);
}};
run_native_for_and_assert_source_is_unique(&_::assign,"reference counting during assigning/destruction is not thread safe ?");
}
@@ -236,7 +236,7 @@ namespace serial_tests{
}
}
namespace helpers{
- using ::helpers::object_instanses_counting_serial_type;
+ using ::helpers::object_instances_counting_serial_type;
}
namespace helpers{
template<typename value_type>
@@ -250,9 +250,9 @@ namespace serial_tests{
struct instance_counting_fixture{
static const size_t number_of_lru_history_items = 8;
- typedef helpers::clonning_function<helpers::object_instanses_counting_serial_type> cloner_type;
- typedef get_lru_cache_type::apply<size_t,helpers::object_instanses_counting_serial_type,cloner_type>::type cache_type;
- helpers::object_instanses_counting_serial_type source;
+ typedef helpers::clonning_function<helpers::object_instances_counting_serial_type> cloner_type;
+ typedef get_lru_cache_type::apply<size_t,helpers::object_instances_counting_serial_type,cloner_type>::type cache_type;
+ helpers::object_instances_counting_serial_type source;
cloner_type cloner;
cache_type cache;
@@ -292,9 +292,9 @@ namespace serial_tests{
struct filled_instance_counting_fixture_with_external_map{
static const size_t number_of_lru_history_items = 8;
- typedef helpers::map_searcher<size_t,helpers::object_instanses_counting_serial_type> map_searcher_type;
+ typedef helpers::map_searcher<size_t,helpers::object_instances_counting_serial_type> map_searcher_type;
typedef map_searcher_type::map_type objects_map_type;
- typedef get_lru_cache_type::apply<size_t,helpers::object_instanses_counting_serial_type,map_searcher_type>::type cache_type;
+ typedef get_lru_cache_type::apply<size_t,helpers::object_instances_counting_serial_type,map_searcher_type>::type cache_type;
map_searcher_type::map_type objects_map;
cache_type cache;
filled_instance_counting_fixture_with_external_map():cache(map_searcher_type(objects_map),number_of_lru_history_items){}
@@ -329,7 +329,7 @@ namespace serial_tests{
TEST_CASE_WITH_FIXTURE(test_live_handler_object_is_ref_counted,filled_instance_counting_fixture_with_external_map){
cache_type::handle h = cache[0];
{
- cache_type::handle h = cache[0];
+ cache_type::handle h1 = cache[0];
}
//cause eviction
fill_up_cache(1,number_of_lru_history_items+2);
@@ -339,7 +339,7 @@ namespace serial_tests{
}
-namespace concurency_tests{
+namespace concurrency_tests{
namespace helpers{
using namespace ::helpers;
}
@@ -362,9 +362,9 @@ namespace concurency_tests{
static const size_t number_of_lru_history_items = 8;
static const size_t array_size = 16*number_of_lru_history_items;
- typedef helpers::array_searcher<size_t,helpers::object_instanses_counting_concurent_type,array_size> array_searcher_type;
+ typedef helpers::array_searcher<size_t,helpers::object_instances_counting_concurrent_type,array_size> array_searcher_type;
typedef array_searcher_type::array_type objects_array_type;
- typedef get_lru_cache_type::apply<size_t,helpers::object_instanses_counting_concurent_type,array_searcher_type>::type cache_type;
+ typedef get_lru_cache_type::apply<size_t,helpers::object_instances_counting_concurrent_type,array_searcher_type>::type cache_type;
array_searcher_type::array_type objects_array;
cache_type cache;
filled_instance_counting_fixture_with_external_array():cache(array_searcher_type(objects_array),number_of_lru_history_items){}
@@ -390,12 +390,12 @@ namespace concurency_tests{
//TODO: make this more reproducible
//TODO: split this test case in two parts
- TEST_CASE_WITH_FIXTURE(correctness_of_braces_and_hanlde_destructor,filled_instance_counting_fixture_with_external_array){
- typedef correctness_of_braces_and_hanlde_destructor self_type;
+ TEST_CASE_WITH_FIXTURE(correctness_of_braces_and_handle_destructor,filled_instance_counting_fixture_with_external_array){
+ typedef correctness_of_braces_and_handle_destructor self_type;
struct _{static void use_cache(self_type& tc){
for (size_t i=0;i<array_size;++i){
cache_type::handle h=tc.cache[i];
- helpers::prevent_optimizng_out(h.value());
+ helpers::prevent_optimizing_out(h.value());
}
}};
diff --git a/src/test/test_concurrent_monitor.cpp b/src/test/test_concurrent_monitor.cpp
index bb481fb..e997d0c 100644
--- a/src/test/test_concurrent_monitor.cpp
+++ b/src/test/test_concurrent_monitor.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_concurrent_priority_queue.cpp b/src/test/test_concurrent_priority_queue.cpp
index 8e0334f..7d82765 100644
--- a/src/test/test_concurrent_priority_queue.cpp
+++ b/src/test/test_concurrent_priority_queue.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+#include "harness_defs.h"
#include "tbb/concurrent_priority_queue.h"
#include "tbb/atomic.h"
#include "harness.h"
diff --git a/src/test/test_concurrent_queue.cpp b/src/test/test_concurrent_queue.cpp
index 146d743..1e7f5ec 100644
--- a/src/test/test_concurrent_queue.cpp
+++ b/src/test/test_concurrent_queue.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -27,6 +27,7 @@
*/
#define NOMINMAX
+#include "harness_defs.h"
#include "test_concurrent_queue.h"
#include "tbb/concurrent_queue.h"
#include "tbb/tick_count.h"
@@ -47,11 +48,12 @@
static tbb::atomic<long> FooConstructed;
static tbb::atomic<long> FooDestroyed;
+enum state_t{
+ LIVE=0x1234,
+ DEAD=0xDEAD
+};
+
class Foo {
- enum state_t{
- LIVE=0x1234,
- DEAD=0xDEAD
- };
state_t state;
public:
int thread_id;
@@ -69,8 +71,8 @@ public:
ASSERT( state==LIVE, NULL );
++FooDestroyed;
state=DEAD;
- thread_id=0xDEAD;
- serial=0xDEAD;
+ thread_id=DEAD;
+ serial=DEAD;
}
void operator=( const Foo& item ) {
ASSERT( item.state==LIVE, NULL );
@@ -103,10 +105,6 @@ static long MaxFooCount = 0;
static const long Threshold = 400;
class FooEx {
- enum state_t{
- LIVE=0x1234,
- DEAD=0xDEAD
- };
state_t state;
public:
int serial;
@@ -125,7 +123,7 @@ public:
ASSERT( state==LIVE, NULL );
++FooExDestroyed;
state=DEAD;
- serial=0xDEAD;
+ serial=DEAD;
}
void operator=( FooEx& item ) {
ASSERT( item.state==LIVE, NULL );
@@ -171,8 +169,8 @@ struct Body: NoAssign {
long sum = 0;
for( long j=0; j<M; ++j ) {
T f;
- f.thread_id = 0xDEAD;
- f.serial = 0xDEAD;
+ f.thread_id = DEAD;
+ f.serial = DEAD;
bool prepopped = false;
if( j&1 ) {
prepopped = CALL_TRY_POP(queue,f,j);
@@ -316,10 +314,6 @@ void TestPushPop( size_t prefill, ptrdiff_t capacity, int nthread ) {
}
class Bar {
- enum state_t {
- LIVE=0x1234,
- DEAD=0xDEAD
- };
state_t state;
public:
ptrdiff_t my_id;
@@ -343,8 +337,8 @@ public:
} ;
bool operator==(const Bar& bar1, const Bar& bar2) {
- ASSERT( bar1.state==Bar::LIVE, NULL );
- ASSERT( bar2.state==Bar::LIVE, NULL );
+ ASSERT( bar1.state==LIVE, NULL );
+ ASSERT( bar2.state==LIVE, NULL );
return bar1.my_id == bar2.my_id;
}
@@ -392,10 +386,6 @@ public:
};
class BarEx {
- enum state_t {
- LIVE=0x1234,
- DEAD=0xDEAD
- };
static int count;
public:
state_t state;
@@ -436,8 +426,8 @@ int BarEx::count = 0;
BarEx::mode_t BarEx::mode = BarEx::PREPARATION;
bool operator==(const BarEx& bar1, const BarEx& bar2) {
- ASSERT( bar1.state==BarEx::LIVE, NULL );
- ASSERT( bar2.state==BarEx::LIVE, NULL );
+ ASSERT( bar1.state==LIVE, NULL );
+ ASSERT( bar2.state==LIVE, NULL );
ASSERT( (bar1.my_id ^ bar1.my_tilda_id) == -1, NULL );
ASSERT( (bar2.my_id ^ bar2.my_tilda_id) == -1, NULL );
return bar1.my_id==bar2.my_id && bar1.my_tilda_id==bar2.my_tilda_id;
diff --git a/src/test/test_concurrent_queue.h b/src/test/test_concurrent_queue.h
index 706a9c3..9e5b39b 100644
--- a/src/test/test_concurrent_queue.h
+++ b/src/test/test_concurrent_queue.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_concurrent_unordered.cpp b/src/test/test_concurrent_unordered.cpp
index aafa630..c72a5fe 100644
--- a/src/test/test_concurrent_unordered.cpp
+++ b/src/test/test_concurrent_unordered.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -31,17 +31,30 @@
#define __TBB_EXTRA_DEBUG 1
#include "tbb/concurrent_unordered_map.h"
#include "tbb/concurrent_unordered_set.h"
+#include "harness_assert.h"
+#if !__TBB_TEST_SECONDARY
#include "tbb/parallel_for.h"
#include "tbb/tick_count.h"
#include <stdio.h>
#include "harness.h"
+// Test that unordered containers do not require keys have default constructors.
+#define __HARNESS_CHECKTYPE_DEFAULT_CTOR 0
+#include "harness_checktype.h"
+#undef __HARNESS_CHECKTYPE_DEFAULT_CTOR
#include "harness_allocator.h"
+
using namespace std;
typedef local_counting_allocator<debug_allocator<std::pair<const int,int>,std::allocator> > MyAllocator;
typedef tbb::concurrent_unordered_map<int, int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MyMap;
+typedef tbb::concurrent_unordered_map<int, check_type<int>, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MyCheckedMap;
+typedef tbb::concurrent_unordered_multimap<int, int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MyMultiMap;
+typedef tbb::concurrent_unordered_multimap<int, check_type<int>, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MyCheckedMultiMap;
typedef tbb::concurrent_unordered_set<int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MySet;
+typedef tbb::concurrent_unordered_set<check_type<int>, tbb::tbb_hash<check_type<int> >, std::equal_to<check_type<int> >, MyAllocator> MyCheckedSet;
+typedef tbb::concurrent_unordered_multiset<int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MyMultiSet;
+typedef tbb::concurrent_unordered_multiset<check_type<int>, tbb::tbb_hash<check_type<int> >, std::equal_to<check_type<int> >, MyAllocator> MyCheckedMultiSet;
#define CheckAllocatorE(t,a,f) CheckAllocator(t,a,f,true,__LINE__)
#define CheckAllocatorA(t,a,f) CheckAllocator(t,a,f,false,__LINE__)
@@ -121,16 +134,76 @@ struct SpecialTests <MyMap>
// size_type size() const;
ASSERT(ccont.size() == 1, "Concurrent container size incorrect");
- ASSERT(cont[1] == 2, "Concurrent container size incorrect");
+ ASSERT(cont[1] == 2, "Concurrent container value incorrect");
// mapped_type& at( const key_type& k );
// const mapped_type& at(const key_type& k) const;
- ASSERT(cont.at(1) == 2, "Concurrent container size incorrect");
- ASSERT(ccont.at(1) == 2, "Concurrent container size incorrect");
+ ASSERT(cont.at(1) == 2, "Concurrent container value incorrect");
+ ASSERT(ccont.at(1) == 2, "Concurrent container value incorrect");
// iterator find(const key_type& k);
MyMap::const_iterator it = cont.find(1);
ASSERT(it != cont.end() && Value<MyMap>::get(*(it)) == 2, "Element with key 1 not properly found");
+ cont.unsafe_erase(it);
+ it = cont.find(1);
+ ASSERT(it == cont.end(), "Element with key 1 not properly erased");
+
+ REMARK("passed -- specialized %s tests\n", str);
+ }
+};
+
+// test assumes the unordered multimap puts items in ascending order, and the insertions
+// occur at the end of a range. This assumption may not always be valid.
+template <>
+struct SpecialTests <MyMultiMap>
+{
+#define VALUE1 7
+#define VALUE2 2
+ static void Test(const char *str)
+ {
+ MyMultiMap cont(0);
+ const MyMultiMap &ccont(cont);
+ // mapped_type& operator[](const key_type& k);
+ cont.insert(make_pair(1, VALUE1));
+
+ // bool empty() const;
+ ASSERT(!ccont.empty(), "Concurrent container empty after adding an element");
+
+ // size_type size() const;
+ ASSERT(ccont.size() == 1, "Concurrent container size incorrect");
+ ASSERT((*(cont.begin())).second == VALUE1, "Concurrent container value incorrect");
+ ASSERT((*(cont.equal_range(1)).first).second == VALUE1, "Improper value from equal_range");
+ ASSERT((cont.equal_range(1)).second == cont.end(), "Improper iterator from equal_range");
+
+ cont.insert(make_pair(1,VALUE2));
+
+ // bool empty() const;
+ ASSERT(!ccont.empty(), "Concurrent container empty after adding an element");
+
+ // size_type size() const;
+ ASSERT(ccont.size() == 2, "Concurrent container size incorrect");
+ ASSERT((*(cont.begin())).second == VALUE1, "Concurrent container value incorrect");
+ ASSERT((*(cont.equal_range(1)).first).second == VALUE1, "Improper value from equal_range");
+ ASSERT((cont.equal_range(1)).second == cont.end(), "Improper iterator from equal_range");
+
+ // check that the second value is part of the range.
+ // though I am not sure there are guarantees what order the insertions appear in the range
+ // if the order differs the ASSERT above will fail already.
+ std::pair<MyMultiMap::iterator, MyMultiMap::iterator> range = cont.equal_range(1);
+ MyMultiMap::iterator ii = range.first;
+ ++ii;
+ ASSERT((*ii).second == VALUE2, "Improper value for second insertion");
+
+ cont.insert(make_pair(0, 4));
+
+ // bool empty() const;
+ ASSERT(!ccont.empty(), "Concurrent container empty after adding an element");
+
+ // size_type size() const;
+ ASSERT(ccont.size() == 3, "Concurrent container size incorrect");
+ ASSERT((*(cont.begin())).second == 4, "Concurrent container value incorrect");
+ ASSERT((*(cont.equal_range(1)).first).second == VALUE1, "Improper value from equal_range");
+ ASSERT((cont.equal_range(1)).second == cont.end(), "Improper iterator from equal_range");
REMARK("passed -- specialized %s tests\n", str);
}
@@ -321,7 +394,7 @@ void test_basic(const char * str)
ASSERT(newcont.count(99) == 1, "Element with key 99 not present after swap");
ASSERT(T::allow_multimapping ? (cont.size() == 3) : (cont.size() == 2), "Wrong number of elements after swap");
- REMARK("passed -- basic %S tests\n", str);
+ REMARK("passed -- basic %s tests\n", str);
#if defined (VERBOSE)
REMARK("container dump debug:\n");
@@ -345,41 +418,44 @@ template<typename T>
class FillTable: NoAssign {
T &table;
const int items;
+ bool my_asymptotic;
typedef std::pair<typename T::iterator, bool> pairIB;
public:
- FillTable(T &t, int i) : table(t), items(i) {
+ FillTable(T &t, int i, bool asymptotic) : table(t), items(i), my_asymptotic(asymptotic) {
ASSERT( !(items&1) && items > 100, NULL);
}
void operator()(int threadn) const {
if( threadn == 0 ) { // Fill even keys forward (single thread)
bool last_inserted = true;
for( int i = 0; i < items; i+=2 ) {
- pairIB pib = table.insert(Value<T>::make(i));
- ASSERT(Value<T>::get(*(pib.first)) == i, "Element not properly inserted");
+ pairIB pib = table.insert(Value<T>::make(my_asymptotic?1:i));
+ ASSERT(Value<T>::get(*(pib.first)) == (my_asymptotic?1:i), "Element not properly inserted");
ASSERT( last_inserted || !pib.second, "Previous key was not inserted but this is inserted" );
last_inserted = pib.second;
}
} else if( threadn == 1 ) { // Fill even keys backward (single thread)
bool last_inserted = true;
for( int i = items-2; i >= 0; i-=2 ) {
- pairIB pib = table.insert(Value<T>::make(i));
- ASSERT(Value<T>::get(*(pib.first)) == i, "Element not properly inserted");
+ pairIB pib = table.insert(Value<T>::make(my_asymptotic?1:i));
+ ASSERT(Value<T>::get(*(pib.first)) == (my_asymptotic?1:i), "Element not properly inserted");
ASSERT( last_inserted || !pib.second, "Previous key was not inserted but this is inserted" );
last_inserted = pib.second;
}
} else if( !(threadn&1) ) { // Fill odd keys forward (multiple threads)
for( int i = 1; i < items; i+=2 ) {
- pairIB pib = table.insert(Value<T>::make(i));
- ASSERT(Value<T>::get(*(pib.first)) == i, "Element not properly inserted");
+ pairIB pib = table.insert(Value<T>::make(my_asymptotic?1:i));
+ ASSERT(Value<T>::get(*(pib.first)) == (my_asymptotic?1:i), "Element not properly inserted");
}
} else { // Check odd keys backward (multiple threads)
- bool last_found = false;
- for( int i = items-1; i >= 0; i-=2 ) {
- typename T::iterator it = table.find(i);
- if( it != table.end() ) { // found
- ASSERT(Value<T>::get(*it) == i, "Element not properly inserted");
- last_found = true;
- } else ASSERT( !last_found, "Previous key was found but this is not" );
+ if (!my_asymptotic) {
+ bool last_found = false;
+ for( int i = items-1; i >= 0; i-=2 ) {
+ typename T::iterator it = table.find(i);
+ if( it != table.end() ) { // found
+ ASSERT(Value<T>::get(*it) == i, "Element not properly inserted");
+ last_found = true;
+ } else ASSERT( !last_found, "Previous key was found but this is not" );
+ }
}
}
}
@@ -404,11 +480,31 @@ struct ParallelTraverseBody: NoAssign {
}
};
-void CheckRange( AtomicByte array[], int n ) {
- for( int k=0; k<n; ++k ) {
- if( array[k] != 1 ) {
- REPORT("array[%d]=%d\n", k, int(array[k]));
- ASSERT(false,NULL);
+// if multimapping, oddCount is the value that each odd-indexed array element should have.
+// not meaningful for non-multimapped case.
+void CheckRange( AtomicByte array[], int n, bool allowMultiMapping, int oddCount ) {
+ if(allowMultiMapping) {
+ for( int k = 0; k<n; ++k) {
+ if(k%2) {
+ if( array[k] != oddCount ) {
+ REPORT("array[%d]=%d (should be %d)\n", k, int(array[k]), oddCount);
+ ASSERT(false,NULL);
+ }
+ }
+ else {
+ if(array[k] != 2) {
+ REPORT("array[%d]=%d\n", k, int(array[k]));
+ ASSERT(false,NULL);
+ }
+ }
+ }
+ }
+ else {
+ for( int k=0; k<n; ++k ) {
+ if( array[k] != 1 ) {
+ REPORT("array[%d]=%d\n", k, int(array[k]));
+ ASSERT(false,NULL);
+ }
}
}
}
@@ -435,6 +531,16 @@ public:
};
template<>
+class AssignBody<MyCheckedMap>: NoAssign {
+ MyCheckedMap &table;
+public:
+ AssignBody(MyCheckedMap &t) : NoAssign(), table(t) {}
+ void operator()(int i) const {
+ table.insert(MyCheckedMap::value_type(i, check_type<int>(i)));
+ }
+};
+
+template<>
class AssignBody<MySet>: NoAssign {
MySet &table;
public:
@@ -444,56 +550,200 @@ public:
}
};
+template<>
+class AssignBody<MyCheckedSet>: NoAssign {
+ MyCheckedSet &table;
+public:
+ AssignBody(MyCheckedSet &t) : NoAssign(), table(t) {}
+ void operator()(int i) const {
+ table.insert(check_type<int>(i));
+ }
+};
+
+// multiset: for i, inserts i i%3+1 times
+template<>
+class AssignBody<MyMultiSet>: NoAssign {
+ MyMultiSet &table;
+public:
+ AssignBody(MyMultiSet &t) : NoAssign(), table(t) {}
+ void operator()(int i) const {
+ int num = i % 3 + 1;
+ for( int j = 0; j < num; ++j) {
+ table.insert(i);
+ }
+ }
+};
+
+// multiset: for i, inserts i i%3+1 times
+template<>
+class AssignBody<MyCheckedMultiSet>: NoAssign {
+ MyCheckedMultiSet &table;
+public:
+ AssignBody(MyCheckedMultiSet &t) : NoAssign(), table(t) {}
+ void operator()(int i) const {
+ int num = i % 3 + 1;
+ for( int j = 0; j < num; ++j) {
+ table.insert(i);
+ }
+ }
+};
+
+// for multimap insert (i%3)+1 items [i,3*i], [i,3*i+1] ..
+template<>
+class AssignBody<MyMultiMap>: NoAssign {
+ MyMultiMap &table;
+public:
+ AssignBody(MyMultiMap &t) : NoAssign(), table(t) {}
+ void operator()(int i) const {
+ for(int j = 0; j < (i % 3) + 1; ++j) {
+ table.insert(std::pair<int,int>(i,3*i+j-1));
+ }
+ }
+};
+
+// for multimap insert (i%3)+1 items [i,3*i], [i,3*i+1] ..
+template<>
+class AssignBody<MyCheckedMultiMap>: NoAssign {
+ MyCheckedMultiMap &table;
+public:
+ AssignBody(MyCheckedMultiMap &t) : NoAssign(), table(t) {}
+ void operator()(int i) const {
+ for(int j = 0; j < (i % 3) + 1; ++j) {
+ table.insert(std::pair<int,int>(i,3*i+j-1));
+ }
+ }
+};
+
template<typename T>
-void test_concurrent(const char *tablename) {
+void test_concurrent(const char *tablename, bool asymptotic = false) {
#if TBB_USE_ASSERT
int items = 2000;
#else
- int items = 100000;
+ int items = 20000;
#endif
+ int nItemsInserted = 0;
+ int nThreads = 0;
T table(items/1000);
- tbb::tick_count t0 = tbb::tick_count::now();
#if __bgp__
- NativeParallelFor( 6/*min 6*/, FillTable<T>(table, items) );
+ nThreads = 6;
#else
- NativeParallelFor( 16/*min 6*/, FillTable<T>(table, items) );
+ nThreads = 16;
#endif
+ if(T::allow_multimapping) {
+ // even passes (threads 0 & 1) put N/2 items each
+ // odd passes (threads > 1) put N/2 if thread is odd, else checks if even.
+ items = 4*items / (nThreads + 2); // approximately same number of items inserted.
+ nItemsInserted = items + (nThreads-2) * items / 4;
+ }
+ else {
+ nItemsInserted = items;
+ }
+ REMARK("%s items == %d\n", tablename, items);
+ tbb::tick_count t0 = tbb::tick_count::now();
+ NativeParallelFor( nThreads, FillTable<T>(table, items, asymptotic) );
tbb::tick_count t1 = tbb::tick_count::now();
- REMARK( "time for filling '%s' by %d items = %g\n", tablename, items, (t1-t0).seconds() );
- ASSERT( int(table.size()) == items, NULL);
-
- AtomicByte* array = new AtomicByte[items];
- memset( array, 0, items*sizeof(AtomicByte) );
-
- typename T::range_type r = table.range();
- ASSERT((items == CheckRecursiveRange<T,typename T::iterator>(r).first), NULL);
- tbb::parallel_for( r, ParallelTraverseBody<T, typename T::const_range_type>( array, items ));
- CheckRange( array, items );
-
- const T &const_table = table;
- memset( array, 0, items*sizeof(AtomicByte) );
- typename T::const_range_type cr = const_table.range();
- ASSERT((items == CheckRecursiveRange<T,typename T::const_iterator>(cr).first), NULL);
- tbb::parallel_for( cr, ParallelTraverseBody<T, typename T::const_range_type>( array, items ));
- CheckRange( array, items );
- delete[] array;
-
- tbb::parallel_for( 0, items, CheckTable<T>( table ) );
-
+ REMARK( "time for filling '%s' by %d items = %g\n", tablename, table.size(), (t1-t0).seconds() );
+ ASSERT( int(table.size()) == nItemsInserted, NULL);
+
+ if(!asymptotic) {
+ AtomicByte* array = new AtomicByte[items];
+ memset( array, 0, items*sizeof(AtomicByte) );
+
+ typename T::range_type r = table.range();
+ std::pair<int,int> p = CheckRecursiveRange<T,typename T::iterator>(r);
+ ASSERT((nItemsInserted == p.first), NULL);
+ tbb::parallel_for( r, ParallelTraverseBody<T, typename T::const_range_type>( array, items ));
+ CheckRange( array, items, T::allow_multimapping, (nThreads - 1)/2 );
+
+ const T &const_table = table;
+ memset( array, 0, items*sizeof(AtomicByte) );
+ typename T::const_range_type cr = const_table.range();
+ ASSERT((nItemsInserted == CheckRecursiveRange<T,typename T::const_iterator>(cr).first), NULL);
+ tbb::parallel_for( cr, ParallelTraverseBody<T, typename T::const_range_type>( array, items ));
+ CheckRange( array, items, T::allow_multimapping, (nThreads - 1) / 2 );
+ delete[] array;
+
+ tbb::parallel_for( 0, items, CheckTable<T>( table ) );
+ }
+
table.clear();
CheckAllocatorA(table, items+1, items); // one dummy is always allocated
- for(int i=0; i<10000; ++i) {
+ for(int i=0; i<1000; ++i) {
tbb::parallel_for( 0, 8, AssignBody<T>( table ) );
table.clear();
}
}
+#endif //#if !__TBB_TEST_SECONDARY
+
+
+namespace test_select_size_t_constant{
+ __TBB_STATIC_ASSERT((tbb::internal::select_size_t_constant<1234,1234>::value == 1234),"select_size_t_constant::value is not compile time constant");
+// There will be two constant used in the test 32 bit and 64 bit one.
+// The 64 bit constant should chosen so that it 32 bit halves adds up to the 32 bit one ( first constant used in the test).
+// % ~0U is used to sum up 32bit halves of the 64 constant. ("% ~0U" essentially adds the 32-bit "digits", like "%9" adds
+// the digits (modulo 9) of a number in base 10).
+// So iff select_size_t_constant is correct result of the calculation below will be same on both 32bit and 64bit platforms.
+ __TBB_STATIC_ASSERT((tbb::internal::select_size_t_constant<0x12345678U,0x091A2B3C091A2B3CULL>::value % ~0U == 0x12345678U),
+ "select_size_t_constant have chosen the wrong constant");
+
+}
+#if !__TBB_TEST_SECONDARY
+#define INITIALIZATION_TIME_TEST_NAMESPACE initialization_time_test
+#define TEST_INITIALIZATION_TIME_OPERATIONS_NAME test_initialization_time_operations
+void test_initialization_time_operations_external();
+#else
+#define INITIALIZATION_TIME_TEST_NAMESPACE initialization_time_test_external
+#define TEST_INITIALIZATION_TIME_OPERATIONS_NAME test_initialization_time_operations_external
+#endif
+
+namespace INITIALIZATION_TIME_TEST_NAMESPACE{
+ tbb::concurrent_unordered_set<int> static_init_time_set;
+ int any_non_zero_value = 89432;
+ bool static_init_time_inserted = (static_init_time_set.insert(any_non_zero_value)).second;
+ bool static_init_time_found = ((static_init_time_set.find(any_non_zero_value)) != static_init_time_set.end());
+}
+void TEST_INITIALIZATION_TIME_OPERATIONS_NAME(){
+ using namespace INITIALIZATION_TIME_TEST_NAMESPACE;
+ #define LOCATION ",in function: " __TBB_STRING(TEST_INITIALIZATION_TIME_OPERATIONS_NAME)
+ ASSERT(static_init_time_inserted,"failed to insert an item during initialization of global objects" LOCATION);
+ ASSERT(static_init_time_found,"failed to find an item during initialization of global objects" LOCATION);
+
+ bool static_init_time_found_in_main = ((static_init_time_set.find(any_non_zero_value)) != static_init_time_set.end());
+ ASSERT(static_init_time_found_in_main,"failed to find during main() an item inserted during initialization of global objects" LOCATION);
+ #undef LOCATION
+}
+
+#if !__TBB_TEST_SECONDARY
int TestMain () {
test_machine();
- test_basic<MyMap>("concurrent unordered map");
- test_concurrent<MyMap>("concurrent unordered map");
- test_basic<MySet>("concurrent unordered set");
- test_concurrent<MySet>("concurrent unordered set");
+ test_basic<MyMap>("concurrent unordered Map");
+ test_concurrent<MyMap>("concurrent unordered Map");
+ test_basic<MySet>("concurrent unordered Set");
+ test_concurrent<MySet>("concurrent unordered Set");
+ test_basic<MyMultiMap>("concurrent unordered MultiMap");
+ test_concurrent<MyMultiMap>("concurrent unordered MultiMap");
+ test_concurrent<MyMultiMap>("concurrent unordered MultiMap asymptotic", true);
+ test_basic<MyMultiSet>("concurrent unordered MultiSet");
+ test_concurrent<MyMultiSet>("concurrent unordered MultiSet");
+ test_concurrent<MyMultiSet>("concurrent unordered MultiSet asymptotic", true);
+
+ { Check<MyCheckedSet::value_type> checkit; test_basic<MyCheckedSet>("concurrent_unordered_set (checked)"); }
+ { Check<MyCheckedSet::value_type> checkit; test_concurrent<MyCheckedSet>("concurrent unordered set (checked)"); }
+
+ { Check<MyCheckedMultiSet::value_type> checkit; test_basic<MyCheckedMultiSet>("concurrent_unordered_multiset (checked)"); }
+ { Check<MyCheckedMultiSet::value_type> checkit; test_concurrent<MyCheckedMultiSet>("concurrent unordered multiset (checked)"); }
+
+ { Check<MyCheckedMap::value_type> checkit; test_basic<MyCheckedMap>("concurrent unordered map (checked)"); }
+ { Check<MyCheckedMap::value_type> checkit; test_concurrent<MyCheckedMap>("concurrent unordered map (checked)"); }
+
+ { Check<MyCheckedMultiMap::value_type> checkit; test_basic<MyCheckedMultiMap>("concurrent unordered MultiMap (checked)"); }
+ { Check<MyCheckedMultiMap::value_type> checkit; test_concurrent<MyCheckedMultiMap>("concurrent unordered MultiMap (checked)"); }
+
+ test_initialization_time_operations();
+ test_initialization_time_operations_external();
+
return Harness::Done;
}
+#endif //#if !__TBB_TEST_SECONDARY
diff --git a/src/test/test_concurrent_vector.cpp b/src/test/test_concurrent_vector.cpp
index e21d7a1..ae1191d 100644
--- a/src/test/test_concurrent_vector.cpp
+++ b/src/test/test_concurrent_vector.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -639,6 +639,62 @@ void TestConcurrentGrowBy( int nthread ) {
ASSERT( items_allocated == items_freed, NULL);
ASSERT( allocations == frees, NULL);
}
+//TODO: move this to more appropriate place, smth like test_harness.cpp
+void TestArrayLength(){
+ int five_elementh_array[5] = {0};
+ ASSERT(array_length(five_elementh_array)==5,"array_length failed to determine length of non empty non dynamic array");
+}
+
+#if __TBB_INITIALIZER_LISTS_PRESENT
+//TODO: move init list test set to separate header
+//TODO: split into set of tests
+//TODO: add test for no leaks, and correct element lifetime
+//the need for macro comes from desire to test different scenarios where initializer sequence is compile time constant
+#define __TBB_TEST_INIT_LIST_SUITE(FUNC_NAME, CONTAINER, ELEMENT_TYPE, INIT_SEQ) \
+void FUNC_NAME(){ \
+ typedef ELEMENT_TYPE element_type; \
+ typedef CONTAINER<element_type> container_type; \
+ element_type test_seq[] = INIT_SEQ; \
+ container_type expected(test_seq,test_seq + array_length(test_seq)); \
+ \
+ /*test for explicit contructor call*/ \
+ container_type vd (INIT_SEQ,tbb::cache_aligned_allocator<int>()); \
+ ASSERT(vd == expected,"initialization via explicit constructor call with init list failed"); \
+ /*test for explicit contructor call with std::initializer_list*/ \
+ \
+ std::initializer_list<element_type> init_list = INIT_SEQ; \
+ container_type v1 (init_list,tbb::cache_aligned_allocator<int>()); \
+ ASSERT(v1 == expected,"initialization via explicit constructor call with std::initializer_list failed"); \
+ \
+ /*implicit constructor call test*/ \
+ container_type v = INIT_SEQ; \
+ ASSERT(v == expected,"init list constructor failed"); \
+ \
+ /*assignment operator test*/ \
+ /*TODO: count created and destroyed injects to assert that no extra copy of vector was created implicitly*/ \
+ container_type va; \
+ va = INIT_SEQ; \
+ ASSERT(va == expected,"init list operator= failed"); \
+ \
+ container_type vae; \
+ vae.assign(INIT_SEQ); \
+ ASSERT(vae == expected,"init list assign failed"); \
+}
+
+#define __TBB_CVECTOR_TEST_INIT_SEQ {1,2,3,4,5}
+__TBB_TEST_INIT_LIST_SUITE(TestInitListIml,tbb::concurrent_vector,char,__TBB_CVECTOR_TEST_INIT_SEQ )
+#undef __TBB_CVECTOR_TEST_INIT_SEQ
+
+#define __TBB_CVECTOR_TEST_EMPTY_INIT_SEQ {}
+__TBB_TEST_INIT_LIST_SUITE(TestEmptyInitListIml,tbb::concurrent_vector,int,__TBB_CVECTOR_TEST_EMPTY_INIT_SEQ )
+#undef __TBB_CVECTOR_TEST_EMPTY_INIT_SEQ
+
+void TestInitList(){
+ REMARK("testing initializer_list methods \n");
+ TestEmptyInitListIml();
+ TestInitListIml();
+}
+#endif //if __TBB_INITIALIZER_LISTS_PRESENT
//! Test the assignment operator and swap
void TestAssign() {
@@ -990,6 +1046,10 @@ int TestMain () {
#if !TBB_DEPRECATED
TestIteratorTraits<tbb::concurrent_vector<Foo>::iterator,Foo>();
TestIteratorTraits<tbb::concurrent_vector<Foo>::const_iterator,const Foo>();
+ TestArrayLength();
+#if __TBB_INITIALIZER_LISTS_PRESENT
+ TestInitList();
+#endif
TestSequentialFor<FooWithAssign> ();
TestResizeAndCopy();
TestAssign();
diff --git a/src/test/test_condition_variable.h b/src/test/test_condition_variable.h
index febd771..60e1f52 100644
--- a/src/test/test_condition_variable.h
+++ b/src/test/test_condition_variable.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,14 +26,27 @@
the GNU General Public License.
*/
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+ #pragma warning (push)
+ #pragma warning (disable: 4530)
+#endif
+
#include "tbb/compat/condition_variable"
#include "tbb/mutex.h"
#include "tbb/recursive_mutex.h"
#include "tbb/tick_count.h"
#include "tbb/atomic.h"
+#include <stdexcept>
+
#include "harness.h"
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
+
// This test deliberately avoids a "using tbb" statement,
// so that the error of putting types in the wrong namespace will be caught.
@@ -55,13 +68,13 @@ void Counter<M>::flog_once_lock_guard(size_t mode)
if( mode&1 ) {
// Try acquire and release with implicit lock_guard
// precondition: if mutex_type is not a recursive mutex, the calling thread does not own the mutex m.
- // if the prcondition is not met, either dead-lock incorrect 'value' would result in.
+ // if the precondition is not met, either dead-lock incorrect 'value' would result in.
lock_guard<M> lg(mutex);
value = value+1;
} else {
// Try acquire and release with adopt lock_quard
// precodition: the calling thread owns the mutex m.
- // if the prcondition is not met, incorrect 'value' would result in because the thread unlocks
+ // if the precondition is not met, incorrect 'value' would result in because the thread unlocks
// mutex that it does not own.
mutex.lock();
lock_guard<M> lg( mutex, adopt_lock );
@@ -636,7 +649,7 @@ void TestConditionVariable( const char* name, int nthread )
} while( n_visit_to_waitq<=0 || max_waitq_length<unsigned(nthread/2) );
}
-#if TBB_USE_EXCEPTIONS
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
static tbb::atomic<int> err_count;
#define TRY_AND_CATCH_RUNTIME_ERROR(op,msg) \
diff --git a/src/test/test_continue_node.cpp b/src/test/test_continue_node.cpp
index f7f219c..2af5292 100644
--- a/src/test/test_continue_node.cpp
+++ b/src/test/test_continue_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,9 +29,6 @@
#include "harness_graph.h"
#include "tbb/task_scheduler_init.h"
-#include "tbb/spin_mutex.h"
-
-tbb::spin_mutex global_mutex;
#define N 1000
#define MAX_NODES 4
@@ -43,6 +40,14 @@ struct empty_no_assign : private NoAssign {
operator int() { return 0; }
};
+// A class to use as a fake predecessor of continue_node
+struct fake_continue_sender : public tbb::flow::sender<tbb::flow::continue_msg>
+{
+ // Define implementations of virtual methods that are abstract in the base class
+ /*override*/ bool register_successor( successor_type& ) { return false; }
+ /*override*/ bool remove_successor( successor_type& ) { return false; }
+};
+
template< typename InputType >
struct parallel_puts : private NoAssign {
@@ -61,8 +66,9 @@ struct parallel_puts : private NoAssign {
template< typename OutputType >
void run_continue_nodes( int p, tbb::flow::graph& g, tbb::flow::continue_node< OutputType >& n ) {
+ fake_continue_sender fake_sender;
for (size_t i = 0; i < N; ++i) {
- n.register_predecessor( *reinterpret_cast< tbb::flow::sender< tbb::flow::continue_msg > * >(&n) );
+ n.register_predecessor( fake_sender );
}
for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
@@ -127,8 +133,9 @@ void continue_nodes_with_copy( ) {
global_execute_count = Offset;
tbb::flow::continue_node< OutputType > exe_node( g, cf );
+ fake_continue_sender fake_sender;
for (size_t i = 0; i < N; ++i) {
- exe_node.register_predecessor( *reinterpret_cast< tbb::flow::sender< tbb::flow::continue_msg > * >(&exe_node) );
+ exe_node.register_predecessor( fake_sender );
}
for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
diff --git a/src/test/test_critical_section.cpp b/src/test/test_critical_section.cpp
index 59a85b6..f4cc612 100644
--- a/src/test/test_critical_section.cpp
+++ b/src/test/test_critical_section.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_eh_algorithms.cpp b/src/test/test_eh_algorithms.cpp
index 9d5f66b..d4b5a13 100644
--- a/src/test/test_eh_algorithms.cpp
+++ b/src/test/test_eh_algorithms.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -51,14 +51,49 @@
#define INNER_GRAIN (FLAT_GRAIN / OUTER_GRAIN)
tbb::atomic<intptr_t> g_FedTasksCount; // number of tasks added by parallel_do feeder
+tbb::atomic<intptr_t> g_OuterParCalls; // number of actual invocations of the outer construct executed.
+tbb::atomic<intptr_t> g_TGCCancelled; // Number of times a task sees its group cancelled at start
inline intptr_t Existed () { return INT_MAX; }
#include "harness_eh.h"
+/********************************
+ Variables in test
+
+__ Test control variables
+ g_ExceptionInMaster -- only the master thread is allowed to throw. If false, the master cannot throw
+ g_SolitaryException -- only one throw may be executed.
+
+-- controls for ThrowTestException for pipeline tests
+ g_NestedPipelines -- are inner pipelines being run?
+ g_PipelinesStarted -- how many pipelines have run their first filter at least once.
+
+-- Information variables
+
+ g_Master -- Thread ID of the "master" thread
+ In pipelines sometimes the master thread does not participate, so the tests have to be resilient to this.
+
+-- Measurement variables
+
+ g_OuterParCalls -- how many outer parallel ranges or filters started
+ g_TGCCancelled -- how many inner parallel ranges or filters saw task::self().is_cancelled()
+ g_ExceptionsThrown -- number of throws executed (counted in ThrowTestException)
+ g_MasterExecutedThrow -- number of times master thread actually executed a throw
+ g_NonMasterExecutedThrow -- number of times non-master thread actually executed a throw
+ g_ExceptionCaught -- one of PropagatedException or unknown exception was caught. (Other exceptions cause assertions.)
+
+ -- Tallies for the task bodies which have executed (counted in each inner body, sampled in ThrowTestException)
+ g_CurExecuted -- total number of inner ranges or filters which executed
+ g_ExecutedAtLastCatch -- value of g_CurExecuted when last catch was made, 0 if none.
+ g_ExecutedAtFirstCatch -- value of g_CurExecuted when first catch is made, 0 if none.
+ *********************************/
inline void ResetGlobals ( bool throwException = true, bool flog = false ) {
ResetEhGlobals( throwException, flog );
g_FedTasksCount = 0;
+ g_OuterParCalls = 0;
+ g_NestedPipelines = false;
+ g_TGCCancelled = 0;
}
////////////////////////////////////////////////////////////////////////////////
@@ -67,11 +102,14 @@ inline void ResetGlobals ( bool throwException = true, bool flog = false ) {
typedef size_t count_type;
typedef tbb::blocked_range<count_type> range_type;
+inline intptr_t CountSubranges(range_type r) {
+ if(!r.is_divisible()) return intptr_t(1);
+ range_type r2(r,tbb::split());
+ return CountSubranges(r) + CountSubranges(r2);
+}
+
inline intptr_t NumSubranges ( intptr_t length, intptr_t grain ) {
- intptr_t n = 1;
- for( ; length > grain; length -= length >> 1 )
- n *= 2;
- return n;
+ return CountSubranges(range_type(0,length,grain));
}
template<class Body>
@@ -90,6 +128,9 @@ class NoThrowParForBody {
public:
void operator()( const range_type& r ) const {
volatile count_type x = 0;
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true;
+ else g_NonMasterExecuted = true;
+ if( tbb::task::self().is_cancelled() ) ++g_TGCCancelled;
count_type end = r.end();
for( count_type i=r.begin(); i<end; ++i )
x += i;
@@ -135,13 +176,35 @@ void TestParallelLoopAux() {
tbb::parallel_reduce( range_type(0, FLAT_RANGE, FLAT_GRAIN), rb, partitioner );
}
CATCH_AND_ASSERT();
- ASSERT (exceptionCaught, "No exception thrown from the outer parallel_for");
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
- ASSERT (g_Exceptions == 1, "No try_blocks in any body expected in this test");
- if ( !g_SolitaryException )
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
+ // two cases: g_SolitaryException and !g_SolitaryException
+ // 1) g_SolitaryException: only one thread actually threw. There is only one context, so the exception
+ // (when caught) will cause that context to be cancelled. After this event, there may be one or
+ // more threads which are "in-flight", up to g_NumThreads, but no more will be started. The threads,
+ // when they start, if they see they are cancelled, TGCCancelled is incremented.
+ // 2) !g_SolitaryException: more than one thread can throw. The number of threads that actually
+ // threw is g_MasterExecutedThrow if only the master is allowed, else g_NonMasterExecutedThrow.
+ // Only one context, so TGCCancelled should be <= g_NumThreads.
+ //
+ // the reasoning is similar for nested algorithms in a single context (Test2).
+ //
+ // If a thread throws in a context, more than one subsequent task body may see the
+ // cancelled state (if they are scheduled before the state is propagated.) this is
+ // infrequent, but it occurs. So what was to be an assertion must be a remark.
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks ran after exception thrown");
+ if( g_TGCCancelled > g_NumThreads) REMARK( "Too many tasks ran after exception thrown (%d vs. %d)\n",
+ (int)g_TGCCancelled, (int)g_NumThreads);
+ ASSERT(g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
+ if ( g_SolitaryException ) {
+ ASSERT(g_NumExceptionsCaught == 1, "No try_blocks in any body expected in this test");
+ ASSERT(g_NumExceptionsCaught == (g_ExceptionInMaster ? g_MasterExecutedThrow : g_NonMasterExecutedThrow),
+ "Not all throws were caught");
+ ASSERT(g_ExecutedAtFirstCatch == g_ExecutedAtLastCatch, "Too many exceptions occurred");
+ }
+ else {
+ ASSERT(g_NumExceptionsCaught >= 1, "No try blocks in any body expected in this test");
+ }
}
-}
+} // TestParallelLoopAux
//! Test with parallel_for and parallel_reduce, over all three kinds of partitioners.
/** The Body only needs to be suitable for tbb::parallel_for. */
@@ -163,15 +226,19 @@ public:
void operator()( const range_type& r ) const {
Harness::ConcurrencyTracker ct;
volatile long x = 0;
+ ++g_CurExecuted;
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true;
+ else g_NonMasterExecuted = true;
+ if( tbb::task::self().is_cancelled() ) ++g_TGCCancelled;
for( count_type i = r.begin(); i != r.end(); ++i )
x += 0;
- ++g_CurExecuted;
WaitUntilConcurrencyPeaks();
ThrowTestException(1);
}
};
void Test1() {
+ // non-nested parallel_for/reduce with throwing body, one context
TestParallelLoop<SimpleParForBody>();
} // void Test1 ()
@@ -179,7 +246,7 @@ class OuterParForBody: NoAssign {
public:
void operator()( const range_type& ) const {
Harness::ConcurrencyTracker ct;
- ++g_CurExecuted;
+ ++g_OuterParCalls;
tbb::parallel_for( tbb::blocked_range<size_t>(0, INNER_RANGE, INNER_GRAIN), SimpleParForBody() );
}
};
@@ -197,7 +264,7 @@ class OuterParForBodyWithIsolatedCtx {
public:
void operator()( const range_type& ) const {
tbb::task_group_context ctx(tbb::task_group_context::isolated);
- ++g_CurExecuted;
+ ++g_OuterParCalls;
tbb::parallel_for( tbb::blocked_range<size_t>(0, INNER_RANGE, INNER_GRAIN), SimpleParForBody(), tbb::simple_partitioner(), ctx );
}
};
@@ -212,55 +279,92 @@ void Test3 () {
ResetGlobals();
typedef OuterParForBodyWithIsolatedCtx body_type;
intptr_t innerCalls = NumSubranges(INNER_RANGE, INNER_GRAIN),
+ // we expect one thread to throw without counting, the rest to run to completion
+ // this formula assumes g_numThreads outer pfor ranges will be started, but that is not the
+ // case; the SimpleParFor subranges are started up as part of the outer ones, and when
+ // the amount of concurrency reaches g_NumThreads no more outer Pfor ranges are started.
+ // so we have to count the number of outer Pfors actually started.
minExecuted = (g_NumThreads - 1) * innerCalls;
TRY();
tbb::parallel_for( range_type(0, OUTER_RANGE, OUTER_GRAIN), body_type() );
CATCH_AND_ASSERT();
- ASSERT (exceptionCaught, "No exception thrown from the outer parallel_for");
+ minExecuted = (g_OuterParCalls - 1) * innerCalls; // see above
+
+ // The first formula above assumes all ranges of the outer parallel for are executed, and one
+ // cancels. In the event, we have a smaller number of ranges that start before the exception
+ // is caught.
+ //
+ // g_SolitaryException:One inner range throws. Outer parallel_For is cancelled, but sibling
+ // parallel_fors continue to completion (unless the threads that execute
+ // are not allowed to throw, in which case we will not see any exceptions).
+ // !g_SolitaryException:multiple inner ranges may throw. Any which throws will stop, and the
+ // corresponding range of the outer pfor will stop also.
+ //
+ // In either case, once the outer pfor gets the exception it will stop executing further ranges.
+
+ // if the only threads executing were not allowed to throw, then not seeing an exception is okay.
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecuted) || (!g_ExceptionInMaster && !g_NonMasterExecuted);
if ( g_SolitaryException ) {
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived exception");
ASSERT (g_CurExecuted > minExecuted, "Too few tasks survived exception");
- ASSERT (g_CurExecuted <= minExecuted + (g_ExecutedAtCatch + g_NumThreads), "Too many tasks survived exception");
+ ASSERT (g_CurExecuted <= minExecuted + (g_ExecutedAtLastCatch + g_NumThreads), "Too many tasks survived exception");
+ ASSERT (g_NumExceptionsCaught == 1 || okayNoExceptionsCaught, "No try_blocks in any body expected in this test");
+ }
+ else {
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_NumExceptionsCaught >= 1 || okayNoExceptionsCaught, "No try_blocks in any body expected in this test");
}
- ASSERT (g_Exceptions == 1, "No try_blocks in any body expected in this test");
- if ( !g_SolitaryException )
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
} // void Test3 ()
class OuterParForExceptionSafeBody {
public:
void operator()( const range_type& ) const {
tbb::task_group_context ctx(tbb::task_group_context::isolated);
+ ++g_OuterParCalls;
TRY();
tbb::parallel_for( tbb::blocked_range<size_t>(0, INNER_RANGE, INNER_GRAIN), SimpleParForBody(), tbb::simple_partitioner(), ctx );
CATCH(); // this macro sets g_ExceptionCaught
}
};
-//! Uses parallel_for body invoking an inner parallel_for (with default bound context) inside a try-block.
+//! Uses parallel_for body invoking an inner parallel_for (with isolated context) inside a try-block.
/** Since exception(s) thrown from the inner parallel_for are handled by the caller
in this test, they do not affect neither other tasks of the the root parallel_for
nor sibling inner algorithms. **/
void Test4 () {
ResetGlobals( true, true );
intptr_t innerCalls = NumSubranges(INNER_RANGE, INNER_GRAIN),
- outerCalls = NumSubranges(OUTER_RANGE, OUTER_GRAIN),
- maxExecuted = outerCalls * innerCalls;
+ outerCalls = NumSubranges(OUTER_RANGE, OUTER_GRAIN);
TRY();
tbb::parallel_for( range_type(0, OUTER_RANGE, OUTER_GRAIN), OuterParForExceptionSafeBody() );
CATCH();
- ASSERT(!exceptionCaught, "All exceptions must have been handled in the parallel_for body");
- intptr_t minExecuted = 0;
+ // g_SolitaryException : one inner pfor will throw, the rest will execute to completion.
+ // so the count should be (outerCalls -1) * innerCalls, if a throw happened.
+ // !g_SolitaryException : possible multiple inner pfor throws. Should be approximately
+ // (outerCalls - g_NumExceptionsCaught) * innerCalls, give or take a few
+ intptr_t minExecuted = (outerCalls - g_NumExceptionsCaught) * innerCalls;
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecuted) || (!g_ExceptionInMaster && !g_NonMasterExecuted);
if ( g_SolitaryException ) {
- minExecuted = maxExecuted - innerCalls;
- ASSERT (g_Exceptions == 1, "No exception registered");
+ // only one task had exception thrown. That task had at least one execution (the one that threw).
+ // There may be an arbitrary number of ranges executed after the throw but before the exception
+ // is caught in the scheduler and cancellation is signaled. (seen 9, 11 and 62 (!) for 8 threads)
+ ASSERT (g_NumExceptionsCaught == 1 || okayNoExceptionsCaught, "No exception registered");
ASSERT (g_CurExecuted >= minExecuted, "Too few tasks executed");
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived exception");
+ // a small number of threads can execute in a throwing sub-pfor, if the task which is
+ // to do the solitary throw swaps out after registering its intent to throw but before it
+ // actually does so. (Or is this caused by the extra threads participating? No, the
+ // number of extra tasks is sometimes far greater than the number of extra threads.)
ASSERT (g_CurExecuted <= minExecuted + g_NumThreads, "Too many tasks survived exception");
+ if(g_CurExecuted > minExecuted + g_NumThreads) REMARK("Unusual number of tasks executed after signal (%d vs. %d)\n",
+ (int)g_CurExecuted, minExecuted + g_NumThreads);
}
else {
- minExecuted = g_Exceptions;
- ASSERT (g_Exceptions > 1 && g_Exceptions <= outerCalls, "Unexpected actual number of exceptions");
- ASSERT (g_CurExecuted >= minExecuted, "Too many executed tasks reported");
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived multiple exceptions");
+ ASSERT ((g_NumExceptionsCaught >= 1 && g_NumExceptionsCaught <= outerCalls) || okayNoExceptionsCaught, "Unexpected actual number of exceptions");
+ ASSERT (g_CurExecuted >= minExecuted, "Too few executed tasks reported");
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived multiple exceptions");
+ if(g_CurExecuted > g_ExecutedAtLastCatch + g_NumThreads) REMARK("Unusual number of tasks executed after signal (%d vs. %d)\n",
+ (int)g_CurExecuted, g_ExecutedAtLastCatch + g_NumThreads);
ASSERT (g_CurExecuted <= outerCalls * (1 + g_NumThreads), "Too many tasks survived exception");
}
} // void Test4 ()
@@ -291,7 +395,6 @@ public:
void TestCancelation1 () {
ResetGlobals( false );
RunCancellationTest<ParForLauncherTask<ParForBodyToCancel>, CancellatorTask>( NumSubranges(FLAT_RANGE, FLAT_GRAIN) / 4 );
- ASSERT (g_CurExecuted < g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
}
class CancellatorTask2 : public tbb::task {
@@ -301,7 +404,7 @@ class CancellatorTask2 : public tbb::task {
Harness::ConcurrencyTracker ct;
WaitUntilConcurrencyPeaks();
m_GroupToCancel.cancel_group_execution();
- g_ExecutedAtCatch = g_CurExecuted;
+ g_ExecutedAtLastCatch = g_CurExecuted;
return NULL;
}
public:
@@ -324,8 +427,9 @@ public:
void TestCancelation2 () {
ResetGlobals();
RunCancellationTest<ParForLauncherTask<ParForBodyToCancel2>, CancellatorTask2>();
- ASSERT (g_ExecutedAtCatch < g_NumThreads, "Somehow worker tasks started their execution before the cancellator task");
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Some tasks were executed after cancellation");
+ ASSERT (g_ExecutedAtLastCatch < g_NumThreads, "Somehow worker tasks started their execution before the cancellator task");
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived cancellation");
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Some tasks were executed after cancellation");
}
////////////////////////////////////////////////////////////////////////////////
@@ -363,6 +467,9 @@ public:
{}
void operator() ( const tbb::blocked_range<size_t>& r ) {
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true;
+ else g_NonMasterExecuted = true;
+ if( tbb::task::self().is_cancelled() ) ++g_TGCCancelled;
for (size_t i = r.begin (); i != r.end (); ++i) {
m_Result += m_SharedWorker->DoWork (m_NestingLevel);
}
@@ -440,6 +547,9 @@ class SimpleParDoBody {
public:
void operator() ( size_t &value ) const {
++g_CurExecuted;
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true;
+ else g_NonMasterExecuted = true;
+ if( tbb::task::self().is_cancelled() ) ++g_TGCCancelled;
Harness::ConcurrencyTracker ct;
value += 1000;
WaitUntilConcurrencyPeaks();
@@ -464,10 +574,11 @@ void Test1_parallel_do () {
TRY();
tbb::parallel_do<Iterator, simple_body>(begin, end, simple_body() );
CATCH_AND_ASSERT();
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
- ASSERT (g_Exceptions == 1, "No try_blocks in any body expected in this test");
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived cancellation");
+ ASSERT (g_NumExceptionsCaught == 1, "No try_blocks in any body expected in this test");
if ( !g_SolitaryException )
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
} // void Test1_parallel_do ()
@@ -475,7 +586,7 @@ template <class Iterator>
class OuterParDoBody {
public:
void operator()( size_t& /*value*/ ) const {
- ++g_CurExecuted;
+ ++g_OuterParCalls;
PREPARE_RANGE(Iterator, INNER_ITER_RANGE);
tbb::parallel_do<Iterator, SimpleParDoBody>(begin, end, SimpleParDoBody());
}
@@ -502,12 +613,12 @@ void Test2_parallel_do () {
TRY();
tbb::parallel_do<Iterator, outer_body >(begin, end, outer_body() );
CATCH_AND_ASSERT();
- ASSERT (exceptionCaught, "No exception thrown from the outer parallel_for");
//if ( g_SolitaryException )
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
- ASSERT (g_Exceptions == 1, "No try_blocks in any body expected in this test");
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived cancellation");
+ ASSERT (g_NumExceptionsCaught == 1, "No try_blocks in any body expected in this test");
if ( !g_SolitaryException )
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
} // void Test2_parallel_do ()
template <class Iterator>
@@ -515,7 +626,7 @@ class OuterParDoBodyWithIsolatedCtx {
public:
void operator()( size_t& /*value*/ ) const {
tbb::task_group_context ctx(tbb::task_group_context::isolated);
- ++g_CurExecuted;
+ ++g_OuterParCalls;
PREPARE_RANGE(Iterator, INNER_ITER_RANGE);
tbb::parallel_do<Iterator, SimpleParDoBody>(begin, end, SimpleParDoBody(), ctx);
}
@@ -534,25 +645,32 @@ public:
/** Even though exceptions thrown from the inner parallel_do are not handled
by the caller in this test, they will not affect sibling inner algorithms
already running because of the isolated contexts. However because the first
- exception cancels the root parallel_do, only the first g_NumThreads subranges
+ exception cancels the root parallel_do, at most the first g_NumThreads subranges
will be processed (which launch inner parallel_dos) **/
template <class Iterator, class outer_body>
void Test3_parallel_do () {
ResetGlobals();
PREPARE_RANGE(Iterator, OUTER_ITER_RANGE);
intptr_t innerCalls = INNER_ITER_RANGE,
+ // The assumption here is the same as in outer parallel fors.
minExecuted = (g_NumThreads - 1) * innerCalls;
+ g_Master = Harness::CurrentTid();
TRY();
tbb::parallel_do<Iterator, outer_body >(begin, end, outer_body());
CATCH_AND_ASSERT();
- ASSERT (exceptionCaught, "No exception thrown from the outer parallel_for");
+ // figure actual number of expected executions given the number of outer PDos started.
+ minExecuted = (g_OuterParCalls - 1) * innerCalls;
+ // one extra thread may run a task that sees cancellation. Infrequent but possible
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived exception");
+ if(g_TGCCancelled > g_NumThreads) REMARK("Extra thread(s) executed after cancel (%d vs. %d)\n",
+ (int)g_TGCCancelled, (int)g_NumThreads);
if ( g_SolitaryException ) {
ASSERT (g_CurExecuted > minExecuted, "Too few tasks survived exception");
- ASSERT (g_CurExecuted <= minExecuted + (g_ExecutedAtCatch + g_NumThreads), "Too many tasks survived exception");
+ ASSERT (g_CurExecuted <= minExecuted + (g_ExecutedAtLastCatch + g_NumThreads), "Too many tasks survived exception");
}
- ASSERT (g_Exceptions == 1, "No try_blocks in any body expected in this test");
+ ASSERT (g_NumExceptionsCaught == 1, "No try_blocks in any body expected in this test");
if ( !g_SolitaryException )
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
} // void Test3_parallel_do ()
template <class Iterator>
@@ -560,6 +678,7 @@ class OuterParDoWithEhBody {
public:
void operator()( size_t& /*value*/ ) const {
tbb::task_group_context ctx(tbb::task_group_context::isolated);
+ ++g_OuterParCalls;
PREPARE_RANGE(Iterator, INNER_ITER_RANGE);
TRY();
tbb::parallel_do<Iterator, SimpleParDoBody>(begin, end, SimpleParDoBody(), ctx);
@@ -584,25 +703,32 @@ template <class Iterator, class outer_body_with_eh>
void Test4_parallel_do () {
ResetGlobals( true, true );
PREPARE_RANGE(Iterator, OUTER_ITER_RANGE);
+ g_Master = Harness::CurrentTid();
TRY();
tbb::parallel_do<Iterator, outer_body_with_eh>(begin, end, outer_body_with_eh());
CATCH();
- ASSERT (!exceptionCaught, "All exceptions must have been handled in the parallel_do body");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "All exceptions must have been handled in the parallel_do body");
intptr_t innerCalls = INNER_ITER_RANGE,
outerCalls = OUTER_ITER_RANGE + g_FedTasksCount,
maxExecuted = outerCalls * innerCalls,
minExecuted = 0;
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived exception");
if ( g_SolitaryException ) {
minExecuted = maxExecuted - innerCalls;
- ASSERT (g_Exceptions == 1, "No exception registered");
+ ASSERT (g_NumExceptionsCaught == 1, "No exception registered");
ASSERT (g_CurExecuted >= minExecuted, "Too few tasks executed");
+ // This test has the same property as Test4 (parallel_for); the exception can be
+ // thrown, but some number of tasks from the outer Pdo can execute after the throw but
+ // before the cancellation is signaled (have seen 36).
ASSERT (g_CurExecuted <= minExecuted + g_NumThreads, "Too many tasks survived exception");
+ if(g_CurExecuted > minExecuted + g_NumThreads) REMARK("Unusual number of pdo tasks executed after signal (%d vs. %d)\n",
+ (int)g_CurExecuted, minExecuted - g_NumThreads);
}
else {
- minExecuted = g_Exceptions;
- ASSERT (g_Exceptions > 1 && g_Exceptions <= outerCalls, "Unexpected actual number of exceptions");
+ minExecuted = g_NumExceptionsCaught;
+ ASSERT (g_NumExceptionsCaught > 1 && g_NumExceptionsCaught <= outerCalls, "Unexpected actual number of exceptions");
ASSERT (g_CurExecuted >= minExecuted, "Too many executed tasks reported");
- ASSERT (g_CurExecuted < g_ExecutedAtCatch + g_NumThreads + outerCalls, "Too many tasks survived multiple exceptions");
+ ASSERT (g_CurExecuted < g_ExecutedAtLastCatch + g_NumThreads + outerCalls, "Too many tasks survived multiple exceptions");
ASSERT (g_CurExecuted <= outerCalls * (1 + g_NumThreads), "Too many tasks survived exception");
}
} // void Test4_parallel_do ()
@@ -613,6 +739,9 @@ public:
//! This form of the function call operator can be used when the body needs to add more work during the processing
void operator() ( size_t &value, tbb::parallel_do_feeder<size_t> &feeder ) const {
++g_CurExecuted;
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true;
+ else g_NonMasterExecuted = true;
+ if( tbb::task::self().is_cancelled() ) ++g_TGCCancelled;
Feed(feeder, 1);
if (value == 1)
ThrowTestException(1);
@@ -624,11 +753,24 @@ template <class Iterator>
void Test5_parallel_do () {
ResetGlobals();
PREPARE_RANGE(Iterator, ITER_RANGE);
+ g_Master = Harness::CurrentTid();
TRY();
tbb::parallel_do<Iterator, ParDoBodyWithThrowingFeederTasks>(begin, end, ParDoBodyWithThrowingFeederTasks());
CATCH();
- if (g_SolitaryException)
- ASSERT (exceptionCaught, "At least one exception should occur");
+ if (g_SolitaryException) {
+ // Failure occurs when g_ExceptionInMaster is false, but all the 1 values in the range
+ // are handled by the master thread. In this case no throw occurs.
+ ASSERT (l_ExceptionCaughtAtCurrentLevel // we saw an exception
+ || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) // non-master throws but none tried
+ || (g_ExceptionInMaster && !g_MasterExecutedThrow) // master throws but master didn't try
+ , "At least one exception should occur");
+ if(!g_ExceptionCaught) {
+ if(g_ExceptionInMaster)
+ REMARK("PDo exception not thrown; non-masters handled all throwing values.\n");
+ else
+ REMARK("PDo exception not thrown; master handled all throwing values.\n");
+ }
+ }
} // void Test5_parallel_do ()
#endif /* TBB_USE_EXCEPTIONS */
@@ -677,7 +819,7 @@ void TestCancelation1_parallel_do () {
TRY();
r.wait_for_all();
CATCH_AND_FAIL();
- ASSERT (g_CurExecuted < g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
+ ASSERT (g_CurExecuted < g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks were executed after cancellation");
r.destroy(r);
}
@@ -706,7 +848,6 @@ template <class Iterator, class body_to_cancel>
void TestCancelation2_parallel_do () {
ResetGlobals();
RunCancellationTest<ParDoWorkerTask<body_to_cancel, Iterator>, CancellatorTask2>();
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Some tasks were executed after cancellation");
}
#define RunWithSimpleBody(func, body) \
@@ -761,6 +902,12 @@ public:
void* operator()( void* ) {
size_t item = m_Item.fetch_and_increment();
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true;
+ else g_NonMasterExecuted = true;
+ if( tbb::task::self().is_cancelled() ) ++g_TGCCancelled;
+ if(item == 1) {
+ ++g_PipelinesStarted; // count on emitting the first item.
+ }
if ( item >= NUM_ITEMS )
return NULL;
m_Buffer[item] = 1;
@@ -786,6 +933,9 @@ public:
{}
void* operator()(void* item) {
size_t &value = *(size_t*)item;
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true;
+ else g_NonMasterExecuted = true;
+ if( tbb::task::self().is_cancelled() ) ++g_TGCCancelled;
ASSERT(value != c_DataEndTag, "terminator element is being processed");
switch (m_Operation){
case addition:
@@ -825,14 +975,17 @@ void Test0_pipeline () {
#if TBB_USE_EXCEPTIONS
-// Simple filter with exception throwing
+// Simple filter with exception throwing. If parallel, will wait until
+// as many parallel filters start as there are threads.
class SimpleFilter : public tbb::filter {
bool m_canThrow;
public:
SimpleFilter (tbb::filter::mode _mode, bool canThrow ) : filter (_mode), m_canThrow(canThrow) {}
-
void* operator()(void* item) {
++g_CurExecuted;
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true;
+ else g_NonMasterExecuted = true;
+ if( tbb::task::self().is_cancelled() ) ++g_TGCCancelled;
if ( m_canThrow ) {
if ( !is_serial() ) {
Harness::ConcurrencyTracker ct;
@@ -886,15 +1039,25 @@ void Test1_pipeline ( const FilterSet& filters ) {
TRY();
testPipeline.run();
if ( g_CurExecuted == 2 * NUM_ITEMS ) {
+ // all the items were processed, though an exception was supposed to occur.
+ if(!g_ExceptionInMaster && g_NonMasterExecutedThrow > 0) {
+ // if !g_ExceptionInMaster, the master thread is not allowed to throw.
+ // if g_nonMasterExcutedThrow > 0 then a thread besides the master tried to throw.
+ ASSERT(filters.mode1 != tbb::filter::parallel && filters.mode2 != tbb::filter::parallel, "Unusual count");
+ }
+ else {
+ REMARK("test1_Pipeline with %d threads: Only the master thread tried to throw, and it is not allowed to.\n", (int)g_NumThreads);
+ }
// In case of all serial filters they might be all executed in the thread(s)
// where exceptions are not allowed by the common test logic. So we just quit.
return;
}
CATCH_AND_ASSERT();
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
- ASSERT (g_Exceptions == 1, "No try_blocks in any body expected in this test");
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_NumExceptionsCaught == 1, "No try_blocks in any body expected in this test");
if ( !g_SolitaryException )
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
} // void Test1_pipeline ()
@@ -904,7 +1067,7 @@ public:
OuterFilter (tbb::filter::mode _mode, bool ) : filter (_mode) {}
void* operator()(void* item) {
- ++g_CurExecuted;
+ ++g_OuterParCalls;
SimplePipeline testPipeline(serial_parallel);
testPipeline.run();
return item;
@@ -918,15 +1081,20 @@ public:
algorithms. **/
void Test2_pipeline ( const FilterSet& filters ) {
ResetGlobals();
+ g_NestedPipelines = true;
CustomPipeline<InputFilter, OuterFilter> testPipeline(filters);
TRY();
testPipeline.run();
CATCH_AND_ASSERT();
- ASSERT (exceptionCaught, "No exception thrown from the outer pipeline");
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
- ASSERT (g_Exceptions == 1, "No try_blocks in any body expected in this test");
- if ( !g_SolitaryException )
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
+ bool okayNoExceptionCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow);
+ ASSERT (g_NumExceptionsCaught == 1 || okayNoExceptionCaught, "No try_blocks in any body expected in this test");
+ if ( g_SolitaryException ) {
+ if( g_TGCCancelled > g_NumThreads) REMARK( "Extra tasks ran after exception thrown (%d vs. %d)\n",
+ (int)g_TGCCancelled, (int)g_NumThreads);
+ }
+ else {
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived exception");
+ }
} // void Test2_pipeline ()
//! creates isolated inner pipeline and runs it.
@@ -935,7 +1103,7 @@ public:
OuterFilterWithIsolatedCtx(tbb::filter::mode m, bool ) : filter(m) {}
void* operator()(void* item) {
- ++g_CurExecuted;
+ ++g_OuterParCalls;
tbb::task_group_context ctx(tbb::task_group_context::isolated);
// create inner pipeline with serial input, parallel output filter, second filter throws
SimplePipeline testPipeline(serial_parallel);
@@ -952,20 +1120,55 @@ public:
will be processed (which launch inner pipelines) **/
void Test3_pipeline ( const FilterSet& filters ) {
ResetGlobals();
+ g_NestedPipelines = true;
+ g_Master = Harness::CurrentTid();
intptr_t innerCalls = NUM_ITEMS,
minExecuted = (g_NumThreads - 1) * innerCalls;
CustomPipeline<InputFilter, OuterFilterWithIsolatedCtx> testPipeline(filters);
TRY();
testPipeline.run();
CATCH_AND_ASSERT();
- ASSERT (exceptionCaught, "No exception thrown from the outer parallel_for");
+
+ bool okayNoExceptionCaught = (g_ExceptionInMaster && !g_MasterExecuted) ||
+ (!g_ExceptionInMaster && !g_NonMasterExecuted);
if ( g_SolitaryException ) {
- ASSERT (g_CurExecuted > minExecuted, "Too few tasks survived exception");
- ASSERT (g_CurExecuted <= minExecuted + (g_ExecutedAtCatch + g_NumThreads), "Too many tasks survived exception");
+
+ // The test is one outer pipeline with two NestedFilters that each start an inner pipeline.
+ // Each time the input filter of a pipeline delivers its first item, it increments
+ // g_PipelinesStarted. When g_SolitaryException, the throw will not occur until
+ // g_PipelinesStarted >= 3. (This is so at least a second pipeline in its own isolated
+ // context will start; that is what we're testing.)
+ //
+ // There are two pipelines which will NOT run to completion when a solitary throw
+ // happens in an isolated inner context: the outer pipeline and the pipeline which
+ // throws. All the other pipelines which start should run to completion. But only
+ // inner body invocations are counted.
+ //
+ // So g_CurExecuted should be about
+ //
+ // (2*NUM_ITEMS) * (g_PipelinesStarted - 2) + 1
+ // ^ executions for each completed pipeline
+ // ^ completing pipelines (remembering two will not complete)
+ // ^ one for the inner throwing pipeline
+
+ minExecuted = (2*NUM_ITEMS) * (g_PipelinesStarted - 2) + 1;
+ ASSERT (g_CurExecuted >= minExecuted, "Too few tasks survived exception");
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_CurExecuted <= minExecuted + (g_ExecutedAtLastCatch + g_NumThreads), "Too many tasks survived exception");
+ ASSERT (g_NumExceptionsCaught == 1, "No try_blocks in any body expected in this test");
+ // if we're only throwing from the master thread, and that thread didn't
+ // participate in the pipelines, then no throw occurred.
+ if(g_ExceptionInMaster && !g_MasterExecuted) {
+ REMARK_ONCE("Master expected to throw, but didn't participate.\n");
+ }
+ else if(!g_ExceptionInMaster && !g_NonMasterExecuted) {
+ REMARK_ONCE("Non-master expected to throw, but didn't participate.\n");
+ }
+ ASSERT ((g_CurExecuted <= minExecuted + (g_ExecutedAtLastCatch + g_NumThreads)) ||
+ okayNoExceptionCaught, "Too many tasks survived exception");
}
- ASSERT (g_Exceptions == 1, "No try_blocks in any body expected in this test");
- if ( !g_SolitaryException )
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_NumExceptionsCaught == 1 || okayNoExceptionCaught, "No try_blocks in any body expected in this test");
+ ASSERT ((g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads) || okayNoExceptionCaught, "Too many tasks survived exception");
} // void Test3_pipeline ()
class OuterFilterWithEhBody : public tbb::filter {
@@ -974,6 +1177,7 @@ public:
void* operator()(void* item) {
tbb::task_group_context ctx(tbb::task_group_context::isolated);
+ ++g_OuterParCalls;
SimplePipeline testPipeline(serial_parallel);
TRY();
testPipeline.run(ctx);
@@ -982,7 +1186,7 @@ public:
}
}; // class OuterFilterWithEhBody
-//! Uses pipeline body invoking an inner pipeline (with default bound context) inside a try-block.
+//! Uses pipeline body invoking an inner pipeline (with isolated context) inside a try-block.
/** Since exception(s) thrown from the inner pipeline are handled by the caller
in this test, they do not affect other tasks of the the root pipeline
nor sibling inner algorithms. **/
@@ -994,25 +1198,37 @@ void Test4_pipeline ( const FilterSet& filters ) {
}
#endif
ResetGlobals( true, true );
- intptr_t innerCalls = NUM_ITEMS + 1,
- outerCalls = 2 * (NUM_ITEMS + 1),
+ // each outer pipeline stage will start NUM_ITEMS inner pipelines.
+ // each inner pipeline that doesn't throw will process NUM_ITEMS items.
+ // for solitary exception there will be one pipeline that only processes one stage, one item.
+ // innerCalls should be 2*NUM_ITEMS
+ intptr_t innerCalls = 2*NUM_ITEMS,
+ outerCalls = 2 * NUM_ITEMS,
maxExecuted = outerCalls * innerCalls; // the number of invocations of the inner pipelines
CustomPipeline<InputFilter, OuterFilterWithEhBody> testPipeline(filters);
TRY();
testPipeline.run();
CATCH_AND_ASSERT();
- ASSERT (!exceptionCaught, "All exceptions must have been handled in the parallel_do body");
intptr_t minExecuted = 0;
+ bool okayNoExceptionCaught = (g_ExceptionInMaster && !g_MasterExecuted) ||
+ (!g_ExceptionInMaster && !g_NonMasterExecuted);
if ( g_SolitaryException ) {
minExecuted = maxExecuted - innerCalls; // one throwing inner pipeline
- ASSERT (g_Exceptions != 0, "No exception registered");
- ASSERT (g_CurExecuted <= minExecuted + g_NumThreads, "Too many tasks survived exception");
+ ASSERT (g_NumExceptionsCaught == 1 || okayNoExceptionCaught, "No exception registered");
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived exception"); // probably will assert.
}
else {
- minExecuted = g_Exceptions;
- ASSERT (g_Exceptions > 1 && g_Exceptions <= outerCalls, "Unexpected actual number of exceptions");
+ // we assume throwing pipelines will not count
+ minExecuted = (outerCalls - g_NumExceptionsCaught) * innerCalls;
+ ASSERT((g_NumExceptionsCaught >= 1 && g_NumExceptionsCaught <= outerCalls)||okayNoExceptionCaught, "Unexpected actual number of exceptions");
ASSERT (g_CurExecuted >= minExecuted, "Too many executed tasks reported");
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks survived multiple exceptions");
+ // too many already-scheduled tasks are started after the first exception is
+ // thrown. And g_ExecutedAtLastCatch is updated every time an exception is caught.
+ // So with multiple exceptions there are a variable number of tasks that have been
+ // discarded because of the signals.
+ // each throw is caught, so we will see many cancelled tasks. g_ExecutedAtLastCatch is
+ // updated with each throw, so the value will be the number of tasks executed at the last
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks survived multiple exceptions");
}
} // void Test4_pipeline ()
@@ -1060,6 +1276,9 @@ public:
ProcessingFilterWithFinalization (tbb::filter::mode _mode, bool) : FinalizationBaseFilter (_mode) {}
void* operator()( void* item) {
+ if(g_Master == Harness::CurrentTid()) g_MasterExecuted = true;
+ else g_NonMasterExecuted = true;
+ if( tbb::task::self().is_cancelled()) ++g_TGCCancelled;
if (g_TotalCount > NUM_BUFFERS / 2)
ThrowTestException(1);
size_t* m_Item = (size_t*)item;
@@ -1161,7 +1380,8 @@ void TestCancelation1_pipeline () {
r.wait_for_all();
CATCH_AND_FAIL();
r.destroy(r);
- ASSERT (g_CurExecuted < g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
+ ASSERT( g_TGCCancelled <= g_NumThreads, "Too many tasks survived cancellation");
+ ASSERT (g_CurExecuted < g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks were executed after cancellation");
}
class FilterToCancel2 : public tbb::filter {
@@ -1173,7 +1393,7 @@ public:
void* operator()(void* item) {
++g_CurExecuted;
Harness::ConcurrencyTracker ct;
- // The test will hang (and be timed out by the tesst system) if is_cancelled() is broken
+ // The test will hang (and be timed out by the test system) if is_cancelled() is broken
while( !tbb::task::self().is_cancelled() )
__TBB_Yield();
return item;
@@ -1185,7 +1405,11 @@ public:
void TestCancelation2_pipeline () {
ResetGlobals();
RunCancellationTest<PipelineLauncherTask<FilterToCancel2>, CancellatorTask2>();
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch, "Some tasks were executed after cancellation");
+ // g_CurExecuted is always >= g_ExecutedAtLastCatch, because the latter is always a snapshot of the
+ // former, and g_CurExecuted is monotonic increasing. so the comparison should be at least ==.
+ // If another filter is started after cancel but before cancellation is propagated, then the
+ // number will be larger.
+ ASSERT (g_CurExecuted <= g_ExecutedAtLastCatch, "Some tasks were executed after cancellation");
}
void RunPipelineTests() {
@@ -1261,6 +1485,10 @@ void TestTbbExceptionAPI () {
the test is run only for 2 sizes of the thread pool (MinThread and MaxThread)
to be able to test the high and low contention modes while keeping the test reasonably fast **/
int TestMain () {
+ if(tbb::task_scheduler_init::default_num_threads() == 1) {
+ REPORT("Known issue: tests require multiple hardware threads\n");
+ return Harness::Skipped;
+ }
REMARK ("Using %s\n", TBB_USE_CAPTURED_EXCEPTION ? "tbb:captured_exception" : "exact exception propagation");
MinThread = min(tbb::task_scheduler_init::default_num_threads(), max(2, MinThread));
MaxThread = max(MinThread, min(tbb::task_scheduler_init::default_num_threads(), MaxThread));
@@ -1270,8 +1498,9 @@ int TestMain () {
REMARK ("Number of threads %d\n", g_NumThreads);
// Execute in all the possible modes
for ( size_t j = 0; j < 4; ++j ) {
- g_ExceptionInMaster = (j & 1) == 1;
- g_SolitaryException = (j & 2) == 1;
+ g_ExceptionInMaster = (j & 1) != 0;
+ g_SolitaryException = (j & 2) != 0;
+ REMARK("g_ExceptionInMaster==%s, g_SolitaryException==%s\n", g_ExceptionInMaster?"T":"F", g_SolitaryException?"T":"F");
RunParForAndReduceTests();
RunParDoTests();
RunPipelineTests();
diff --git a/src/test/test_eh_flow_graph.cpp b/src/test/test_eh_flow_graph.cpp
index 7055319..e2153b4 100644
--- a/src/test/test_eh_flow_graph.cpp
+++ b/src/test/test_eh_flow_graph.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,16 +26,1895 @@
the GNU General Public License.
*/
+#if _MSC_VER
+ #pragma warning (disable: 4503) // Suppress "decorated name length exceeded, name was truncated" warning
+ #if !TBB_USE_EXCEPTIONS
+ // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+ #pragma warning (disable: 4530)
+ #endif
+ #if _MSC_VER==1700 && !defined(__INTEL_COMPILER)
+ // Suppress "unreachable code" warning by VC++ 17.0 (VS 2012)
+ #pragma warning (disable: 4702)
+ #endif
+#endif
+
#include "harness.h"
+// global task_scheduler_observer is an imperfect tool to find how many threads are really
+// participating. That was the hope, but it counts the entries into the marketplace,
+// not the arena.
+// #define USE_TASK_SCHEDULER_OBSERVER 1
+#define TBB_PREVIEW_GRAPH_NODES 1
+
#if TBB_USE_EXCEPTIONS
+#if USE_TASK_SCHEDULER_OBSERVER
+#include "tbb/task_scheduler_observer.h"
+#endif
#include "tbb/flow_graph.h"
#include "tbb/task_scheduler_init.h"
#include <iostream>
#include <vector>
#include "harness_assert.h"
+#include "harness_checktype.h"
+
+inline intptr_t Existed() { return INT_MAX; } // resolve Existed in harness_eh.h
+
+#include "harness_eh.h"
+#include <stdexcept>
+
+#define NUM_ITEMS 15
+int g_NumItems;
tbb::atomic<unsigned> nExceptions;
+tbb::atomic<intptr_t> g_TGCCancelled;
+
+enum TestNodeTypeEnum { nonThrowing, isThrowing };
+
+static const size_t unlimited_type = 0;
+static const size_t serial_type = 1;
+static const size_t limited_type = 4;
+
+template<TestNodeTypeEnum T> struct TestNodeTypeName;
+template<> struct TestNodeTypeName<nonThrowing> { static const char *name() { return "nonThrowing"; } };
+template<> struct TestNodeTypeName<isThrowing> { static const char *name() { return "isThrowing"; } };
+
+template<size_t Conc> struct concurrencyName;
+template<> struct concurrencyName<serial_type>{ static const char *name() { return "serial"; } };
+template<> struct concurrencyName<unlimited_type>{ static const char *name() { return "unlimited"; } };
+template<> struct concurrencyName<limited_type>{ static const char *name() { return "limited"; } };
+
+// Class that provides waiting and throwing behavior. If we are not throwing, do nothing
+// If serial, we can't wait for concurrency to peak; we may be the bottleneck and will
+// stop further processing. We will execute g_NumThreads + 10 times (the "10" is somewhat
+// arbitrary, and just makes sure there are enough items in the graph to keep it flowing),
+// If parallel or serial and throwing, use Harness::ConcurrencyTracker to wait.
+
+template<size_t Conc, TestNodeTypeEnum t = nonThrowing>
+class WaitThrow;
+
+template<>
+class WaitThrow<serial_type,nonThrowing> {
+protected:
+ void WaitAndThrow(int cnt, const char * /*name*/) {
+ if(cnt > g_NumThreads + 10) {
+ Harness::ConcurrencyTracker ct;
+ WaitUntilConcurrencyPeaks();
+ }
+ }
+};
+
+template<>
+class WaitThrow<serial_type,isThrowing> {
+protected:
+ void WaitAndThrow(int cnt, const char * /*name*/) {
+ if(cnt > g_NumThreads + 10) {
+ Harness::ConcurrencyTracker ct;
+ WaitUntilConcurrencyPeaks();
+ ThrowTestException(1);
+ }
+ }
+};
+
+// for nodes with limited concurrency, if that concurrency is < g_NumThreads, we need
+// to make sure enough other nodes wait for concurrency to peak. If we are attached to
+// N successors, for each item we pass to a successor, we will get N executions of the
+// "absorbers" (because we broadcast to successors.) for an odd number of threads we
+// need (g_NumThreads - limited + 1) / 2 items (that will give us one extra execution
+// of an "absorber", but we can't change that without changing the behavior of the node.)
+template<>
+class WaitThrow<limited_type,nonThrowing> {
+protected:
+ void WaitAndThrow(int cnt, const char * /*name*/) {
+ if(cnt <= (g_NumThreads - (int)limited_type + 1)/2) {
+ return;
+ }
+ Harness::ConcurrencyTracker ct;
+ WaitUntilConcurrencyPeaks();
+ }
+};
+
+template<>
+class WaitThrow<limited_type,isThrowing> {
+protected:
+ void WaitAndThrow(int cnt, const char * /*name*/) {
+ Harness::ConcurrencyTracker ct;
+ if(cnt <= (g_NumThreads - (int)limited_type + 1)/2) {
+ return;
+ }
+ WaitUntilConcurrencyPeaks();
+ ThrowTestException(1);
+ }
+};
+
+template<>
+class WaitThrow<unlimited_type,nonThrowing> {
+protected:
+ void WaitAndThrow(int /*cnt*/, const char * /*name*/) {
+ Harness::ConcurrencyTracker ct;
+ WaitUntilConcurrencyPeaks();
+ }
+};
+
+template<>
+class WaitThrow<unlimited_type,isThrowing> {
+protected:
+ void WaitAndThrow(int /*cnt*/, const char * /*name*/) {
+ Harness::ConcurrencyTracker ct;
+ WaitUntilConcurrencyPeaks();
+ ThrowTestException(1);
+ }
+};
+
+void
+ResetGlobals(bool throwException = true, bool flog = false) {
+ nExceptions = 0;
+ g_TGCCancelled = 0;
+ ResetEhGlobals(throwException, flog);
+}
+
+// -------source_node body ------------------
+template <class OutputType, TestNodeTypeEnum TType>
+class test_source_body : WaitThrow<serial_type, TType> {
+ using WaitThrow<serial_type, TType>::WaitAndThrow;
+ tbb::atomic<int> *my_current_val;
+ int my_mult;
+public:
+ test_source_body(tbb::atomic<int> &my_cnt, int multiplier = 1) : my_current_val(&my_cnt), my_mult(multiplier) { }
+
+ bool operator()(OutputType & out) {
+ UPDATE_COUNTS();
+ out = OutputType(my_mult * ++(*my_current_val));
+ if(*my_current_val > g_NumItems) {
+ *my_current_val = g_NumItems;
+ return false;
+ }
+ WaitAndThrow((int)out,"test_source_body");
+ return true;
+ }
+
+ int count_value() { return (int)*my_current_val; }
+};
+
+template <TestNodeTypeEnum TType>
+class test_source_body<tbb::flow::continue_msg, TType> : WaitThrow<serial_type, TType> {
+ using WaitThrow<serial_type, TType>::WaitAndThrow;
+ tbb::atomic<int> *my_current_val;
+public:
+ test_source_body(tbb::atomic<int> &my_cnt) : my_current_val(&my_cnt) { }
+
+ bool operator()(tbb::flow::continue_msg & out) {
+ UPDATE_COUNTS();
+ int outint = ++(*my_current_val);
+ out = tbb::flow::continue_msg();
+ if(*my_current_val > g_NumItems) {
+ *my_current_val = g_NumItems;
+ return false;
+ }
+ WaitAndThrow(outint,"test_source_body");
+ return true;
+ }
+
+ int count_value() { return (int)*my_current_val; }
+};
+
+// -------{function/continue}_node body ------------------
+template<class InputType, class OutputType, TestNodeTypeEnum T, size_t Conc>
+class absorber_body : WaitThrow<Conc,T> {
+ using WaitThrow<Conc,T>::WaitAndThrow;
+ tbb::atomic<int> *my_count;
+public:
+ absorber_body(tbb::atomic<int> &my_cnt) : my_count(&my_cnt) { }
+ OutputType operator()(const InputType &/*p_in*/) {
+ UPDATE_COUNTS();
+ int out = ++(*my_count);
+ WaitAndThrow(out,"absorber_body");
+ return OutputType();
+ }
+ int count_value() { return *my_count; }
+};
+
+// -------multifunction_node body ------------------
+
+// helper classes
+template<int N,class PortsType>
+struct IssueOutput {
+ typedef typename tbb::flow::tuple_element<N-1,PortsType>::type::output_type my_type;
+
+ static void issue_tuple_element( PortsType &my_ports) {
+ ASSERT(tbb::flow::get<N-1>(my_ports).try_put(my_type()), "Error putting to successor");
+ IssueOutput<N-1,PortsType>::issue_tuple_element(my_ports);
+ }
+};
+
+template<class PortsType>
+struct IssueOutput<1,PortsType> {
+ typedef typename tbb::flow::tuple_element<0,PortsType>::type::output_type my_type;
+
+ static void issue_tuple_element( PortsType &my_ports) {
+ ASSERT(tbb::flow::get<0>(my_ports).try_put(my_type()), "Error putting to successor");
+ }
+};
+
+template<class InputType, class OutputTupleType, TestNodeTypeEnum T, size_t Conc>
+class multifunction_node_body : WaitThrow<Conc,T> {
+ using WaitThrow<Conc,T>::WaitAndThrow;
+ static const int N = tbb::flow::tuple_size<OutputTupleType>::value;
+ typedef typename tbb::flow::multifunction_node<InputType,OutputTupleType> NodeType;
+ typedef typename NodeType::output_ports_type PortsType;
+ tbb::atomic<int> *my_count;
+public:
+ multifunction_node_body(tbb::atomic<int> &my_cnt) : my_count(&my_cnt) { }
+ void operator()(const InputType& /*in*/, PortsType &my_ports) {
+ UPDATE_COUNTS();
+ int out = ++(*my_count);
+ WaitAndThrow(out,"multifunction_node_body");
+ // issue an item to each output port.
+ IssueOutput<N,PortsType>::issue_tuple_element(my_ports);
+ }
+
+ int count_value() { return *my_count; }
+};
+
+// --------- body to sort items in sequencer_node
+template<class BufferItemType>
+struct sequencer_body {
+ size_t operator()(const BufferItemType &s) {
+ return size_t(s) - 1;
+ }
+};
+
+// --------- body to compare the "priorities" of objects for priority_queue_node five priority levels 0-4.
+template<class T>
+struct myLess {
+ bool operator()(const T &t1, const T &t2) {
+ return (int(t1) % 5) < (int(t2) % 5);
+ }
+};
+
+// --------- type for < comparison in priority_queue_node.
+template<class ItemType>
+struct less_body : public std::binary_function<ItemType,ItemType,bool> {
+ bool operator()(const ItemType &lhs, const ItemType &rhs) {
+ return ((int)lhs % 3) < ((int)rhs % 3);
+ }
+};
+
+// --------- tag methods for tag_matching join_node
+template<typename TT>
+class tag_func {
+ const TT my_mult;
+ tag_func& operator=( const tag_func& other);
+public:
+ tag_func(TT multiplier) : my_mult(multiplier) { }
+ // operator() will return [0 .. Count)
+ tbb::flow::tag_value operator()( TT v) {
+ tbb::flow::tag_value t = tbb::flow::tag_value(v / my_mult);
+ return t;
+ }
+};
+
+// --------- Source body for split_node test.
+template <class OutputTuple, TestNodeTypeEnum TType>
+class tuple_test_source_body : WaitThrow<serial_type, TType> {
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type ItemType0;
+ typedef typename tbb::flow::tuple_element<1,OutputTuple>::type ItemType1;
+ using WaitThrow<serial_type, TType>::WaitAndThrow;
+ tbb::atomic<int> *my_current_val;
+public:
+ tuple_test_source_body(tbb::atomic<int> &my_cnt) : my_current_val(&my_cnt) { }
+
+ bool operator()(OutputTuple & out) {
+ UPDATE_COUNTS();
+ int ival = ++(*my_current_val);
+ out = OutputTuple(ItemType0(ival),ItemType1(ival));
+ if(*my_current_val > g_NumItems) {
+ *my_current_val = g_NumItems; // jam the final value; we assert on it later.
+ return false;
+ }
+ WaitAndThrow(ival,"tuple_test_source_body");
+ return true;
+ }
+
+ int count_value() { return (int)*my_current_val; }
+};
+
+// ------- end of node bodies
+
+// source_node is only-serial. source_node can throw, or the function_node can throw.
+// graph being tested is
+//
+// source_node+---+parallel function_node
+//
+// After each run the graph is reset(), to test the reset functionality.
+//
+
+
+template<class ItemType, TestNodeTypeEnum srcThrowType, TestNodeTypeEnum absorbThrowType>
+void run_one_source_node_test(bool throwException, bool flog) {
+ typedef test_source_body<ItemType,srcThrowType> src_body_type;
+ typedef absorber_body<ItemType, tbb::flow::continue_msg, absorbThrowType, unlimited_type> parallel_absorb_body_type;
+ tbb::atomic<int> source_body_count;
+ tbb::atomic<int> absorber_body_count;
+ source_body_count = 0;
+ absorber_body_count = 0;
+
+ tbb::flow::graph g;
+
+ g_Master = Harness::CurrentTid();
+
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+
+ tbb::flow::source_node<ItemType> sn(g, src_body_type(source_body_count),/*is_active*/false);
+ parallel_absorb_body_type ab2(absorber_body_count);
+ tbb::flow::function_node<ItemType> parallel_fn(g,tbb::flow::unlimited,ab2);
+ make_edge(sn, parallel_fn);
+ for(int runcnt = 0; runcnt < 2; ++runcnt) {
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ sn.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ sn.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int src_cnt = tbb::flow::copy_body<src_body_type>(sn).count_value();
+ int sink_cnt = tbb::flow::copy_body<parallel_absorb_body_type>(parallel_fn).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception flag in flow::graph not set");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "canceled flag not set");
+ ASSERT(src_cnt <= g_NumItems, "Too many source_node items emitted");
+ ASSERT(sink_cnt <= src_cnt, "Too many source_node items received");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(src_cnt == g_NumItems, "Incorrect # source_node items emitted");
+ ASSERT(sink_cnt == src_cnt, "Incorrect # source_node items received");
+ }
+ g.reset(); // resets the body of the source_node and the absorb_nodes.
+ source_body_count = 0;
+ absorber_body_count = 0;
+ ASSERT(!g.exception_thrown(), "Reset didn't clear exception_thrown()");
+ ASSERT(!g.is_cancelled(), "Reset didn't clear is_cancelled()");
+ src_cnt = tbb::flow::copy_body<src_body_type>(sn).count_value();
+ sink_cnt = tbb::flow::copy_body<parallel_absorb_body_type>(parallel_fn).count_value();
+ ASSERT(src_cnt == 0, "source_node count not reset");
+ ASSERT(sink_cnt == 0, "sink_node count not reset");
+ }
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+} // run_one_source_node_test
+
+
+template<class ItemType, TestNodeTypeEnum srcThrowType, TestNodeTypeEnum absorbThrowType>
+void run_source_node_test() {
+ run_one_source_node_test<ItemType,srcThrowType,absorbThrowType>(false,false);
+ run_one_source_node_test<ItemType,srcThrowType,absorbThrowType>(true,false);
+ run_one_source_node_test<ItemType,srcThrowType,absorbThrowType>(true,true);
+} // run_source_node_test
+
+void test_source_node() {
+ REMARK("Testing source_node\n");
+ check_type<int>::check_type_counter = 0;
+ g_Wakeup_Msg = "source_node(1): Missed wakeup or machine is overloaded?";
+ run_source_node_test<check_type<int>, isThrowing, nonThrowing>();
+ ASSERT(!check_type<int>::check_type_counter, "Some items leaked in test");
+ g_Wakeup_Msg = "source_node(2): Missed wakeup or machine is overloaded?";
+ run_source_node_test<int, isThrowing, nonThrowing>();
+ g_Wakeup_Msg = "source_node(3): Missed wakeup or machine is overloaded?";
+ run_source_node_test<int, nonThrowing, isThrowing>();
+ g_Wakeup_Msg = "source_node(4): Missed wakeup or machine is overloaded?";
+ run_source_node_test<int, isThrowing, isThrowing>();
+ g_Wakeup_Msg = "source_node(5): Missed wakeup or machine is overloaded?";
+ run_source_node_test<check_type<int>, isThrowing, isThrowing>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+ ASSERT(!check_type<int>::check_type_counter, "Some items leaked in test");
+}
+
+// -------- utilities & types to test function_node and multifunction_node.
+
+// need to tell the template which node type I am using so it attaches successors correctly.
+enum NodeFetchType { func_node_type, multifunc_node_type };
+
+template<class NodeType, class ItemType, int indx, NodeFetchType NFT>
+struct AttachPoint;
+
+template<class NodeType, class ItemType, int indx>
+struct AttachPoint<NodeType,ItemType,indx,multifunc_node_type> {
+ static tbb::flow::sender<ItemType> &GetSender(NodeType &n) {
+ return tbb::flow::output_port<indx>(n);
+ }
+};
+
+template<class NodeType, class ItemType, int indx>
+struct AttachPoint<NodeType,ItemType,indx,func_node_type> {
+ static tbb::flow::sender<ItemType> &GetSender(NodeType &n) {
+ return n;
+ }
+};
+
+
+// common template for running function_node, multifunction_node. continue_node
+// has different firing requirements, so it needs a different graph topology.
+template<
+ class SourceNodeType,
+ class SourceNodeBodyType0,
+ class SourceNodeBodyType1,
+ NodeFetchType NFT,
+ class TestNodeType,
+ class TestNodeBodyType,
+ class TypeToSink0, // what kind of item are we sending to sink0
+ class TypeToSink1, // what kind of item are we sending to sink1
+ class SinkNodeType0, // will be same for function;
+ class SinkNodeType1, // may differ for multifunction_node
+ class SinkNodeBodyType0,
+ class SinkNodeBodyType1,
+ size_t Conc
+ >
+void
+run_one_functype_node_test(bool throwException, bool flog, const char * /*name*/) {
+
+ char mymsg[132];
+ char *saved_msg = const_cast<char *>(g_Wakeup_Msg);
+ tbb::flow::graph g;
+
+ tbb::atomic<int> source0_count;
+ tbb::atomic<int> source1_count;
+ tbb::atomic<int> sink0_count;
+ tbb::atomic<int> sink1_count;
+ tbb::atomic<int> test_count;
+ source0_count = source1_count = sink0_count = sink1_count = test_count = 0;
+
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+
+ g_Master = Harness::CurrentTid();
+ SourceNodeType source0(g, SourceNodeBodyType0(source0_count),/*is_active*/false);
+ SourceNodeType source1(g, SourceNodeBodyType1(source1_count),/*is_active*/false);
+ TestNodeType node_to_test(g, Conc, TestNodeBodyType(test_count));
+ SinkNodeType0 sink0(g,tbb::flow::unlimited,SinkNodeBodyType0(sink0_count));
+ SinkNodeType1 sink1(g,tbb::flow::unlimited,SinkNodeBodyType1(sink1_count));
+ make_edge(source0, node_to_test);
+ make_edge(source1, node_to_test);
+ make_edge(AttachPoint<TestNodeType, TypeToSink0, 0, NFT>::GetSender(node_to_test), sink0);
+ make_edge(AttachPoint<TestNodeType, TypeToSink1, 1, NFT>::GetSender(node_to_test), sink1);
+
+ for(int iter = 0; iter < 2; ++iter) { // run, reset, run again
+ sprintf(mymsg, "%s iter=%d, threads=%d, throw=%s, flog=%s", saved_msg, iter, g_NumThreads,
+ throwException?"T":"F", flog?"T":"F");
+ g_Wakeup_Msg = mymsg;
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source0.activate();
+ source1.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source0.activate();
+ source1.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb0_cnt = tbb::flow::copy_body<SourceNodeBodyType0>(source0).count_value();
+ int sb1_cnt = tbb::flow::copy_body<SourceNodeBodyType1>(source1).count_value();
+ int t_cnt = tbb::flow::copy_body<TestNodeBodyType>(node_to_test).count_value();
+ int nb0_cnt = tbb::flow::copy_body<SinkNodeBodyType0>(sink0).count_value();
+ int nb1_cnt = tbb::flow::copy_body<SinkNodeBodyType1>(sink1).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb0_cnt + sb1_cnt <= 2*g_NumItems, "Too many items sent by sources");
+ ASSERT(sb0_cnt + sb1_cnt >= t_cnt, "Too many items received by test node");
+ ASSERT(nb0_cnt + nb1_cnt <= t_cnt*2, "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(sb0_cnt + sb1_cnt == 2*g_NumItems, "Missing invocations of source_nodes");
+ ASSERT(t_cnt == 2*g_NumItems, "Not all items reached test node");
+ ASSERT(nb0_cnt == 2*g_NumItems && nb1_cnt == 2*g_NumItems, "Missing items in absorbers");
+ }
+ g.reset(); // resets the body of the source_nodes, test_node and the absorb_nodes.
+ source0_count = source1_count = sink0_count = sink1_count = test_count = 0;
+ ASSERT(0 == tbb::flow::copy_body<SourceNodeBodyType0>(source0).count_value(),"Reset source 0 failed");
+ ASSERT(0 == tbb::flow::copy_body<SourceNodeBodyType1>(source1).count_value(),"Reset source 1 failed");
+ ASSERT(0 == tbb::flow::copy_body<TestNodeBodyType>(node_to_test).count_value(),"Reset test_node failed");
+ ASSERT(0 == tbb::flow::copy_body<SinkNodeBodyType0>(sink0).count_value(),"Reset sink 0 failed");
+ ASSERT(0 == tbb::flow::copy_body<SinkNodeBodyType1>(sink1).count_value(),"Reset sink 1 failed");
+
+ g_Wakeup_Msg = saved_msg;
+ }
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+}
+
+// Test function_node
+//
+// graph being tested is
+//
+// source_node -\ /- parallel function_node
+// \ /
+// +function_node+
+// / \ x
+// source_node -/ \- parallel function_node
+//
+// After each run the graph is reset(), to test the reset functionality.
+//
+template<
+ TestNodeTypeEnum SType1, // does source node 1 throw?
+ TestNodeTypeEnum SType2, // does source node 2 throw?
+ class Item12, // type of item passed between sources and test node
+ TestNodeTypeEnum FType, // does function node throw?
+ class Item23, // type passed from function_node to sink nodes
+ TestNodeTypeEnum NType1, // does sink node 1 throw?
+ TestNodeTypeEnum NType2, // does sink node 1 throw?
+ tbb::flow::graph_buffer_policy NodePolicy, // rejecting,queueing
+ size_t Conc // is node concurrent? {serial | limited | unlimited}
+>
+void run_function_node_test() {
+
+ typedef test_source_body<Item12,SType1> SBodyType1;
+ typedef test_source_body<Item12,SType2> SBodyType2;
+ typedef absorber_body<Item12, Item23, FType, Conc> TestBodyType;
+ typedef absorber_body<Item23,tbb::flow::continue_msg, NType1, unlimited_type> SinkBodyType1;
+ typedef absorber_body<Item23,tbb::flow::continue_msg, NType2, unlimited_type> SinkBodyType2;
+
+ typedef tbb::flow::source_node<Item12> SrcType;
+ typedef tbb::flow::function_node<Item12, Item23, NodePolicy> TestType;
+ typedef tbb::flow::function_node<Item23,tbb::flow::continue_msg> SnkType;
+
+ for(int i = 0; i < 4; ++i ) {
+ if(i != 2) { // doesn't make sense to flog a non-throwing test
+ bool doThrow = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_functype_node_test<
+ /*SourceNodeType*/ SrcType,
+ /*SourceNodeBodyType0*/ SBodyType1,
+ /*SourceNodeBodyType1*/ SBodyType2,
+ /* NFT */ func_node_type,
+ /*TestNodeType*/ TestType,
+ /*TestNodeBodyType*/ TestBodyType,
+ /*TypeToSink0 */ Item23,
+ /*TypeToSink1 */ Item23,
+ /*SinkNodeType0*/ SnkType,
+ /*SinkNodeType1*/ SnkType,
+ /*SinkNodeBodyType1*/ SinkBodyType1,
+ /*SinkNodeBodyType2*/ SinkBodyType2,
+ /*Conc*/ Conc>
+ (doThrow,doFlog,"function_node");
+ }
+ }
+} // run_function_node_test
+
+void test_function_node() {
+ REMARK("Testing function_node\n");
+ // serial rejecting
+ g_Wakeup_Msg = "function_node(1a): Missed wakeup or machine is overloaded?";
+ run_function_node_test<isThrowing, nonThrowing, int, nonThrowing, int, nonThrowing, nonThrowing, tbb::flow::rejecting, serial_type>();
+ g_Wakeup_Msg = "function_node(1b): Missed wakeup or machine is overloaded?";
+ run_function_node_test<nonThrowing, nonThrowing, int, isThrowing, int, nonThrowing, nonThrowing, tbb::flow::rejecting, serial_type>();
+ g_Wakeup_Msg = "function_node(1c): Missed wakeup or machine is overloaded?";
+ run_function_node_test<nonThrowing, nonThrowing, int, nonThrowing, int, isThrowing, nonThrowing, tbb::flow::rejecting, serial_type>();
+
+ // serial queueing
+ g_Wakeup_Msg = "function_node(2): Missed wakeup or machine is overloaded?";
+ run_function_node_test<isThrowing, nonThrowing, int, nonThrowing, int, nonThrowing, nonThrowing, tbb::flow::queueing, serial_type>();
+ run_function_node_test<nonThrowing, nonThrowing, int, isThrowing, int, nonThrowing, nonThrowing, tbb::flow::queueing, serial_type>();
+ run_function_node_test<nonThrowing, nonThrowing, int, nonThrowing, int, isThrowing, nonThrowing, tbb::flow::queueing, serial_type>();
+ check_type<int>::check_type_counter = 0;
+ run_function_node_test<nonThrowing, nonThrowing, check_type<int>, nonThrowing, check_type<int>, isThrowing, nonThrowing, tbb::flow::queueing, serial_type>();
+ ASSERT(!check_type<int>::check_type_counter, "Some items leaked in test");
+
+ // unlimited parallel rejecting
+ g_Wakeup_Msg = "function_node(3): Missed wakeup or machine is overloaded?";
+ run_function_node_test<isThrowing, nonThrowing, int, nonThrowing, int, nonThrowing, nonThrowing, tbb::flow::rejecting, unlimited_type>();
+ run_function_node_test<nonThrowing, nonThrowing, int, isThrowing, int, nonThrowing, nonThrowing, tbb::flow::rejecting, unlimited_type>();
+ run_function_node_test<nonThrowing, nonThrowing, int, nonThrowing, int, nonThrowing, isThrowing, tbb::flow::rejecting, unlimited_type>();
+
+ // limited parallel rejecting
+ g_Wakeup_Msg = "function_node(4): Missed wakeup or machine is overloaded?";
+ run_function_node_test<isThrowing, nonThrowing, int, nonThrowing, int, nonThrowing, nonThrowing, tbb::flow::rejecting, limited_type>();
+ run_function_node_test<nonThrowing, nonThrowing, int, isThrowing, int, nonThrowing, nonThrowing, tbb::flow::rejecting, (size_t)limited_type>();
+ run_function_node_test<nonThrowing, nonThrowing, int, nonThrowing, int, nonThrowing, isThrowing, tbb::flow::rejecting, (size_t)limited_type>();
+
+ // limited parallel queueing
+ g_Wakeup_Msg = "function_node(5): Missed wakeup or machine is overloaded?";
+ run_function_node_test<isThrowing, nonThrowing, int, nonThrowing, int, nonThrowing, nonThrowing, tbb::flow::queueing, (size_t)limited_type>();
+ run_function_node_test<nonThrowing, nonThrowing, int, isThrowing, int, nonThrowing, nonThrowing, tbb::flow::queueing, (size_t)limited_type>();
+ run_function_node_test<nonThrowing, nonThrowing, int, nonThrowing, int, nonThrowing, isThrowing, tbb::flow::queueing, (size_t)limited_type>();
+
+ // everyone throwing
+ g_Wakeup_Msg = "function_node(6): Missed wakeup or machine is overloaded?";
+ run_function_node_test<isThrowing, isThrowing, int, isThrowing, int, isThrowing, isThrowing, tbb::flow::rejecting, unlimited_type>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+}
+
+// ----------------------------------- multifunction_node ----------------------------------
+// Test multifunction_node.
+//
+// graph being tested is
+//
+// source_node -\ /- parallel function_node
+// \ /
+// +multifunction_node+
+// / \ x
+// source_node -/ \- parallel function_node
+//
+// After each run the graph is reset(), to test the reset functionality. The
+// multifunction_node will put an item to each successor for every item
+// received.
+//
+template<
+ TestNodeTypeEnum SType0, // does source node 1 throw?
+ TestNodeTypeEnum SType1, // does source node 2 thorw?
+ class Item12, // type of item passed between sources and test node
+ TestNodeTypeEnum FType, // does multifunction node throw?
+ class ItemTuple, // tuple of types passed from multifunction_node to sink nodes
+ TestNodeTypeEnum NType1, // does sink node 1 throw?
+ TestNodeTypeEnum NType2, // does sink node 2 throw?
+ tbb::flow::graph_buffer_policy NodePolicy, // rejecting,queueing
+ size_t Conc // is node concurrent? {serial | limited | unlimited}
+>
+void run_multifunction_node_test() {
+
+ typedef typename tbb::flow::tuple_element<0,ItemTuple>::type Item23Type0;
+ typedef typename tbb::flow::tuple_element<1,ItemTuple>::type Item23Type1;
+ typedef test_source_body<Item12,SType0> SBodyType1;
+ typedef test_source_body<Item12,SType1> SBodyType2;
+ typedef multifunction_node_body<Item12, ItemTuple, FType, Conc> TestBodyType;
+ typedef absorber_body<Item23Type0,tbb::flow::continue_msg, NType1, unlimited_type> SinkBodyType1;
+ typedef absorber_body<Item23Type1,tbb::flow::continue_msg, NType2, unlimited_type> SinkBodyType2;
+
+ typedef tbb::flow::source_node<Item12> SrcType;
+ typedef tbb::flow::multifunction_node<Item12, ItemTuple, NodePolicy> TestType;
+ typedef tbb::flow::function_node<Item23Type0,tbb::flow::continue_msg> SnkType0;
+ typedef tbb::flow::function_node<Item23Type1,tbb::flow::continue_msg> SnkType1;
+
+ for(int i = 0; i < 4; ++i ) {
+ if(i != 2) { // doesn't make sense to flog a non-throwing test
+ bool doThrow = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_functype_node_test<
+ /*SourceNodeType*/ SrcType,
+ /*SourceNodeBodyType0*/ SBodyType1,
+ /*SourceNodeBodyType1*/ SBodyType2,
+ /*NFT*/ multifunc_node_type,
+ /*TestNodeType*/ TestType,
+ /*TestNodeBodyType*/ TestBodyType,
+ /*TypeToSink0*/ Item23Type0,
+ /*TypeToSink1*/ Item23Type1,
+ /*SinkNodeType0*/ SnkType0,
+ /*SinkNodeType1*/ SnkType1,
+ /*SinkNodeBodyType0*/ SinkBodyType1,
+ /*SinkNodeBodyType1*/ SinkBodyType2,
+ /*Conc*/ Conc>
+ (doThrow,doFlog,"multifunction_node");
+ }
+ }
+} // run_multifunction_node_test
+
+void test_multifunction_node() {
+ REMARK("Testing multifunction_node\n");
+ g_Wakeup_Msg = "multifunction_node(source throws,rejecting,serial): Missed wakeup or machine is overloaded?";
+ // serial rejecting
+ run_multifunction_node_test<isThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,float>, nonThrowing, nonThrowing, tbb::flow::rejecting, serial_type>();
+ g_Wakeup_Msg = "multifunction_node(test throws,rejecting,serial): Missed wakeup or machine is overloaded?";
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, isThrowing, tbb::flow::tuple<int,int>, nonThrowing, nonThrowing, tbb::flow::rejecting, serial_type>();
+ g_Wakeup_Msg = "multifunction_node(sink throws,rejecting,serial): Missed wakeup or machine is overloaded?";
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,int>, isThrowing, nonThrowing, tbb::flow::rejecting, serial_type>();
+
+ g_Wakeup_Msg = "multifunction_node(2): Missed wakeup or machine is overloaded?";
+ // serial queueing
+ run_multifunction_node_test<isThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,int>, nonThrowing, nonThrowing, tbb::flow::queueing, serial_type>();
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, isThrowing, tbb::flow::tuple<int,int>, nonThrowing, nonThrowing, tbb::flow::queueing, serial_type>();
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,int>, isThrowing, nonThrowing, tbb::flow::queueing, serial_type>();
+ check_type<int>::check_type_counter = 0;
+ run_multifunction_node_test<nonThrowing, nonThrowing, check_type<int>, nonThrowing, tbb::flow::tuple<check_type<int>, check_type<int> >, isThrowing, nonThrowing, tbb::flow::queueing, serial_type>();
+ ASSERT(!check_type<int>::check_type_counter, "Some items leaked in test");
+
+ g_Wakeup_Msg = "multifunction_node(3): Missed wakeup or machine is overloaded?";
+ // unlimited parallel rejecting
+ run_multifunction_node_test<isThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,int>, nonThrowing, nonThrowing, tbb::flow::rejecting, unlimited_type>();
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, isThrowing, tbb::flow::tuple<int,int>, nonThrowing, nonThrowing, tbb::flow::rejecting, unlimited_type>();
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,int>, nonThrowing, isThrowing, tbb::flow::rejecting, unlimited_type>();
+
+ g_Wakeup_Msg = "multifunction_node(4): Missed wakeup or machine is overloaded?";
+ // limited parallel rejecting
+ run_multifunction_node_test<isThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,int>, nonThrowing, nonThrowing, tbb::flow::rejecting, limited_type>();
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, isThrowing, tbb::flow::tuple<int,int>, nonThrowing, nonThrowing, tbb::flow::rejecting, (size_t)limited_type>();
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,int>, nonThrowing, isThrowing, tbb::flow::rejecting, (size_t)limited_type>();
+
+ g_Wakeup_Msg = "multifunction_node(5): Missed wakeup or machine is overloaded?";
+ // limited parallel queueing
+ run_multifunction_node_test<isThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,int>, nonThrowing, nonThrowing, tbb::flow::queueing, (size_t)limited_type>();
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, isThrowing, tbb::flow::tuple<int,int>, nonThrowing, nonThrowing, tbb::flow::queueing, (size_t)limited_type>();
+ run_multifunction_node_test<nonThrowing, nonThrowing, int, nonThrowing, tbb::flow::tuple<int,int>, nonThrowing, isThrowing, tbb::flow::queueing, (size_t)limited_type>();
+
+ g_Wakeup_Msg = "multifunction_node(6): Missed wakeup or machine is overloaded?";
+ // everyone throwing
+ run_multifunction_node_test<isThrowing, isThrowing, int, isThrowing, tbb::flow::tuple<int,int>, isThrowing, isThrowing, tbb::flow::rejecting, unlimited_type>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+}
+
+//
+// Continue node has T predecessors. when it receives messages (continue_msg) on T predecessors
+// it executes the body of the node, and forwards a continue_msg to its successors.
+// However many predecessors the continue_node has, that's how many continue_msgs it receives
+// on input before forwarding a message.
+//
+// The graph will look like
+//
+// +broadcast_node+
+// / \ ___
+// source_node+------>+broadcast_node+ +continue_node+--->+absorber
+// \ /
+// +broadcast_node+
+//
+// The continue_node has unlimited parallelism, no input buffering, and broadcasts to successors.
+// The absorber is parallel, so each item emitted by the source will result in one thread
+// spinning. So for N threads we pass N-1 continue_messages, then spin wait and then throw if
+// we are allowed to.
+
+template < class SourceNodeType, class SourceNodeBodyType, class TTestNodeType, class TestNodeBodyType,
+ class SinkNodeType, class SinkNodeBodyType>
+void run_one_continue_node_test (bool throwException, bool flog) {
+ tbb::flow::graph g;
+
+ tbb::atomic<int> source_count;
+ tbb::atomic<int> test_count;
+ tbb::atomic<int> sink_count;
+ source_count = test_count = sink_count = 0;
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+ g_Master = Harness::CurrentTid();
+ SourceNodeType source(g, SourceNodeBodyType(source_count),/*is_active*/false);
+ TTestNodeType node_to_test(g, TestNodeBodyType(test_count));
+ SinkNodeType sink(g,tbb::flow::unlimited,SinkNodeBodyType(sink_count));
+ tbb::flow::broadcast_node<tbb::flow::continue_msg> b1(g), b2(g), b3(g);
+ make_edge(source, b1);
+ make_edge(b1,b2);
+ make_edge(b1,b3);
+ make_edge(b2,node_to_test);
+ make_edge(b3,node_to_test);
+ make_edge(node_to_test, sink);
+ for(int iter = 0; iter < 2; ++iter) {
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb_cnt = tbb::flow::copy_body<SourceNodeBodyType>(source).count_value();
+ int t_cnt = tbb::flow::copy_body<TestNodeBodyType>(node_to_test).count_value();
+ int nb_cnt = tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb_cnt <= g_NumItems, "Too many items sent by sources");
+ ASSERT(sb_cnt >= t_cnt, "Too many items received by test node");
+ ASSERT(nb_cnt <= t_cnt, "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(sb_cnt == g_NumItems, "Missing invocations of source_node");
+ ASSERT(t_cnt == g_NumItems, "Not all items reached test node");
+ ASSERT(nb_cnt == g_NumItems, "Missing items in absorbers");
+ }
+ g.reset(); // resets the body of the source_nodes, test_node and the absorb_nodes.
+ source_count = test_count = sink_count = 0;
+ ASSERT(0 == (int)test_count, "Atomic wasn't reset properly");
+ ASSERT(0 == tbb::flow::copy_body<SourceNodeBodyType>(source).count_value(),"Reset source failed");
+ ASSERT(0 == tbb::flow::copy_body<TestNodeBodyType>(node_to_test).count_value(),"Reset test_node failed");
+ ASSERT(0 == tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value(),"Reset sink failed");
+ }
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+}
+
+template<
+ class ItemType,
+ TestNodeTypeEnum SType, // does source node throw?
+ TestNodeTypeEnum CType, // does continue_node throw?
+ TestNodeTypeEnum AType> // does absorber throw
+void run_continue_node_test() {
+ typedef test_source_body<tbb::flow::continue_msg,SType> SBodyType;
+ typedef absorber_body<tbb::flow::continue_msg,ItemType,CType,unlimited_type> ContBodyType;
+ typedef absorber_body<ItemType,tbb::flow::continue_msg, AType, unlimited_type> SinkBodyType;
+
+ typedef tbb::flow::source_node<tbb::flow::continue_msg> SrcType;
+ typedef tbb::flow::continue_node<ItemType> TestType;
+ typedef tbb::flow::function_node<ItemType,tbb::flow::continue_msg> SnkType;
+
+ for(int i = 0; i < 4; ++i ) {
+ if(i == 2) continue; // don't run (false,true); it doesn't make sense.
+ bool doThrow = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_continue_node_test<
+ /*SourceNodeType*/ SrcType,
+ /*SourceNodeBodyType*/ SBodyType,
+ /*TestNodeType*/ TestType,
+ /*TestNodeBodyType*/ ContBodyType,
+ /*SinkNodeType*/ SnkType,
+ /*SinkNodeBodyType*/ SinkBodyType>
+ (doThrow,doFlog);
+ }
+}
+
+//
+void test_continue_node() {
+ REMARK("Testing continue_node\n");
+ g_Wakeup_Msg = "buffer_node(non,is,non): Missed wakeup or machine is overloaded?";
+ run_continue_node_test<int,nonThrowing,isThrowing,nonThrowing>();
+ g_Wakeup_Msg = "buffer_node(non,non,is): Missed wakeup or machine is overloaded?";
+ run_continue_node_test<int,nonThrowing,nonThrowing,isThrowing>();
+ g_Wakeup_Msg = "buffer_node(is,non,non): Missed wakeup or machine is overloaded?";
+ run_continue_node_test<int,isThrowing,nonThrowing,nonThrowing>();
+ g_Wakeup_Msg = "buffer_node(is,is,is): Missed wakeup or machine is overloaded?";
+ run_continue_node_test<int,isThrowing,isThrowing,isThrowing>();
+ check_type<double>::check_type_counter = 0;
+ run_continue_node_test<check_type<double>,isThrowing,isThrowing,isThrowing>();
+ ASSERT(!check_type<double>::check_type_counter, "Dropped objects in continue_node test");
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+}
+
+// ---------- buffer_node queue_node overwrite_node --------------
+
+template<
+ class BufferItemType, //
+ class SourceNodeType,
+ class SourceNodeBodyType,
+ class TestNodeType,
+ class SinkNodeType,
+ class SinkNodeBodyType >
+void run_one_buffer_node_test(bool throwException,bool flog) {
+ tbb::flow::graph g;
+
+ tbb::atomic<int> source_count;
+ tbb::atomic<int> sink_count;
+ source_count = sink_count = 0;
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+ g_Master = Harness::CurrentTid();
+ SourceNodeType source(g, SourceNodeBodyType(source_count),/*is_active*/false);
+ TestNodeType node_to_test(g);
+ SinkNodeType sink(g,tbb::flow::unlimited,SinkNodeBodyType(sink_count));
+ make_edge(source,node_to_test);
+ make_edge(node_to_test, sink);
+ for(int iter = 0; iter < 2; ++iter) {
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb_cnt = tbb::flow::copy_body<SourceNodeBodyType>(source).count_value();
+ int nb_cnt = tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb_cnt <= g_NumItems, "Too many items sent by sources");
+ ASSERT(nb_cnt <= sb_cnt, "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(sb_cnt == g_NumItems, "Missing invocations of source_node");
+ ASSERT(nb_cnt == g_NumItems, "Missing items in absorbers");
+ }
+ if(iter == 0) {
+ remove_edge(node_to_test, sink);
+ node_to_test.try_put(BufferItemType());
+ g.wait_for_all();
+ g.reset();
+ source_count = sink_count = 0;
+ BufferItemType tmp;
+ ASSERT(!node_to_test.try_get(tmp), "node not empty");
+ make_edge(node_to_test, sink);
+ g.wait_for_all();
+ }
+ else {
+ g.reset();
+ source_count = sink_count = 0;
+ }
+ ASSERT(0 == tbb::flow::copy_body<SourceNodeBodyType>(source).count_value(),"Reset source failed");
+ ASSERT(0 == tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value(),"Reset sink failed");
+ }
+
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+}
+
+template<class BufferItemType,
+ TestNodeTypeEnum SourceThrowType,
+ TestNodeTypeEnum SinkThrowType>
+void run_buffer_queue_and_overwrite_node_test() {
+ typedef test_source_body<BufferItemType,SourceThrowType> SourceBodyType;
+ typedef absorber_body<BufferItemType,tbb::flow::continue_msg,SinkThrowType,unlimited_type> SinkBodyType;
+
+ typedef tbb::flow::source_node<BufferItemType> SrcType;
+ typedef tbb::flow::buffer_node<BufferItemType> BufType;
+ typedef tbb::flow::queue_node<BufferItemType> QueType;
+ typedef tbb::flow::overwrite_node<BufferItemType> OvrType;
+ typedef tbb::flow::function_node<BufferItemType,tbb::flow::continue_msg> SnkType;
+
+ for(int i = 0; i < 4; ++i) {
+ if(i == 2) continue; // no need to test flog w/o throws
+ bool throwException = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_buffer_node_test<
+ /* class BufferItemType*/ BufferItemType,
+ /*class SourceNodeType*/ SrcType,
+ /*class SourceNodeBodyType*/ SourceBodyType,
+ /*class TestNodeType*/ BufType,
+ /*class SinkNodeType*/ SnkType,
+ /*class SinkNodeBodyType*/ SinkBodyType
+ >(throwException, doFlog);
+ run_one_buffer_node_test<
+ /* class BufferItemType*/ BufferItemType,
+ /*class SourceNodeType*/ SrcType,
+ /*class SourceNodeBodyType*/ SourceBodyType,
+ /*class TestNodeType*/ QueType,
+ /*class SinkNodeType*/ SnkType,
+ /*class SinkNodeBodyType*/ SinkBodyType
+ >(throwException, doFlog);
+ run_one_buffer_node_test<
+ /* class BufferItemType*/ BufferItemType,
+ /*class SourceNodeType*/ SrcType,
+ /*class SourceNodeBodyType*/ SourceBodyType,
+ /*class TestNodeType*/ OvrType,
+ /*class SinkNodeType*/ SnkType,
+ /*class SinkNodeBodyType*/ SinkBodyType
+ >(throwException, doFlog);
+ }
+}
+
+void test_buffer_queue_and_overwrite_node() {
+ REMARK("Testing buffer_node, queue_node and overwrite_node\n");
+ g_Wakeup_Msg = "buffer, queue, overwrite(is,non): Missed wakeup or machine is overloaded?";
+ run_buffer_queue_and_overwrite_node_test<int,isThrowing,nonThrowing>();
+ g_Wakeup_Msg = "buffer, queue, overwrite(non,is): Missed wakeup or machine is overloaded?";
+ run_buffer_queue_and_overwrite_node_test<int,nonThrowing,isThrowing>();
+ g_Wakeup_Msg = "buffer, queue, overwrite(is,is): Missed wakeup or machine is overloaded?";
+ run_buffer_queue_and_overwrite_node_test<int,isThrowing,isThrowing>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+}
+
+// ---------- sequencer_node -------------------------
+
+
+template<
+ class BufferItemType, //
+ class SourceNodeType,
+ class SourceNodeBodyType,
+ class TestNodeType,
+ class SeqBodyType,
+ class SinkNodeType,
+ class SinkNodeBodyType >
+void run_one_sequencer_node_test(bool throwException,bool flog) {
+ tbb::flow::graph g;
+
+ tbb::atomic<int> source_count;
+ tbb::atomic<int> sink_count;
+ source_count = sink_count = 0;
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+ g_Master = Harness::CurrentTid();
+ SourceNodeType source(g, SourceNodeBodyType(source_count),/*is_active*/false);
+ TestNodeType node_to_test(g,SeqBodyType());
+ SinkNodeType sink(g,tbb::flow::unlimited,SinkNodeBodyType(sink_count));
+ make_edge(source,node_to_test);
+ make_edge(node_to_test, sink);
+ for(int iter = 0; iter < 2; ++iter) {
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb_cnt = tbb::flow::copy_body<SourceNodeBodyType>(source).count_value();
+ int nb_cnt = tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb_cnt <= g_NumItems, "Too many items sent by sources");
+ ASSERT(nb_cnt <= sb_cnt, "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(sb_cnt == g_NumItems, "Missing invocations of source_node");
+ ASSERT(nb_cnt == g_NumItems, "Missing items in absorbers");
+ }
+ if(iter == 0) {
+ remove_edge(node_to_test, sink);
+ node_to_test.try_put(BufferItemType(g_NumItems + 1));
+ node_to_test.try_put(BufferItemType());
+ g.wait_for_all();
+ g.reset();
+ source_count = sink_count = 0;
+ make_edge(node_to_test, sink);
+ g.wait_for_all();
+ }
+ else {
+ g.reset();
+ source_count = sink_count = 0;
+ }
+ ASSERT(0 == tbb::flow::copy_body<SourceNodeBodyType>(source).count_value(),"Reset source failed");
+ ASSERT(0 == tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value(),"Reset sink failed");
+ }
+
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+}
+
+template<class BufferItemType,
+ TestNodeTypeEnum SourceThrowType,
+ TestNodeTypeEnum SinkThrowType>
+void run_sequencer_node_test() {
+ typedef test_source_body<BufferItemType,SourceThrowType> SourceBodyType;
+ typedef absorber_body<BufferItemType,tbb::flow::continue_msg,SinkThrowType,unlimited_type> SinkBodyType;
+ typedef sequencer_body<BufferItemType> SeqBodyType;
+
+ typedef tbb::flow::source_node<BufferItemType> SrcType;
+ typedef tbb::flow::sequencer_node<BufferItemType> SeqType;
+ typedef tbb::flow::function_node<BufferItemType,tbb::flow::continue_msg> SnkType;
+
+ for(int i = 0; i < 4; ++i) {
+ if(i == 2) continue; // no need to test flog w/o throws
+ bool throwException = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_sequencer_node_test<
+ /* class BufferItemType*/ BufferItemType,
+ /*class SourceNodeType*/ SrcType,
+ /*class SourceNodeBodyType*/ SourceBodyType,
+ /*class TestNodeType*/ SeqType,
+ /*class SeqBodyType*/ SeqBodyType,
+ /*class SinkNodeType*/ SnkType,
+ /*class SinkNodeBodyType*/ SinkBodyType
+ >(throwException, doFlog);
+ }
+}
+
+
+
+void test_sequencer_node() {
+ REMARK("Testing sequencer_node\n");
+ g_Wakeup_Msg = "sequencer_node(is,non): Missed wakeup or machine is overloaded?";
+ run_sequencer_node_test<int, isThrowing,nonThrowing>();
+ check_type<int>::check_type_counter = 0;
+ g_Wakeup_Msg = "sequencer_node(non,is): Missed wakeup or machine is overloaded?";
+ run_sequencer_node_test<check_type<int>, nonThrowing,isThrowing>();
+ ASSERT(!check_type<int>::check_type_counter, "Dropped objects in sequencer_node test");
+ g_Wakeup_Msg = "sequencer_node(is,is): Missed wakeup or machine is overloaded?";
+ run_sequencer_node_test<int, isThrowing,isThrowing>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+}
+
+// ------------ priority_queue_node ------------------
+
+template<
+ class BufferItemType,
+ class SourceNodeType,
+ class SourceNodeBodyType,
+ class TestNodeType,
+ class SinkNodeType,
+ class SinkNodeBodyType >
+void run_one_priority_queue_node_test(bool throwException,bool flog) {
+ tbb::flow::graph g;
+
+ tbb::atomic<int> source_count;
+ tbb::atomic<int> sink_count;
+ source_count = sink_count = 0;
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+ g_Master = Harness::CurrentTid();
+ SourceNodeType source(g, SourceNodeBodyType(source_count),/*is_active*/false);
+
+ TestNodeType node_to_test(g);
+
+ SinkNodeType sink(g,tbb::flow::unlimited,SinkNodeBodyType(sink_count));
+
+ make_edge(source,node_to_test);
+ make_edge(node_to_test, sink);
+ for(int iter = 0; iter < 2; ++iter) {
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb_cnt = tbb::flow::copy_body<SourceNodeBodyType>(source).count_value();
+ int nb_cnt = tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb_cnt <= g_NumItems, "Too many items sent by sources");
+ ASSERT(nb_cnt <= sb_cnt, "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(sb_cnt == g_NumItems, "Missing invocations of source_node");
+ ASSERT(nb_cnt == g_NumItems, "Missing items in absorbers");
+ }
+ if(iter == 0) {
+ remove_edge(node_to_test, sink);
+ node_to_test.try_put(BufferItemType(g_NumItems + 1));
+ node_to_test.try_put(BufferItemType(g_NumItems + 2));
+ node_to_test.try_put(BufferItemType());
+ g.wait_for_all();
+ g.reset();
+ source_count = sink_count = 0;
+ make_edge(node_to_test, sink);
+ g.wait_for_all();
+ }
+ else {
+ g.reset();
+ source_count = sink_count = 0;
+ }
+ ASSERT(0 == tbb::flow::copy_body<SourceNodeBodyType>(source).count_value(),"Reset source failed");
+ ASSERT(0 == tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value(),"Reset sink failed");
+ }
+
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+}
+
+template<class BufferItemType,
+ TestNodeTypeEnum SourceThrowType,
+ TestNodeTypeEnum SinkThrowType>
+void run_priority_queue_node_test() {
+ typedef test_source_body<BufferItemType,SourceThrowType> SourceBodyType;
+ typedef absorber_body<BufferItemType,tbb::flow::continue_msg,SinkThrowType,unlimited_type> SinkBodyType;
+ typedef less_body<BufferItemType> LessBodyType;
+
+ typedef tbb::flow::source_node<BufferItemType> SrcType;
+ typedef tbb::flow::priority_queue_node<BufferItemType,LessBodyType> PrqType;
+ typedef tbb::flow::function_node<BufferItemType,tbb::flow::continue_msg> SnkType;
+
+ for(int i = 0; i < 4; ++i) {
+ if(i == 2) continue; // no need to test flog w/o throws
+ bool throwException = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_priority_queue_node_test<
+ /* class BufferItemType*/ BufferItemType,
+ /*class SourceNodeType*/ SrcType,
+ /*class SourceNodeBodyType*/ SourceBodyType,
+ /*class TestNodeType*/ PrqType,
+ /*class SinkNodeType*/ SnkType,
+ /*class SinkNodeBodyType*/ SinkBodyType
+ >(throwException, doFlog);
+ }
+}
+
+void test_priority_queue_node() {
+ REMARK("Testing priority_queue_node\n");
+ g_Wakeup_Msg = "priority_queue_node(is,non): Missed wakeup or machine is overloaded?";
+ run_priority_queue_node_test<int, isThrowing,nonThrowing>();
+ check_type<int>::check_type_counter = 0;
+ g_Wakeup_Msg = "priority_queue_node(non,is): Missed wakeup or machine is overloaded?";
+ run_priority_queue_node_test<check_type<int>, nonThrowing,isThrowing>();
+ ASSERT(!check_type<int>::check_type_counter, "Dropped objects in priority_queue_node test");
+ g_Wakeup_Msg = "priority_queue_node(is,is): Missed wakeup or machine is overloaded?";
+ run_priority_queue_node_test<int, isThrowing,isThrowing>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+}
+
+// ------------------- join_node ----------------
+template<tbb::flow::graph_buffer_policy JP> struct graph_policy_name{
+ static const char* name() {return "unknown"; }
+};
+template<> struct graph_policy_name<tbb::flow::queueing> {
+ static const char* name() {return "queueing"; }
+};
+template<> struct graph_policy_name<tbb::flow::reserving> {
+ static const char* name() {return "reserving"; }
+};
+template<> struct graph_policy_name<tbb::flow::tag_matching> {
+ static const char* name() {return "tag_matching"; }
+};
+
+
+template<
+ tbb::flow::graph_buffer_policy JP,
+ class OutputTuple,
+ class SourceType0,
+ class SourceBodyType0,
+ class SourceType1,
+ class SourceBodyType1,
+ class TestJoinType,
+ class SinkType,
+ class SinkBodyType
+ >
+struct run_one_join_node_test {
+ run_one_join_node_test() {}
+ static void execute_test(bool throwException,bool flog) {
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type ItemType0;
+ typedef typename tbb::flow::tuple_element<1,OutputTuple>::type ItemType1;
+
+ tbb::flow::graph g;
+ tbb::atomic<int>source0_count;
+ tbb::atomic<int>source1_count;
+ tbb::atomic<int>sink_count;
+ source0_count = source1_count = sink_count = 0;
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+ g_Master = Harness::CurrentTid();
+ SourceType0 source0(g, SourceBodyType0(source0_count),/*is_active*/false);
+ SourceType1 source1(g, SourceBodyType1(source1_count),/*is_active*/false);
+ TestJoinType node_to_test(g);
+ SinkType sink(g,tbb::flow::unlimited,SinkBodyType(sink_count));
+ make_edge(source0,tbb::flow::input_port<0>(node_to_test));
+ make_edge(source1,tbb::flow::input_port<1>(node_to_test));
+ make_edge(node_to_test, sink);
+ for(int iter = 0; iter < 2; ++iter) {
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source0.activate();
+ source1.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source0.activate();
+ source1.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb0_cnt = tbb::flow::copy_body<SourceBodyType0>(source0).count_value();
+ int sb1_cnt = tbb::flow::copy_body<SourceBodyType1>(source1).count_value();
+ int nb_cnt = tbb::flow::copy_body<SinkBodyType>(sink).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb0_cnt <= g_NumItems && sb1_cnt <= g_NumItems, "Too many items sent by sources");
+ ASSERT(nb_cnt <= ((sb0_cnt < sb1_cnt) ? sb0_cnt : sb1_cnt), "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(sb0_cnt == g_NumItems, "Missing invocations of source_node0");
+ ASSERT(sb1_cnt == g_NumItems, "Missing invocations of source_node1");
+ ASSERT(nb_cnt == g_NumItems, "Missing items in absorbers");
+ }
+ if(iter == 0) {
+ remove_edge(node_to_test, sink);
+ tbb::flow::input_port<0>(node_to_test).try_put(ItemType0(g_NumItems + 1));
+ tbb::flow::input_port<1>(node_to_test).try_put(ItemType1(g_NumItems + 2));
+ g.wait_for_all();
+ g.reset();
+ source0_count = source1_count = sink_count = 0;
+ make_edge(node_to_test, sink);
+ g.wait_for_all();
+ }
+ else {
+ g.wait_for_all();
+ g.reset();
+ source0_count = source1_count = sink_count = 0;
+ }
+ ASSERT(0 == tbb::flow::copy_body<SourceBodyType0>(source0).count_value(),"Reset source failed");
+ ASSERT(0 == tbb::flow::copy_body<SourceBodyType1>(source1).count_value(),"Reset source failed");
+ nb_cnt = tbb::flow::copy_body<SinkBodyType>(sink).count_value();
+ ASSERT(0 == tbb::flow::copy_body<SinkBodyType>(sink).count_value(),"Reset sink failed");
+ }
+
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+ }
+}; // run_one_join_node_test
+
+template<
+ class OutputTuple,
+ class SourceType0,
+ class SourceBodyType0,
+ class SourceType1,
+ class SourceBodyType1,
+ class TestJoinType,
+ class SinkType,
+ class SinkBodyType
+ >
+struct run_one_join_node_test<
+ tbb::flow::tag_matching,
+ OutputTuple,
+ SourceType0,
+ SourceBodyType0,
+ SourceType1,
+ SourceBodyType1,
+ TestJoinType,
+ SinkType,
+ SinkBodyType
+ > {
+ run_one_join_node_test() {}
+ static void execute_test(bool throwException,bool flog) {
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type ItemType0;
+ typedef typename tbb::flow::tuple_element<1,OutputTuple>::type ItemType1;
+
+ tbb::flow::graph g;
+
+ tbb::atomic<int>source0_count;
+ tbb::atomic<int>source1_count;
+ tbb::atomic<int>sink_count;
+ source0_count = source1_count = sink_count = 0;
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+ g_Master = Harness::CurrentTid();
+ SourceType0 source0(g, SourceBodyType0(source0_count, 2),/*is_active*/false);
+ SourceType1 source1(g, SourceBodyType1(source1_count, 3),/*is_active*/false);
+ TestJoinType node_to_test(g, tag_func<ItemType0>(ItemType0(2)), tag_func<ItemType1>(ItemType1(3)));
+ SinkType sink(g,tbb::flow::unlimited,SinkBodyType(sink_count));
+ make_edge(source0,tbb::flow::input_port<0>(node_to_test));
+ make_edge(source1,tbb::flow::input_port<1>(node_to_test));
+ make_edge(node_to_test, sink);
+ for(int iter = 0; iter < 2; ++iter) {
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source0.activate();
+ source1.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source0.activate();
+ source1.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb0_cnt = tbb::flow::copy_body<SourceBodyType0>(source0).count_value();
+ int sb1_cnt = tbb::flow::copy_body<SourceBodyType1>(source1).count_value();
+ int nb_cnt = tbb::flow::copy_body<SinkBodyType>(sink).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb0_cnt <= g_NumItems && sb1_cnt <= g_NumItems, "Too many items sent by sources");
+ ASSERT(nb_cnt <= ((sb0_cnt < sb1_cnt) ? sb0_cnt : sb1_cnt), "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(sb0_cnt == g_NumItems, "Missing invocations of source_node0");
+ ASSERT(sb1_cnt == g_NumItems, "Missing invocations of source_node1");
+ ASSERT(nb_cnt == g_NumItems, "Missing items in absorbers");
+ }
+ if(iter == 0) {
+ remove_edge(node_to_test, sink);
+ tbb::flow::input_port<0>(node_to_test).try_put(ItemType0(g_NumItems + 4));
+ tbb::flow::input_port<1>(node_to_test).try_put(ItemType1(g_NumItems + 2));
+ g.wait_for_all(); // have to wait for the graph to stop again....
+ g.reset(); // resets the body of the source_nodes, test_node and the absorb_nodes.
+ source0_count = source1_count = sink_count = 0;
+ make_edge(node_to_test, sink);
+ g.wait_for_all(); // have to wait for the graph to stop again....
+ }
+ else {
+ g.wait_for_all();
+ g.reset();
+ source0_count = source1_count = sink_count = 0;
+ }
+ ASSERT(0 == tbb::flow::copy_body<SourceBodyType0>(source0).count_value(),"Reset source failed");
+ ASSERT(0 == tbb::flow::copy_body<SourceBodyType1>(source1).count_value(),"Reset source failed");
+ nb_cnt = tbb::flow::copy_body<SinkBodyType>(sink).count_value();
+ ASSERT(0 == tbb::flow::copy_body<SinkBodyType>(sink).count_value(),"Reset sink failed");
+ }
+
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+ }
+}; // run_one_join_node_test<tag_matching>
+
+template<tbb::flow::graph_buffer_policy JP, class OutputTuple,
+ TestNodeTypeEnum SourceThrowType,
+ TestNodeTypeEnum SinkThrowType>
+void run_join_node_test() {
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type ItemType0;
+ typedef typename tbb::flow::tuple_element<1,OutputTuple>::type ItemType1;
+ typedef test_source_body<ItemType0,SourceThrowType> SourceBodyType0;
+ typedef test_source_body<ItemType1,SourceThrowType> SourceBodyType1;
+ typedef absorber_body<OutputTuple,tbb::flow::continue_msg,SinkThrowType,unlimited_type> SinkBodyType;
+
+ typedef typename tbb::flow::source_node<ItemType0> SourceType0;
+ typedef typename tbb::flow::source_node<ItemType1> SourceType1;
+ typedef typename tbb::flow::join_node<OutputTuple,JP> TestJoinType;
+ typedef typename tbb::flow::function_node<OutputTuple,tbb::flow::continue_msg> SinkType;
+
+ for(int i = 0; i < 4; ++i) {
+ if(2 == i) continue;
+ bool throwException = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_join_node_test<
+ JP,
+ OutputTuple,
+ SourceType0,
+ SourceBodyType0,
+ SourceType1,
+ SourceBodyType1,
+ TestJoinType,
+ SinkType,
+ SinkBodyType>::execute_test(throwException,doFlog);
+ }
+}
+
+template<tbb::flow::graph_buffer_policy JP>
+void test_join_node() {
+ REMARK("Testing join_node<%s>\n", graph_policy_name<JP>::name());
+ // only doing two-input joins
+ g_Wakeup_Msg = "join(is,non): Missed wakeup or machine is overloaded?";
+ run_join_node_test<JP, tbb::flow::tuple<int,int>, isThrowing, nonThrowing>();
+ check_type<int>::check_type_counter = 0;
+ g_Wakeup_Msg = "join(non,is): Missed wakeup or machine is overloaded?";
+ run_join_node_test<JP, tbb::flow::tuple<check_type<int>,int>, nonThrowing, isThrowing>();
+ ASSERT(!check_type<int>::check_type_counter, "Dropped items in test");
+ g_Wakeup_Msg = "join(is,is): Missed wakeup or machine is overloaded?";
+ run_join_node_test<JP, tbb::flow::tuple<int,int>, isThrowing, isThrowing>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+}
+
+// ------------------- limiter_node -------------
+
+template<
+ class BufferItemType, //
+ class SourceNodeType,
+ class SourceNodeBodyType,
+ class TestNodeType,
+ class SinkNodeType,
+ class SinkNodeBodyType >
+void run_one_limiter_node_test(bool throwException,bool flog) {
+ tbb::flow::graph g;
+
+ tbb::atomic<int> source_count;
+ tbb::atomic<int> sink_count;
+ source_count = sink_count = 0;
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+ g_Master = Harness::CurrentTid();
+ SourceNodeType source(g, SourceNodeBodyType(source_count),/*is_active*/false);
+ TestNodeType node_to_test(g,g_NumThreads + 1);
+ SinkNodeType sink(g,tbb::flow::unlimited,SinkNodeBodyType(sink_count));
+ make_edge(source,node_to_test);
+ make_edge(node_to_test, sink);
+ for(int iter = 0; iter < 2; ++iter) {
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb_cnt = tbb::flow::copy_body<SourceNodeBodyType>(source).count_value();
+ int nb_cnt = tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb_cnt <= g_NumItems, "Too many items sent by sources");
+ ASSERT(nb_cnt <= sb_cnt, "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ // we stop after limiter's limit, which is g_NumThreads + 1. The source_node
+ // is invoked one extra time, filling its buffer, so its limit is g_NumThreads + 2.
+ ASSERT(sb_cnt == g_NumThreads + 2, "Missing invocations of source_node");
+ ASSERT(nb_cnt == g_NumThreads + 1, "Missing items in absorbers");
+ }
+ if(iter == 0) {
+ remove_edge(node_to_test, sink);
+ node_to_test.try_put(BufferItemType());
+ node_to_test.try_put(BufferItemType());
+ g.wait_for_all();
+ g.reset();
+ source_count = sink_count = 0;
+ BufferItemType tmp;
+ ASSERT(!node_to_test.try_get(tmp), "node not empty");
+ make_edge(node_to_test, sink);
+ g.wait_for_all();
+ }
+ else {
+ g.reset();
+ source_count = sink_count = 0;
+ }
+ ASSERT(0 == tbb::flow::copy_body<SourceNodeBodyType>(source).count_value(),"Reset source failed");
+ ASSERT(0 == tbb::flow::copy_body<SinkNodeBodyType>(sink).count_value(),"Reset sink failed");
+ }
+
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+}
+
+template<class BufferItemType,
+ TestNodeTypeEnum SourceThrowType,
+ TestNodeTypeEnum SinkThrowType>
+void run_limiter_node_test() {
+ typedef test_source_body<BufferItemType,SourceThrowType> SourceBodyType;
+ typedef absorber_body<BufferItemType,tbb::flow::continue_msg,SinkThrowType,unlimited_type> SinkBodyType;
+
+ typedef tbb::flow::source_node<BufferItemType> SrcType;
+ typedef tbb::flow::limiter_node<BufferItemType> LmtType;
+ typedef tbb::flow::function_node<BufferItemType,tbb::flow::continue_msg> SnkType;
+
+ for(int i = 0; i < 4; ++i) {
+ if(i == 2) continue; // no need to test flog w/o throws
+ bool throwException = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_limiter_node_test<
+ /* class BufferItemType*/ BufferItemType,
+ /*class SourceNodeType*/ SrcType,
+ /*class SourceNodeBodyType*/ SourceBodyType,
+ /*class TestNodeType*/ LmtType,
+ /*class SinkNodeType*/ SnkType,
+ /*class SinkNodeBodyType*/ SinkBodyType
+ >(throwException, doFlog);
+ }
+}
+
+void test_limiter_node() {
+ REMARK("Testing limiter_node\n");
+ g_Wakeup_Msg = "limiter_node(is,non): Missed wakeup or machine is overloaded?";
+ run_limiter_node_test<int,isThrowing,nonThrowing>();
+ g_Wakeup_Msg = "limiter_node(non,is): Missed wakeup or machine is overloaded?";
+ run_limiter_node_test<int,nonThrowing,isThrowing>();
+ g_Wakeup_Msg = "limiter_node(is,is): Missed wakeup or machine is overloaded?";
+ run_limiter_node_test<int,isThrowing,isThrowing>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+}
+
+// -------- split_node --------------------
+
+template<
+ class InputTuple,
+ class SourceType,
+ class SourceBodyType,
+ class TestSplitType,
+ class SinkType0,
+ class SinkBodyType0,
+ class SinkType1,
+ class SinkBodyType1>
+void run_one_split_node_test(bool throwException, bool flog) {
+
+ tbb::flow::graph g;
+
+ tbb::atomic<int> source_count;
+ tbb::atomic<int> sink0_count;
+ tbb::atomic<int> sink1_count;
+ source_count = sink0_count = sink1_count = 0;
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+
+ g_Master = Harness::CurrentTid();
+ SourceType source(g, SourceBodyType(source_count),/*is_active*/false);
+ TestSplitType node_to_test(g);
+ SinkType0 sink0(g,tbb::flow::unlimited,SinkBodyType0(sink0_count));
+ SinkType1 sink1(g,tbb::flow::unlimited,SinkBodyType1(sink1_count));
+ make_edge(source, node_to_test);
+ make_edge(tbb::flow::output_port<0>(node_to_test), sink0);
+ make_edge(tbb::flow::output_port<1>(node_to_test), sink1);
+
+ for(int iter = 0; iter < 2; ++iter) { // run, reset, run again
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb_cnt = tbb::flow::copy_body<SourceBodyType>(source).count_value();
+ int nb0_cnt = tbb::flow::copy_body<SinkBodyType0>(sink0).count_value();
+ int nb1_cnt = tbb::flow::copy_body<SinkBodyType1>(sink1).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb_cnt <= 2*g_NumItems, "Too many items sent by source");
+ ASSERT(nb0_cnt + nb1_cnt <= sb_cnt*2, "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(sb_cnt == g_NumItems, "Missing invocations of source_nodes");
+ ASSERT(nb0_cnt == g_NumItems && nb1_cnt == g_NumItems, "Missing items in absorbers");
+ }
+ g.reset(); // resets the body of the source_nodes and the absorb_nodes.
+ source_count = sink0_count = sink1_count = 0;
+ ASSERT(0 == tbb::flow::copy_body<SourceBodyType>(source).count_value(),"Reset source failed");
+ ASSERT(0 == tbb::flow::copy_body<SinkBodyType0>(sink0).count_value(),"Reset sink 0 failed");
+ ASSERT(0 == tbb::flow::copy_body<SinkBodyType1>(sink1).count_value(),"Reset sink 1 failed");
+ }
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+}
+
+template<class InputTuple,
+ TestNodeTypeEnum SourceThrowType,
+ TestNodeTypeEnum SinkThrowType>
+void run_split_node_test() {
+ typedef typename tbb::flow::tuple_element<0,InputTuple>::type ItemType0;
+ typedef typename tbb::flow::tuple_element<1,InputTuple>::type ItemType1;
+ typedef tuple_test_source_body<InputTuple,SourceThrowType> SourceBodyType;
+ typedef absorber_body<ItemType0,tbb::flow::continue_msg,SinkThrowType,unlimited_type> SinkBodyType0;
+ typedef absorber_body<ItemType1,tbb::flow::continue_msg,SinkThrowType,unlimited_type> SinkBodyType1;
+
+ typedef typename tbb::flow::source_node<InputTuple> SourceType;
+ typedef typename tbb::flow::split_node<InputTuple> TestSplitType;
+ typedef typename tbb::flow::function_node<ItemType0,tbb::flow::continue_msg> SinkType0;
+ typedef typename tbb::flow::function_node<ItemType1,tbb::flow::continue_msg> SinkType1;
+
+ for(int i = 0; i < 4; ++i) {
+ if(2 == i) continue;
+ bool throwException = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_split_node_test<
+ InputTuple,
+ SourceType,
+ SourceBodyType,
+ TestSplitType,
+ SinkType0,
+ SinkBodyType0,
+ SinkType1,
+ SinkBodyType1>
+ (throwException,doFlog);
+ }
+}
+
+void test_split_node() {
+ REMARK("Testing split_node\n");
+ g_Wakeup_Msg = "split_node(is,non): Missed wakeup or machine is overloaded?";
+ run_split_node_test<tbb::flow::tuple<int,int>, isThrowing, nonThrowing>();
+ g_Wakeup_Msg = "split_node(non,is): Missed wakeup or machine is overloaded?";
+ run_split_node_test<tbb::flow::tuple<int,int>, nonThrowing, isThrowing>();
+ g_Wakeup_Msg = "split_node(is,is): Missed wakeup or machine is overloaded?";
+ run_split_node_test<tbb::flow::tuple<int,int>, isThrowing, isThrowing>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;
+}
+
+#if TBB_PREVIEW_GRAPH_NODES
+// --------- or_node ----------------------
+
+template < class InputTuple,
+ class SourceType0,
+ class SourceBodyType0,
+ class SourceType1,
+ class SourceBodyType1,
+ class TestNodeType,
+ class SinkType,
+ class SinkBodyType>
+void run_one_or_node_test(bool throwException,bool flog) {
+ typedef typename tbb::flow::tuple_element<0,InputTuple>::type ItemType0;
+ typedef typename tbb::flow::tuple_element<1,InputTuple>::type ItemType1;
+
+ tbb::flow::graph g;
+
+ tbb::atomic<int> source0_count;
+ tbb::atomic<int> source1_count;
+ tbb::atomic<int> sink_count;
+ source0_count = source1_count = sink_count = 0;
+#if USE_TASK_SCHEDULER_OBSERVER
+ eh_test_observer o;
+ o.observe(true);
+#endif
+ g_Master = Harness::CurrentTid();
+ SourceType0 source0(g, SourceBodyType0(source0_count),/*is_active*/false);
+ SourceType1 source1(g, SourceBodyType1(source1_count),/*is_active*/false);
+ TestNodeType node_to_test(g);
+ SinkType sink(g,tbb::flow::unlimited,SinkBodyType(sink_count));
+ make_edge(source0,tbb::flow::input_port<0>(node_to_test));
+ make_edge(source1,tbb::flow::input_port<1>(node_to_test));
+ make_edge(node_to_test, sink);
+ for(int iter = 0; iter < 2; ++iter) {
+ ResetGlobals(throwException,flog);
+ if(throwException) {
+ TRY();
+ source0.activate();
+ source1.activate();
+ g.wait_for_all();
+ CATCH_AND_ASSERT();
+ }
+ else {
+ TRY();
+ source0.activate();
+ source1.activate();
+ g.wait_for_all();
+ CATCH_AND_FAIL();
+ }
+ bool okayNoExceptionsCaught = (g_ExceptionInMaster && !g_MasterExecutedThrow) || (!g_ExceptionInMaster && !g_NonMasterExecutedThrow) || !throwException;
+ int sb0_cnt = tbb::flow::copy_body<SourceBodyType0>(source0).count_value();
+ int sb1_cnt = tbb::flow::copy_body<SourceBodyType1>(source1).count_value();
+ int nb_cnt = tbb::flow::copy_body<SinkBodyType>(sink).count_value();
+ if(throwException) {
+ ASSERT(g.exception_thrown() || okayNoExceptionsCaught, "Exception not caught by graph");
+ ASSERT(g.is_cancelled() || okayNoExceptionsCaught, "Cancellation not signalled in graph");
+ ASSERT(sb0_cnt <= g_NumItems && sb1_cnt <= g_NumItems, "Too many items sent by sources");
+ ASSERT(nb_cnt <= sb0_cnt + sb1_cnt, "Too many items received by sink nodes");
+ }
+ else {
+ ASSERT(!g.exception_thrown(), "Exception flag in flow::graph set but no throw occurred");
+ ASSERT(!g.is_cancelled(), "canceled flag set but no throw occurred");
+ ASSERT(sb0_cnt == g_NumItems, "Missing invocations of source_node0");
+ ASSERT(sb1_cnt == g_NumItems, "Missing invocations of source_node1");
+ ASSERT(nb_cnt == 2*g_NumItems, "Missing items in absorbers");
+ }
+ if(iter == 0) {
+ remove_edge(node_to_test, sink);
+ tbb::flow::input_port<0>(node_to_test).try_put(ItemType0(g_NumItems + 4));
+ tbb::flow::input_port<1>(node_to_test).try_put(ItemType1(g_NumItems + 2));
+ g.wait_for_all();
+ g.reset();
+ source0_count = source1_count = sink_count = 0;
+ make_edge(node_to_test, sink);
+ g.wait_for_all();
+ }
+ else {
+ g.wait_for_all();
+ g.reset();
+ source0_count = source1_count = sink_count = 0;
+ }
+ ASSERT(0 == tbb::flow::copy_body<SourceBodyType0>(source0).count_value(),"Reset source failed");
+ ASSERT(0 == tbb::flow::copy_body<SourceBodyType1>(source1).count_value(),"Reset source failed");
+ nb_cnt = tbb::flow::copy_body<SinkBodyType>(sink).count_value();
+ ASSERT(0 == tbb::flow::copy_body<SinkBodyType>(sink).count_value(),"Reset sink failed");
+ }
+
+#if USE_TASK_SCHEDULER_OBSERVER
+ o.observe(false);
+#endif
+}
+
+template<class InputTuple,
+ TestNodeTypeEnum SourceThrowType,
+ TestNodeTypeEnum SinkThrowType>
+void run_or_node_test() {
+ typedef typename tbb::flow::tuple_element<0,InputTuple>::type ItemType0;
+ typedef typename tbb::flow::tuple_element<1,InputTuple>::type ItemType1;
+ typedef test_source_body<ItemType0,SourceThrowType> SourceBodyType0;
+ typedef test_source_body<ItemType1,SourceThrowType> SourceBodyType1;
+ typedef typename tbb::flow::or_node<InputTuple> TestNodeType;
+ typedef absorber_body<typename TestNodeType::output_type,tbb::flow::continue_msg,SinkThrowType,unlimited_type> SinkBodyType;
+
+ typedef typename tbb::flow::source_node<ItemType0> SourceType0;
+ typedef typename tbb::flow::source_node<ItemType1> SourceType1;
+ typedef typename tbb::flow::function_node<typename TestNodeType::output_type,tbb::flow::continue_msg> SinkType;
+
+ for(int i = 0; i < 4; ++i) {
+ if(2 == i) continue;
+ bool throwException = (i & 0x1) != 0;
+ bool doFlog = (i & 0x2) != 0;
+ run_one_or_node_test<
+ InputTuple,
+ SourceType0,
+ SourceBodyType0,
+ SourceType1,
+ SourceBodyType1,
+ TestNodeType,
+ SinkType,
+ SinkBodyType>(throwException,doFlog);
+ }
+}
+
+void test_or_node() {
+ REMARK("Testing or_node\n");
+ g_Wakeup_Msg = "or_node(is,non): Missed wakeup or machine is overloaded?";
+ run_or_node_test<tbb::flow::tuple<int,int>, isThrowing, nonThrowing>();
+ g_Wakeup_Msg = "or_node(non,is): Missed wakeup or machine is overloaded?";
+ run_or_node_test<tbb::flow::tuple<int,int>, nonThrowing, isThrowing>();
+ g_Wakeup_Msg = "or_node(is,is): Missed wakeup or machine is overloaded?";
+ run_or_node_test<tbb::flow::tuple<int,int>, isThrowing, isThrowing>();
+ g_Wakeup_Msg = g_Orig_Wakeup_Msg;;
+}
+#endif
+
+///////////////////////////////////////////////
+// whole-graph exception test
class Foo {
private:
@@ -77,11 +1956,13 @@ test_flow_graph_exception0() {
ASSERT(false, "Exception not thrown");
}
catch(std::out_of_range& ex) {
- REMARK("Exception: %s\n", ex.what());
+ REMARK("Exception: %s (expected)\n", ex.what());
}
catch(...) {
- REMARK("Unknown exception caught\n");
+ REMARK("Unknown exception caught (expected)\n");
}
+ ASSERT(nExceptions > 0, "Exception caught, but no body signaled exception being thrown");
+ nExceptions = 0;
ASSERT(g.exception_thrown(), "Exception not intercepted");
// if exception set, cancellation also set.
ASSERT(g.is_cancelled(), "Exception cancellation not signaled");
@@ -92,22 +1973,64 @@ test_flow_graph_exception0() {
catch(...) {
ASSERT(false, "Second exception thrown but no task executing");
}
+ ASSERT(nExceptions == 0, "body signaled exception being thrown, but no body executed");
ASSERT(!g.exception_thrown(), "exception_thrown flag not reset");
ASSERT(!g.is_cancelled(), "canceled flag not reset");
}
+
+void TestOneThreadNum(int nThread) {
+ REMARK("Testing %d threads\n", nThread);
+ g_NumItems = ((nThread > NUM_ITEMS) ? nThread *2 : NUM_ITEMS);
+ g_NumThreads = nThread;
+ tbb::task_scheduler_init init(nThread);
+ // whole-graph exception catch and rethrow test
+ test_flow_graph_exception0();
+ for(int i = 0; i < 4; ++i) {
+ g_ExceptionInMaster = (i & 1) != 0;
+ g_SolitaryException = (i & 2) != 0;
+ REMARK("g_ExceptionInMaster == %s, g_SolitaryException == %s\n",
+ g_ExceptionInMaster ? "T":"F",
+ g_SolitaryException ? "T":"F");
+ test_source_node();
+ test_function_node();
+ test_continue_node(); // also test broadcast_node
+ test_multifunction_node();
+ // single- and multi-item buffering nodes
+ test_buffer_queue_and_overwrite_node();
+ test_sequencer_node();
+ test_priority_queue_node();
+
+ // join_nodes
+ test_join_node<tbb::flow::queueing>();
+ test_join_node<tbb::flow::reserving>();
+ test_join_node<tbb::flow::tag_matching>();
+
+ test_limiter_node();
+ test_split_node();
+ // graph for write_once_node will be complicated by the fact the node will
+ // not do try_puts after it has been set. To get parallelism of N we have
+ // to attach N successor nodes to the write_once (or play some similar game).
+ // test_write_once_node();
+#if TBB_PREVIEW_GRAPH_NODES
+ test_or_node();
+#else
+ REMARK("or_node test skipped\n");
+#endif
+ }
+}
#endif // TBB_USE_EXCEPTIONS
#if TBB_USE_EXCEPTIONS
int TestMain() {
- for(int nThread=MinThread; nThread<= MaxThread; ++nThread) {
- tbb::task_scheduler_init init(nThread);
- test_flow_graph_exception0();
+ // reversing the order of tests
+ for(int nThread=MaxThread; nThread >= MinThread; --nThread) {
+ TestOneThreadNum(nThread);
}
+
return Harness::Done;
}
-#else // !TBB_USE_EXCEPTION
+#else
int TestMain() {
return Harness::Skipped;
}
-#endif
-
+#endif // TBB_USE_EXCEPTIONS
diff --git a/src/test/test_eh_tasks.cpp b/src/test/test_eh_tasks.cpp
index 0a6be12..3fb7246 100644
--- a/src/test/test_eh_tasks.cpp
+++ b/src/test/test_eh_tasks.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -269,7 +269,7 @@ void Test4 () {
TRY();
tbb::task::spawn_root_and_wait(tl);
CATCH_AND_ASSERT();
- ASSERT (!exceptionCaught, "exception in this scope is unexpected");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "exception in this scope is unexpected");
intptr_t num_tasks_expected = NUM_ROOT_TASKS * (NUM_CHILD_TASKS + 2);
ASSERT (g_CurStat.Existed() == num_tasks_expected, "Wrong total number of tasks");
if ( g_SolitaryException )
@@ -286,7 +286,7 @@ void Test4_1 () {
TRY();
tbb::task::spawn_root_and_wait(tl);
CATCH_AND_ASSERT();
- ASSERT (!exceptionCaught, "exception in this scope is unexpected");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "exception in this scope is unexpected");
intptr_t num_tasks_expected = NUM_ROOT_TASKS * (NUM_CHILD_TASKS + 2);
ASSERT (g_CurStat.Existed() == num_tasks_expected, "Wrong total number of tasks");
if ( g_SolitaryException )
@@ -321,7 +321,7 @@ void Test5 () {
TRY();
tbb::task::spawn_root_and_wait(tl);
CATCH_AND_ASSERT();
- ASSERT (!exceptionCaught, "unexpected exception intercepted");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "unexpected exception intercepted");
if ( g_SolitaryException ) {
intptr_t num_tasks_expected = NUM_ROOTS_IN_GROUP * (1 + NUM_ROOT_TASKS * (1 + NUM_CHILD_TASKS));
intptr_t min_num_tasks_executed = num_tasks_expected - NUM_ROOT_TASKS * (NUM_CHILD_TASKS + 1);
@@ -337,7 +337,7 @@ class ThrowingRootLauncherTask : public TaskBase {
TRY();
spawn_root_and_wait(r);
CATCH();
- ASSERT (!exceptionCaught, "unexpected exception intercepted");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "unexpected exception intercepted");
ThrowTestException(NUM_CHILD_TASKS);
g_TaskWasCancelled |= is_cancelled();
return NULL;
@@ -359,14 +359,14 @@ class BoundHierarchyLauncherTask : public TaskBase {
TRY();
spawn_root_and_wait(tl);
CATCH_AND_ASSERT();
- ASSERT (exceptionCaught, "no exception occurred");
+ ASSERT (l_ExceptionCaughtAtCurrentLevel, "no exception occurred");
ASSERT (!tl.empty(), "task list was cleared somehow");
if ( g_SolitaryException )
ASSERT (g_TaskWasCancelled, "No tasks were cancelled despite of exception");
if ( m_Recover ) {
// Test task_group_context::unbind and task_group_context::reset methods
g_ThrowException = false;
- exceptionCaught = false;
+ l_ExceptionCaughtAtCurrentLevel = false;
tl.clear();
alloc_roots(ctx, tl);
ctx.reset();
@@ -374,9 +374,9 @@ class BoundHierarchyLauncherTask : public TaskBase {
spawn_root_and_wait(tl);
}
catch (...) {
- exceptionCaught = true;
+ l_ExceptionCaughtAtCurrentLevel = true;
}
- ASSERT (!exceptionCaught, "unexpected exception occurred");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "unexpected exception occurred");
}
return NULL;
}
@@ -397,7 +397,7 @@ void Test6 () {
TRY();
tbb::task::spawn_root_and_wait(r);
CATCH_AND_ASSERT();
- ASSERT (!exceptionCaught, "unexpected exception intercepted");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "unexpected exception intercepted");
// After the first of the branches (ThrowingRootLauncherTask) completes,
// the rest of the task tree may be collapsed before having a chance to execute leaves.
// A number of branches running concurrently with the first one will be able to spawn leaves though.
@@ -425,7 +425,7 @@ void Test7 () {
TRY();
tbb::task::spawn_root_and_wait(r);
CATCH_AND_ASSERT();
- ASSERT (!exceptionCaught, "unexpected exception intercepted");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "unexpected exception intercepted");
ASSERT_TEST_POSTCOND();
} // void Test6 ()
@@ -439,7 +439,7 @@ class BoundHierarchyLauncherTask2 : public TaskBase {
spawn_root_and_wait(tl);
CATCH_AND_ASSERT();
// Exception must be intercepted by RootLauncherTask
- ASSERT (!exceptionCaught, "no exception occurred");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "no exception occurred");
return NULL;
}
}; // class BoundHierarchyLauncherTask2
@@ -455,7 +455,7 @@ void Test8 () {
TRY();
tbb::task::spawn_root_and_wait(r);
CATCH_AND_ASSERT();
- ASSERT (!exceptionCaught, "unexpected exception intercepted");
+ ASSERT (!l_ExceptionCaughtAtCurrentLevel, "unexpected exception intercepted");
if ( g_SolitaryException ) {
intptr_t num_tasks_expected = 1 + NUM_ROOT_TASKS * (2 + NUM_CHILD_TASKS);
intptr_t min_num_tasks_created = 1 + g_NumThreads * (2 + NUM_CHILD_TASKS);
@@ -510,8 +510,6 @@ typedef tbb::movable_exception<int> SolitaryMovableException;
typedef tbb::movable_exception<ExceptionData> MultipleMovableException;
class LeafTaskWithMovableExceptions : public TaskBase {
- bool m_IntAsData;
-
tbb::task* do_execute () {
Harness::ConcurrencyTracker ct;
WaitUntilConcurrencyPeaks();
@@ -573,7 +571,7 @@ void TestMovableException () {
throw;
} catch ( tbb::tbb_exception& e ) {
CheckException(e);
- g_ExceptionCaught = exceptionCaught = true;
+ g_ExceptionCaught = l_ExceptionCaughtAtCurrentLevel = true;
}
catch ( ... ) {
g_ExceptionCaught = true;
@@ -634,7 +632,7 @@ void TestCancelation () {
TRY();
tbb::task::spawn_root_and_wait(tl);
CATCH_AND_FAIL();
- ASSERT (g_CurStat.Executed() <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
+ ASSERT (g_CurStat.Executed() <= g_ExecutedAtLastCatch + g_NumThreads, "Too many tasks were executed after cancellation");
ASSERT_TEST_POSTCOND();
} // void Test9 ()
diff --git a/src/test/test_enumerable_thread_specific.cpp b/src/test/test_enumerable_thread_specific.cpp
index 6ae5a00..590c5fa 100644
--- a/src/test/test_enumerable_thread_specific.cpp
+++ b/src/test/test_enumerable_thread_specific.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -63,8 +63,15 @@
static tbb::atomic<int> construction_counter;
static tbb::atomic<int> destruction_counter;
+#if TBB_USE_DEBUG
+const int REPETITIONS = 4;
+const int N = 10000;
+const int RANGE_MIN=1000;
+#else
const int REPETITIONS = 10;
const int N = 100000;
+const int RANGE_MIN=10000;
+#endif
const int VALID_NUMBER_OF_KEYS = 100;
const double EXPECTED_SUM = (REPETITIONS + 1) * N;
@@ -278,15 +285,15 @@ void run_parallel_scalar_tests_nocombine(const char *test_name) {
ets_type finit_ets(my_finit);
ASSERT( sums.empty(), NULL);
- tbb::parallel_for( tbb::blocked_range<int>( 0, N, 10000 ), parallel_scalar_body<T>( sums ) );
+ tbb::parallel_for( tbb::blocked_range<int>( 0, N, RANGE_MIN ), parallel_scalar_body<T>( sums ) );
ASSERT( !sums.empty(), NULL);
ASSERT( finit_ets.empty(), NULL);
- tbb::parallel_for( tbb::blocked_range<int>( 0, N, 10000 ), parallel_scalar_body<T>( finit_ets ) );
+ tbb::parallel_for( tbb::blocked_range<int>( 0, N, RANGE_MIN ), parallel_scalar_body<T>( finit_ets ) );
ASSERT( !finit_ets.empty(), NULL);
ASSERT(static_sums.empty(), NULL);
- tbb::parallel_for( tbb::blocked_range<int>( 0, N, 10000 ), parallel_scalar_body<T>( static_sums ) );
+ tbb::parallel_for( tbb::blocked_range<int>( 0, N, RANGE_MIN ), parallel_scalar_body<T>( static_sums ) );
ASSERT( !static_sums.empty(), NULL);
// use iterator
@@ -411,11 +418,11 @@ void run_parallel_scalar_tests(const char *test_name) {
ets_type sums(exemplar);
ASSERT( sums.empty(), NULL);
- tbb::parallel_for( tbb::blocked_range<int>( 0, N, 10000 ), parallel_scalar_body<T>( sums ) );
+ tbb::parallel_for( tbb::blocked_range<int>( 0, N, RANGE_MIN ), parallel_scalar_body<T>( sums ) );
ASSERT( !sums.empty(), NULL);
ASSERT(static_sums.empty(), NULL);
- tbb::parallel_for( tbb::blocked_range<int>( 0, N, 10000 ), parallel_scalar_body<T>( static_sums ) );
+ tbb::parallel_for( tbb::blocked_range<int>( 0, N, RANGE_MIN ), parallel_scalar_body<T>( static_sums ) );
ASSERT( !static_sums.empty(), NULL);
@@ -502,7 +509,7 @@ void run_parallel_vector_tests(const char *test_name) {
ets_type vs;
ASSERT( vs.empty(), NULL);
- tbb::parallel_for ( tbb::blocked_range<int> (0, N, 10000), parallel_vector_for_body<T>( vs ) );
+ tbb::parallel_for ( tbb::blocked_range<int> (0, N, RANGE_MIN), parallel_vector_for_body<T>( vs ) );
ASSERT( !vs.empty(), NULL);
// copy construct
@@ -559,7 +566,7 @@ void run_cross_type_vector_tests(const char *test_name) {
ets_nokey_type vs;
ASSERT( vs.empty(), NULL);
- tbb::parallel_for ( tbb::blocked_range<int> (0, N, 10000), parallel_vector_for_body<T>( vs ) );
+ tbb::parallel_for ( tbb::blocked_range<int> (0, N, RANGE_MIN), parallel_vector_for_body<T>( vs ) );
ASSERT( !vs.empty(), NULL);
// copy construct
diff --git a/src/test/test_examples_common_utility.cpp b/src/test/test_examples_common_utility.cpp
new file mode 100644
index 0000000..868be85
--- /dev/null
+++ b/src/test/test_examples_common_utility.cpp
@@ -0,0 +1,597 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#include "harness_defs.h" // for suppress_unused_warning
+#include "harness_assert.h"
+#include "../../examples/common/utility/utility.h"
+#include <sstream>
+
+namespace implementation_unit_tests {
+ namespace argument_dest_test_suite{
+ void test_type_impl_parse_and_store_simple_parse(){
+ int a=0;
+ utility::internal::type_impl<int> a_("","",a);
+ a_.parse_and_store("9");
+ ASSERT(a==9,"");
+ }
+ void test_default_value_of_is_matched(){
+ //Testing for result of is_matched() for arguments not yet tried to be parsed.
+ //I.e. values were set up by argument::constructor.
+ using utility::internal::argument;
+ int i;
+ argument b("","",i);
+ ASSERT(!b.is_matched(),"");
+
+ argument c = b;
+ ASSERT(!c.is_matched(),"");
+
+ argument d = b;
+ d = c;
+ ASSERT(!d.is_matched(),"");
+ }
+ }
+ //TODO: test cases for argument type management
+ namespace compile_only{
+ //TODO: enhance these to actually do checks by a negative test, or (if possible)
+ //by a positive test that at compile time selects between two alternatives,
+ //depending on whether operators exist or not (yes, SFINAE :)) -
+ //as non_pod class does provide the operators, and test do not check that compiler
+ //will reject types which don't have those.
+ using utility::cli_argument_pack;
+ void arg_chain(){
+ cli_argument_pack p;
+ int size=0;
+ p.arg(size,"size","size");
+ }
+ namespace tc_helper{
+ struct non_pod{
+ std::string s;
+ friend std::ostream& operator<<(std::ostream& o, non_pod){ return o;}
+ friend std::istream& operator>>(std::istream& i, non_pod){ return i;}
+ };
+ }
+ void non_pod_dest_type(){
+ cli_argument_pack p;
+ tc_helper::non_pod np;
+ p.arg(np,"","");
+ }
+ }
+ namespace cli_argument_pack_suite{
+ void test_copy_assign(){
+ using utility::cli_argument_pack;
+ int i=9;
+ std::stringstream expected_output; using std::endl;
+ expected_output
+ << " Program usage is:" << endl
+ << " the_binary_name [i=value]"
+ << endl << endl
+ << " where:" << endl
+ << " i - i desc (9)" << endl
+ ;
+ cli_argument_pack copy(cli_argument_pack().arg(i,"i","i desc"));
+ ASSERT(copy.usage_string("the_binary_name") == expected_output.str(),"usage string is not as expected");
+ cli_argument_pack assignee; assignee = copy;
+ ASSERT(assignee.usage_string("the_binary_name") == expected_output.str(),"Copying of cli_argument_pack breaks generation of usage string?");
+ }
+ }
+}
+
+#include <utility>
+namespace high_level_api_tests {
+ using utility::cli_argument_pack;
+ using utility::internal::array_length;
+
+ static const char * wrong_exception = "wrong exception thrown";
+ static const char * wrong_exception_description = "caught exception has wrong description";
+ void test_parse_basic(){
+ char const* argv[]={"some.exe","1","a"};
+ cli_argument_pack p;
+ int i=0; char a=' ';
+ p.positional_arg(i,"int","").positional_arg(a,"char","");
+ p.parse(array_length(argv),argv);
+ ASSERT(i==1,"");
+ ASSERT(a=='a',"");
+ }
+ //helper function for test of named flag parsing
+ template<typename T, size_t N>
+ bool parse_silent_flag( T(& argv)[N]){
+ cli_argument_pack p;
+ bool silent=false;
+ p.arg(silent,"silent","is extra info needed");
+ p.parse(array_length(argv),argv);
+ return silent;
+ }
+ void test_named_flags_success(){
+ char const* argv[]={"some.exe","silent"};
+ ASSERT(true == parse_silent_flag(argv),"");
+ }
+
+ void test_named_flags_failure(){
+ try {
+ char const* argv[]={"some.exe","1"};
+ parse_silent_flag(argv);
+ ASSERT(false,"exception was expected due to invalid argument, but not caught");
+ }
+ catch(std::invalid_argument& e){
+ ASSERT(e.what()==std::string("unknown parameter starting at:'1'"),wrong_exception_description);
+ }
+ catch(...){ASSERT(false,wrong_exception);}
+ }
+
+ //helper function for test of named flag parsing
+ template<typename T, size_t N>
+ std::pair<bool,int> parse_silent_flag_and_int( T(& argv)[N]){
+ cli_argument_pack p;
+ bool silent=false;
+ int i=125;
+ p
+ .arg(silent,"silent","is extra info needed")
+ .positional_arg(i,"int","");
+ p.parse(array_length(argv),argv);
+ return std::make_pair(silent,i);
+ }
+
+ void test_named_flags_failure_and_other_arg(){
+ char const* argv[]={"some.exe","1"};
+ ASSERT(std::make_pair(false,1) == parse_silent_flag_and_int(argv),"");
+ }
+
+ void test_named_flags_and_other_arg(){
+ char const* argv[]={"some.exe","silent","7"};
+ ASSERT(std::make_pair(true,7) == parse_silent_flag_and_int(argv),"");
+ }
+
+ void test_named_flags_and_other_arg_different_order(){
+ char const* argv[]={"some.exe","7","silent"};
+ ASSERT(std::make_pair(true,7) == parse_silent_flag_and_int(argv),"");
+ }
+
+ void test_flags_only_others_default(){
+ char const* argv[]={"some.exe","silent"};
+ ASSERT(std::make_pair(true,125) == parse_silent_flag_and_int(argv),"");
+ }
+
+ namespace parameters_validation_test_suite{
+ namespace test_validation_function_called_helpers{
+ struct validator{
+ static bool called;
+ static bool accept(const int & ){
+ called = true;
+ return true;
+ }
+ };
+ bool validator::called =false;
+ }
+ void test_validation_function_called(){
+ using test_validation_function_called_helpers::validator;
+
+ char const* argv[]={"some.exe","7"};
+ cli_argument_pack p;
+ int size =0;
+ p.positional_arg(size,"size","",validator::accept);
+ p.parse(array_length(argv),argv);
+ ASSERT((validator::called),"validation function has not been called");
+ }
+ void test_validation_failed(){
+ struct validator{
+ static bool reject(const int &){
+ return false;
+ }
+ };
+ char const* argv[]={"some.exe","7"};
+ cli_argument_pack p;
+ int size =0;
+ p.positional_arg(size,"size","",validator::reject);
+ try {
+ p.parse(array_length(argv),argv);
+ ASSERT((false),"An exception was expected due to failed argument validation, "
+ "but no exception thrown");
+ }
+ catch(std::invalid_argument& e){
+ std::string error_msg("'7' is invalid value for argument 'size'");
+ ASSERT(e.what()==error_msg , wrong_exception_description);
+ }
+ catch(...){ASSERT((false),wrong_exception);}
+ }
+ }
+ namespace error_handling {
+ void test_wrong_input(){
+ char const* argv[]={"some.exe","silent"};
+ cli_argument_pack p;
+ int size =0;
+ p.positional_arg(size,"size","");
+ try{
+ p.parse(array_length(argv),argv);
+ ASSERT(false,"An exception was expected due to wrong input, but no exception thrown");
+ }
+ catch(std::invalid_argument & e){
+ std::string error_msg("'silent' is incorrect input for argument 'size' (error converting string 'silent')");
+ ASSERT(e.what()==error_msg, wrong_exception_description);
+ }
+ catch(...){ASSERT(false,wrong_exception);}
+ }
+ void test_duplicate_arg_names(){
+ cli_argument_pack p;
+ int a=0;
+ p.arg(a,"a","");
+ try{
+ int dup_a=0;
+ p.arg(dup_a,"a","");
+ ASSERT(false, "An exception was expected due adding duplicate parameter name, but not thrown");
+ }
+ catch(std::invalid_argument& e){
+ ASSERT(e.what()==std::string("argument with name: 'a' already registered"),wrong_exception_description);
+ }
+ catch(...){ASSERT(false,wrong_exception);}
+ }
+ void test_duplicate_positional_arg_names(){
+ cli_argument_pack p;
+ int a=0;
+ p.positional_arg(a,"a","");
+ try{
+ int dup_a=0;
+ p.positional_arg(dup_a,"a","");
+ ASSERT(false, "An exception was expected due adding duplicate parameter name, but not thrown");
+ }
+ catch(std::invalid_argument& e){
+ ASSERT(e.what()==std::string("argument with name: 'a' already registered"),wrong_exception_description);
+ }
+ catch(...){ASSERT(false,wrong_exception);}
+ }
+ }
+ namespace usage_string {
+ void test_one_arg(){
+ cli_argument_pack p;
+ int size =9;
+ p.arg(size,"size","size of problem domain");
+ std::string const binary_name = "binary.exe";
+ std::stringstream expected_output;
+ using std::endl;
+ expected_output << " Program usage is:" << endl
+ << " " << binary_name << " [size=value]"
+ << endl << endl
+ << " where:" << endl
+ << " size - size of problem domain (9)" << endl
+ ;
+ std::string usage= p.usage_string(binary_name);
+ ASSERT(usage==expected_output.str(),"");
+ }
+ void test_named_and_postional_args(){
+ cli_argument_pack p;
+ int size =9;
+ int length =8;
+ int stride = 7;
+ p
+ .arg(size,"size","")
+ .positional_arg(length,"length","")
+ .positional_arg(stride,"stride","");
+ std::string const binary_name = "binary.exe";
+ std::stringstream expected_output;
+ using std::endl;
+ expected_output << " Program usage is:" << endl
+ << " " << binary_name << " [size=value] [length=value] [stride=value] [length [stride]]"
+ << endl << endl
+ << " where:" << endl
+ << " size - (9)" << endl
+ << " length - (8)" << endl
+ << " stride - (7)" << endl
+ ;
+ std::string usage= p.usage_string(binary_name);
+ ASSERT(usage==expected_output.str(),"");
+ }
+ void test_bool_flag(){
+ bool flag=false;
+ cli_argument_pack p;
+ p.arg(flag,"flag","");
+ std::string const binary_name = "binary.exe";
+ std::stringstream expected_output;
+ using std::endl;
+ expected_output << " Program usage is:" << endl
+ << " " << binary_name << " [flag]"
+ << endl << endl
+ << " where:" << endl
+ << " flag - (0)" << endl
+ ;
+ std::string usage= p.usage_string(binary_name);
+ ASSERT(usage==expected_output.str(),"");
+
+ }
+
+ }
+ namespace name_positional_syntax {
+ void test_basic(){
+ cli_argument_pack p;
+ int size =0;
+ int time = 0;
+ p
+ .positional_arg(size,"size","")
+ .positional_arg(time,"time","");
+ char const* argv[]={"some.exe","1","2"};
+ p.parse(array_length(argv),argv);
+ ASSERT(size==1,"");
+ ASSERT(time==2,"");
+ }
+ void test_positional_args_explicitly_named(){
+ const char* no_or_wrong_exception_error_msg = "exception was expected but not thrown, or wrong exception caught";
+ //TODO: Similar functionality is used all over the test. Generalize this helper further, and use as wide within the test as possible?
+ struct failed_with_exception{
+ static bool _(cli_argument_pack & p, std::size_t argc, char const* argv[]){
+ try{
+ p.parse(argc,argv);
+ return false;
+ }
+ catch(std::exception &){
+ return true;
+ }
+ catch(...){
+ return false;
+ }
+ }
+ };
+ {
+ cli_argument_pack p;
+ int a,b,c,d;
+ p
+ .positional_arg(a,"a","")
+ .positional_arg(b,"b","")
+ .positional_arg(c,"c","")
+ .positional_arg(d,"d","");
+ char const* argv[]={"some.exe","a=7","0","1","2","4"};
+ ASSERT(failed_with_exception::_(p,array_length(argv),argv),no_or_wrong_exception_error_msg);
+ }
+ {
+ cli_argument_pack p;
+ int a,b,c,d;
+ p
+ .positional_arg(a,"a","")
+ .positional_arg(b,"b","")
+ .positional_arg(c,"c","")
+ .positional_arg(d,"d","");
+ char const* argv[]={"some.exe","a=7","0","1","2"};
+ ASSERT(failed_with_exception::_(p,array_length(argv),argv),no_or_wrong_exception_error_msg);
+ }
+ {
+ cli_argument_pack p;
+ int a=-1,b=-1,c = -1,d=-1;
+ p
+ .positional_arg(a,"a","")
+ .positional_arg(b,"b","")
+ .positional_arg(c,"c","")
+ .positional_arg(d,"d","");
+ char const* argv[]={"some.exe","0","1","d=7",};
+ ASSERT(!failed_with_exception::_(p,array_length(argv),argv),"unexpected exception");
+ ASSERT(a==0,""); ASSERT(b==1,""); ASSERT(c==-1,"");ASSERT(d==7,"");
+ }
+ }
+ }
+ namespace name_value_syntax {
+ void test_basic(){
+ cli_argument_pack p;
+ int size =0;
+ p.arg(size,"size","size of problem domain");
+ char const* argv[]={"some.exe","size=7"};
+ p.parse(array_length(argv),argv);
+ ASSERT(size==7,"");
+ }
+
+ void test_relaxed_order(){
+ cli_argument_pack p;
+ int size =0;
+ int time=0;
+ p
+ .arg(size,"size","")
+ .arg(time,"time","");
+ char const* argv[]={"some.exe","time=1","size=2"};
+ p.parse(array_length(argv),argv);
+ ASSERT(size==2,"");
+ ASSERT(time==1,"");
+ }
+
+ }
+ namespace number_of_argument_value{
+ void test_only_single_values_allowed(){
+ cli_argument_pack p;
+ int a=0;
+ p.arg(a,"a","");
+ const char* argv[] = {"","a=7","a=8"};
+ try {
+ p.parse(array_length(argv),argv);
+ ASSERT(false,"exception was expected due to duplicated values provided in input, but not thrown");
+ }
+ catch(std::invalid_argument& e){
+ //TODO: use patterns (regexp ?) to generate /validate exception descriptions
+ ASSERT(e.what() == std::string("several values specified for: 'a' argument"),wrong_exception_description);
+ }
+ catch(...){ASSERT(false,wrong_exception);}
+ }
+ }
+ namespace thread_range_tests{
+ using utility::thread_number_range;
+ using utility::internal::thread_range_step;
+ using utility::internal::step_function_multiply;
+ using utility::internal::step_function_plus;
+ using utility::internal::step_function_power2_ladder;
+
+ int auto_value(){
+ return 100;
+ }
+ bool operator ==(thread_range_step const& left, utility::internal::thread_range_step const& right){
+ return (left.step_function == right.step_function)
+ && (left.step_function_argument == right.step_function_argument)
+ ;
+ }
+
+ bool operator ==(thread_number_range const& left, thread_number_range const& right){
+ return (left.auto_number_of_threads==right.auto_number_of_threads)
+ && (left.first == right.first)
+ && (left.last == right.last)
+ && (left.step == right.step)
+ ;
+ }
+
+ void constructor_default_values(){
+ thread_number_range r(auto_value);
+ const int default_num_threads = auto_value();
+ ASSERT((r.first==1)&&(r.last==default_num_threads),"");
+ }
+ void validation(){
+ try{
+ thread_number_range range(auto_value,12,6);
+ Harness::suppress_unused_warning(range);
+ ASSERT(false,"exception was expected due to invalid range specified, but not thrown");
+ }
+ catch(std::invalid_argument& e){
+ ASSERT(e.what() == std::string("decreasing sequence not allowed"), wrong_exception_description);
+ }
+ catch(...){ASSERT(false,wrong_exception);}
+ }
+
+ thread_number_range thread_number_range_from_string(std::string const& string_to_parse){
+ thread_number_range r(auto_value,0,0);
+ std::stringstream str(string_to_parse); str>>r;
+ return r;
+ }
+ static const char* thread_range_parse_failed = "error parsing thread range string";
+ void post_process_single_value(){
+ ASSERT(thread_number_range_from_string("auto") ==
+ thread_number_range(auto_value,auto_value(),auto_value())
+ ,thread_range_parse_failed
+ );
+ }
+ void post_process_pair_value(){
+ ASSERT(thread_number_range_from_string("1:auto") ==
+ thread_number_range(auto_value,1,auto_value())
+ ,thread_range_parse_failed
+ );
+
+ ASSERT(thread_number_range_from_string("auto:auto") ==
+ thread_number_range(auto_value,auto_value(),auto_value())
+ ,thread_range_parse_failed
+ );
+ }
+
+ void post_process_troika_value_with_plus_step(){
+ ASSERT(thread_number_range_from_string("1:auto:+2") ==
+ thread_number_range(auto_value,1,auto_value(),thread_range_step(step_function_plus,2))
+ ,thread_range_parse_failed
+ );
+ }
+
+ void post_process_troika_value_with_multiply_step(){
+ ASSERT(thread_number_range_from_string("1:auto:*2.6") ==
+ thread_number_range(auto_value,1,auto_value(),thread_range_step(step_function_multiply,2.6))
+ ,thread_range_parse_failed
+ );
+ }
+
+ void post_process_troika_value_with_ladder_step(){
+ try{
+ thread_number_range range = thread_number_range_from_string("1:16:#3");
+ Harness::suppress_unused_warning(range);
+ ASSERT(false,"exception was expected due to invalid range specified, but not thrown");
+ }
+ catch(std::invalid_argument& e){
+ ASSERT(e.what() == std::string("the argument of # should be a power of 2"), wrong_exception_description);
+ }
+ catch(...){ASSERT(false,wrong_exception);}
+
+ ASSERT(thread_number_range_from_string("1:32:#4") ==
+ thread_number_range(auto_value,1,32,thread_range_step(step_function_power2_ladder,4))
+ ,thread_range_parse_failed
+ );
+ }
+
+ void test_print_content(){
+ std::stringstream str;
+ str<<thread_number_range(auto_value,1,8,thread_range_step(step_function_multiply,2));
+ ASSERT(str.str() == "1:8:*2","Unexpected string");
+ }
+ }
+}
+
+void run_implementation_unit_tests(){
+ using namespace implementation_unit_tests;
+ argument_dest_test_suite::test_type_impl_parse_and_store_simple_parse();
+ argument_dest_test_suite::test_default_value_of_is_matched();
+
+ cli_argument_pack_suite::test_copy_assign();
+}
+void run_high_level_api_tests(){
+ using namespace high_level_api_tests;
+
+ test_parse_basic();
+ test_named_flags_success();
+ test_named_flags_failure();
+ test_named_flags_failure_and_other_arg();
+ test_named_flags_and_other_arg();
+ test_flags_only_others_default();
+ test_named_flags_and_other_arg_different_order();
+
+ usage_string::test_one_arg();
+ usage_string::test_named_and_postional_args();
+ usage_string::test_bool_flag();
+
+ parameters_validation_test_suite::test_validation_function_called();
+ parameters_validation_test_suite::test_validation_failed();
+
+ name_value_syntax::test_basic();
+ name_value_syntax::test_relaxed_order();
+
+ number_of_argument_value::test_only_single_values_allowed();
+
+ name_positional_syntax::test_basic();
+ name_positional_syntax::test_positional_args_explicitly_named();
+
+ error_handling::test_wrong_input();
+ error_handling::test_duplicate_arg_names();
+ error_handling::test_duplicate_positional_arg_names();
+
+ thread_range_tests::constructor_default_values();
+ thread_range_tests::validation();
+ thread_range_tests::post_process_single_value();
+ thread_range_tests::post_process_pair_value();
+ thread_range_tests::post_process_troika_value_with_plus_step();
+ thread_range_tests::post_process_troika_value_with_multiply_step();
+ thread_range_tests::post_process_troika_value_with_ladder_step();
+ thread_range_tests::test_print_content();
+}
+
+#include "harness.h"
+int TestMain(){
+ Harness::suppress_unused_warning(utility::thread_number_range_desc);
+ try{
+ run_implementation_unit_tests();
+ run_high_level_api_tests();
+ }catch(std::exception& e){
+ //something went wrong , dump any possible details
+ std::stringstream str; str<< "run time error: " << e.what()<<std::endl;
+ ASSERT(false,str.str().c_str());
+ }
+ return Harness::Done;
+
+}
diff --git a/src/test/test_fast_random.cpp b/src/test/test_fast_random.cpp
index 6b7d023..ef6e989 100644
--- a/src/test/test_fast_random.cpp
+++ b/src/test/test_fast_random.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -46,7 +46,10 @@ int TestMain () {
#else // HARNESS_USE_PROXY
+#include <algorithm> // include it first to avoid error on define below
+#define private public
#include "harness_inject_scheduler.h"
+#undef private
#define HARNESS_DEFAULT_MIN_THREADS 2
#define HARNESS_DEFAULT_MAX_THREADS 32
@@ -72,19 +75,19 @@ const uintptr_t NumSeeds = 100;
tbb::atomic<uintptr_t> NumHighOutliers;
tbb::atomic<uintptr_t> NumLowOutliers;
-inline void CheckProbability ( double probability, double expectedProbability, int index, int numIndices ) {
+inline void CheckProbability ( double probability, double expectedProbability, int index, int numIndices, void* seed ) {
double lowerBound = expectedProbability / AcceptableDeviation,
upperBound = expectedProbability * AcceptableDeviation;
if ( probability < lowerBound ) {
if ( !NumLowOutliers )
- REMARK( "Warning: Probability %.3f of hitting index %d among %d elements is out of acceptable range (%.3f - %.3f)\n",
- probability, index, numIndices, lowerBound, upperBound );
+ REMARK( "Warning: Probability %.3f of hitting index %d among %d elements is out of acceptable range (%.3f - %.3f) for seed %p\n",
+ probability, index, numIndices, lowerBound, upperBound, seed );
++NumLowOutliers;
}
else if ( probability > upperBound ) {
if ( !NumHighOutliers )
- REMARK( "Warning: Probability %.3f of hitting index %d among %d elements is out of acceptable range (%.3f - %.3f)\n",
- probability, index, numIndices, lowerBound, upperBound );
+ REMARK( "Warning: Probability %.3f of hitting index %d among %d elements is out of acceptable range (%.3f - %.3f) for seed %p\n",
+ probability, index, numIndices, lowerBound, upperBound, seed );
++NumHighOutliers;
}
}
@@ -100,10 +103,15 @@ struct CheckDistributionBody {
double expectedProbability = 1./randomRange;
// Loop through different seeds
for ( uintptr_t i = 0; i < NumSeeds; ++i ) {
- // Seed value is selected in two ways, the first of which mimics
- // the one used by the TBB task scheduler
- void* seed = i % 2 ? (char*)&curHits + i * 16 : (void*)(i * 8);
- tbb::internal::FastRandom random( (unsigned)(uintptr_t)seed );
+ // Seed value mimics the one used by the TBB task scheduler
+ void* seed = (char*)&curHits + i * 16;
+ tbb::internal::FastRandom random( seed );
+ // According to Section 3.2.1.2 of Volume 2 of Knuth�s Art of Computer Programming
+ // the following conditions must be hold for m=2^32:
+ ASSERT((random.c&1)!=0, "c is relatively prime to m");
+ ASSERT((random.a-1)%4==0, "a-1 is a multiple of p, for every prime p dividing m."
+ " And a-1 is a multiple of 4, if m is a multiple of 4");
+
memset( curHits, 0, randomRange * sizeof(uintptr_t) );
#if TEST_TOTAL_SEQUENCE
memset( totalHits, 0, randomRange * sizeof(uintptr_t) );
@@ -123,9 +131,9 @@ struct CheckDistributionBody {
}
while ( randsGenerated < experimentLen ) {
for ( uintptr_t j = 0; j < randomRange; ++j ) {
- CheckProbability( double(curHits[j])/seriesLen, expectedProbability, j, randomRange );
+ CheckProbability( double(curHits[j])/seriesLen, expectedProbability, j, randomRange, seed );
#if TEST_TOTAL_SEQUENCE
- CheckProbability( double(totalHits[j])/randsGenerated, expectedProbability, j, randomRange );
+ CheckProbability( double(totalHits[j])/randsGenerated, expectedProbability, j, randomRange, seed );
#endif
}
--curHits[curSeries[randsGenerated % seriesLen]];
@@ -151,8 +159,6 @@ struct rng {
unsigned short operator()(){return my_fast_random.get();}
};
-#include <algorithm>
-
template <std::size_t seriesLen >
struct SingleCheck{
bool operator()(unsigned seed)const{
@@ -200,8 +206,9 @@ int TestMain () {
CheckReproducibilityBody<reproducibilitySeriesLen,reproducibilitySeedsToTest> CheckReproducibility(reproducibilitySeedsToTest/MaxThread);
while ( MinThread <= MaxThread ) {
int ThreadsToRun = min(P, MaxThread - MinThread + 1);
+ REMARK("Checking random range [%d;%d)\n", MinThread, MinThread+ThreadsToRun);
NativeParallelFor( ThreadsToRun, CheckDistributionBody() );
- NativeParallelFor(ThreadsToRun, CheckReproducibility);
+ NativeParallelFor( ThreadsToRun, CheckReproducibility );
MinThread += P;
}
double observedProbabilityOfOutliers = (NumLowOutliers + NumHighOutliers) / NumChecks;
diff --git a/src/test/test_flow_graph.cpp b/src/test/test_flow_graph.cpp
index 1dd44c0..94be490 100644
--- a/src/test/test_flow_graph.cpp
+++ b/src/test/test_flow_graph.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -215,7 +215,6 @@ void test_parallel(int nThreads) {
}
int TestMain() {
- current_executors = 0;
if( MinThread<1 ) {
REPORT("number of threads must be positive\n");
exit(1);
diff --git a/src/test/test_fp.cpp b/src/test/test_fp.cpp
index ca230a6..ebf87b7 100644
--- a/src/test/test_fp.cpp
+++ b/src/test/test_fp.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,14 +29,20 @@
/** This test checks the automatic propagation of master thread FPU settings
into the worker threads. **/
+#define TBB_PREVIEW_LOCAL_OBSERVER 1
+
#include "harness.h"
#include "tbb/parallel_for.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/tbb_machine.h"
+#if __TBB_SCHEDULER_OBSERVER
+#include "tbb/task_scheduler_observer.h"
+#endif
+
const int N = 500000;
-#if ( __TBB_x86_32 || __TBB_x86_64 ) && __TBB_CPU_CTL_ENV_PRESENT
+#if ( __TBB_x86_32 || __TBB_x86_64 ) && __TBB_CPU_CTL_ENV_PRESENT && !defined(__TBB_WIN32_USE_CL_BUILTINS)
const int FE_TONEAREST = 0x0000,
FE_DOWNWARD = 0x0400,
@@ -51,7 +57,7 @@ const int FE_TONEAREST = 0x0000,
const int NumSseModes = 4;
const int SseModes[NumSseModes] = { 0, SSE_DAZ, SSE_FTZ, SSE_DAZ | SSE_FTZ };
-#if _WIN64 && !__MINGW64__
+#if _WIN64 && !__TBB_X86_MSVC_INLINE_ASM_AVAILABLE && !__MINGW64__
// MinGW uses inline implementation from tbb/machine/linux_intel64.h
#include <float.h>
@@ -66,7 +72,7 @@ inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* fe ) {
_mm_setcsr( fe->mxcsr );
}
-#endif /* _WIN64 */
+#endif /* _WIN64 && !__TBB_X86_MSVC_INLINE_ASM_AVAILABLE && !__MINGW64__ */
inline int GetRoundingMode ( bool checkConsistency = true ) {
__TBB_cpu_ctl_env_t ctl = { 0, 0 };
@@ -97,6 +103,28 @@ inline void SetSseMode ( int mode ) {
}
+#elif defined(_M_ARM) || defined(__TBB_WIN32_USE_CL_BUILTINS)
+const int NumSseModes = 1;
+const int SseModes[NumSseModes] = { 0 };
+
+inline int GetSseMode () { return 0; }
+inline void SetSseMode ( int ) {}
+
+const int FE_TONEAREST = _RC_NEAR,
+ FE_DOWNWARD = _RC_DOWN,
+ FE_UPWARD = _RC_UP,
+ FE_TOWARDZERO = _RC_CHOP;
+
+inline int GetRoundingMode ( bool = true ) {
+ __TBB_cpu_ctl_env_t ctl = 0;
+ __TBB_get_cpu_ctl_env(&ctl);
+ return ctl;
+}
+inline void SetRoundingMode ( int mode ) {
+ __TBB_cpu_ctl_env_t ctl = mode;
+ __TBB_set_cpu_ctl_env(&ctl);
+}
+
#else /* Other archs */
#include <fenv.h>
@@ -144,6 +172,23 @@ public:
{}
};
+#if __TBB_SCHEDULER_OBSERVER
+class LocalObserver : public tbb::task_scheduler_observer {
+ int m_sse, m_rounding;
+ /*override*/
+ void on_scheduler_entry( bool is_worker ) {
+ if(is_worker) {
+ SetSseMode( m_sse );
+ SetRoundingMode( m_rounding );
+ }
+ }
+public:
+ LocalObserver(int fpu, int sse) : tbb::task_scheduler_observer(true), m_sse(sse), m_rounding(fpu) {
+ observe(true);
+ }
+};
+#endif
+
class LauncherBody {
public:
void operator() ( int id ) const {
@@ -179,6 +224,21 @@ public:
ASSERT( GetRoundingMode() == mode, NULL );
}
}
+#if __TBB_SCHEDULER_OBSERVER
+ // but using observers, it is possible to redefine the mode again
+ for( int k = 0; k < NumSseModes; ++k ) {
+ int sse_mode = SseModes[(k + id) % NumSseModes];
+ SetSseMode( sse_mode );
+ for( int i = 0; i < NumRoundingModes; ++i ) {
+ int mode = RoundingModes[(i + id) % NumRoundingModes];
+ SetRoundingMode( mode );
+ // New mode must be set before TBB scheduler is initialized
+ LocalObserver restorer(mode, sse_mode);
+ tbb::parallel_for( 0, N, 1, RoundingModeCheckBody(tid, mode, mode, sse_mode, sse_mode) );
+ ASSERT( GetRoundingMode() == mode, NULL );
+ }
+ }
+#endif
}
};
diff --git a/src/test/test_function_node.cpp b/src/test/test_function_node.cpp
index 33f29e1..0fd0de5 100644
--- a/src/test/test_function_node.cpp
+++ b/src/test/test_function_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,16 +29,14 @@
#include "harness_graph.h"
#include "tbb/task_scheduler_init.h"
-#include "tbb/spin_mutex.h"
-
-tbb::spin_mutex global_mutex;
+#include "tbb/spin_rw_mutex.h"
#define N 100
#define MAX_NODES 4
//! Performs test on function nodes with limited concurrency and buffering
/** Theses tests check:
- 1) that the number of executing copies never exceed the concurreny limit
+ 1) that the number of executing copies never exceed the concurrency limit
2) that the node never rejects
3) that no items are lost
and 4) all of this happens even if there are multiple predecessors and successors
@@ -58,6 +56,11 @@ struct parallel_put_until_limit : private NoAssign {
}
};
+
+template<typename IO>
+struct pass_through {
+ IO operator()(const IO& i) { return i; }
+};
template< typename InputType, typename OutputType, typename Body >
void buffered_levels( size_t concurrency, Body body ) {
@@ -68,15 +71,24 @@ void buffered_levels( size_t concurrency, Body body ) {
// Set the execute_counter back to zero in the harness
harness_graph_executor<InputType, OutputType>::execute_count = 0;
+ // Set the number of current executors to zero.
+ harness_graph_executor<InputType, OutputType>::current_executors = 0;
// Set the max allowed executors to lc. There is a check in the functor to make sure this is never exceeded.
harness_graph_executor<InputType, OutputType>::max_executors = lc;
- // Create the function_node with the appropriate concurreny level, and use default buffering
+ // Create the function_node with the appropriate concurrency level, and use default buffering
tbb::flow::function_node< InputType, OutputType > exe_node( g, lc, body );
+ tbb::flow::function_node<InputType, InputType> pass_thru( g, tbb::flow::unlimited, pass_through<InputType>());
- //Create a vector of identical exe_nodes
+ // Create a vector of identical exe_nodes and pass_thrus
std::vector< tbb::flow::function_node< InputType, OutputType > > exe_vec(2, exe_node);
+ std::vector< tbb::flow::function_node< InputType, InputType > > pass_thru_vec(2, pass_thru);
+ // Attach each pass_thru to its corresponding exe_node
+ for (size_t node_idx=0; node_idx<exe_vec.size(); ++node_idx) {
+ tbb::flow::make_edge(pass_thru_vec[node_idx], exe_vec[node_idx]);
+ }
+ // TODO: why the test is executed serially for the node pairs, not concurrently?
for (size_t node_idx=0; node_idx<exe_vec.size(); ++node_idx) {
// For num_receivers = 1 to MAX_NODES
for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
@@ -89,11 +101,11 @@ void buffered_levels( size_t concurrency, Body body ) {
// Do the test with varying numbers of senders
harness_counting_sender<InputType> *senders = NULL;
for (size_t num_senders = 1; num_senders <= MAX_NODES; ++num_senders ) {
- // Create num_senders senders, set there message limit each to N, and connect them to the exe_vec[node_idx]
+ // Create num_senders senders, set there message limit each to N, and connect them to pass_thru_vec[node_idx]
senders = new harness_counting_sender<InputType>[num_senders];
for (size_t s = 0; s < num_senders; ++s ) {
senders[s].my_limit = N;
- tbb::flow::make_edge( senders[s], exe_vec[node_idx] );
+ tbb::flow::make_edge( senders[s], pass_thru_vec[node_idx] );
}
// Initialize the receivers so they know how many senders and messages to check for
@@ -105,11 +117,11 @@ void buffered_levels( size_t concurrency, Body body ) {
NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
g.wait_for_all();
- // cofirm that each sender was requested from N times
+ // confirm that each sender was requested from N times
for (size_t s = 0; s < num_senders; ++s ) {
size_t n = senders[s].my_received;
ASSERT( n == N, NULL );
- ASSERT( senders[s].my_receiver == &exe_vec[node_idx], NULL );
+ ASSERT( senders[s].my_receiver == &pass_thru_vec[node_idx], NULL );
}
// validate the receivers
for (size_t r = 0; r < num_receivers; ++r ) {
@@ -127,9 +139,9 @@ void buffered_levels( size_t concurrency, Body body ) {
receivers[r].validate();
}
delete [] receivers;
- }
- }
- }
+ } // for num_receivers
+ } // for node_idx
+ } // for concurrency level lc
}
const size_t Offset = 123;
@@ -215,12 +227,11 @@ void buffered_levels_with_copy( size_t concurrency ) {
template< typename InputType, typename OutputType >
void run_buffered_levels( int c ) {
- harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::max_executors = c;
#if __TBB_LAMBDAS_PRESENT
- buffered_levels<InputType,OutputType>( c, []( InputType i ) -> OutputType { return harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::func(i); } );
+ buffered_levels<InputType,OutputType>( c, []( InputType i ) -> OutputType { return harness_graph_executor<InputType, OutputType>::func(i); } );
#endif
- buffered_levels<InputType,OutputType>( c, &harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::func );
- buffered_levels<InputType,OutputType>( c, typename harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::functor() );
+ buffered_levels<InputType,OutputType>( c, &harness_graph_executor<InputType, OutputType>::func );
+ buffered_levels<InputType,OutputType>( c, typename harness_graph_executor<InputType, OutputType>::functor() );
buffered_levels_with_copy<InputType,OutputType>( c );
}
@@ -239,7 +250,13 @@ void concurrency_levels( size_t concurrency, Body body ) {
for ( size_t lc = 1; lc <= concurrency; ++lc ) {
tbb::flow::graph g;
- harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::execute_count = 0;
+
+ // Set the execute_counter back to zero in the harness
+ harness_graph_executor<InputType, OutputType>::execute_count = 0;
+ // Set the number of current executors to zero.
+ harness_graph_executor<InputType, OutputType>::current_executors = 0;
+ // Set the max allowed executors to lc. There is a check in the functor to make sure this is never exceeded.
+ harness_graph_executor<InputType, OutputType>::max_executors = lc;
tbb::flow::function_node< InputType, OutputType, tbb::flow::rejecting > exe_node( g, lc, body );
@@ -254,9 +271,10 @@ void concurrency_levels( size_t concurrency, Body body ) {
harness_counting_sender<InputType> *senders = NULL;
for (size_t num_senders = 1; num_senders <= MAX_NODES; ++num_senders ) {
+ senders = new harness_counting_sender<InputType>[num_senders];
{
- // lock m to prevent exe_node from finishing
- tbb::spin_mutex::scoped_lock l( harness_graph_executor< InputType, OutputType, tbb::spin_mutex >::mutex );
+ // Exclusively lock m to prevent exe_node from finishing
+ tbb::spin_rw_mutex::scoped_lock l( harness_graph_executor<InputType, OutputType>::template mutex_holder<tbb::spin_rw_mutex>::mutex );
// put to lc level, it will accept and then block at m
for ( size_t c = 0 ; c < lc ; ++c ) {
@@ -265,7 +283,6 @@ void concurrency_levels( size_t concurrency, Body body ) {
// it only accepts to lc level
ASSERT( exe_node.try_put( InputType() ) == false, NULL );
- senders = new harness_counting_sender<InputType>[num_senders];
for (size_t s = 0; s < num_senders; ++s ) {
// register a sender
senders[s].my_limit = N;
@@ -276,13 +293,13 @@ void concurrency_levels( size_t concurrency, Body body ) {
// wait for graph to settle down
g.wait_for_all();
- // cofirm that each sender was requested from N times
+ // confirm that each sender was requested from N times
for (size_t s = 0; s < num_senders; ++s ) {
size_t n = senders[s].my_received;
ASSERT( n == N, NULL );
ASSERT( senders[s].my_receiver == &exe_node, NULL );
}
- // cofirm that each receivers got N * num_senders + the initial lc puts
+ // confirm that each receivers got N * num_senders + the initial lc puts
for (size_t r = 0; r < num_receivers; ++r ) {
size_t n = receivers[r].my_count;
ASSERT( n == num_senders*N+lc, NULL );
@@ -306,12 +323,11 @@ void concurrency_levels( size_t concurrency, Body body ) {
template< typename InputType, typename OutputType >
void run_concurrency_levels( int c ) {
- harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::max_executors = c;
#if __TBB_LAMBDAS_PRESENT
- concurrency_levels<InputType,OutputType>( c, []( InputType i ) -> OutputType { return harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::func(i); } );
+ concurrency_levels<InputType,OutputType>( c, []( InputType i ) -> OutputType { return harness_graph_executor<InputType, OutputType>::template tfunc<tbb::spin_rw_mutex>(i); } );
#endif
- concurrency_levels<InputType,OutputType>( c, &harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::func );
- concurrency_levels<InputType,OutputType>( c, typename harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::functor() );
+ concurrency_levels<InputType,OutputType>( c, &harness_graph_executor<InputType, OutputType>::template tfunc<tbb::spin_rw_mutex> );
+ concurrency_levels<InputType,OutputType>( c, typename harness_graph_executor<InputType, OutputType>::template tfunctor<tbb::spin_rw_mutex>() );
}
@@ -424,7 +440,6 @@ void test_concurrency(int num_threads) {
}
int TestMain() {
- current_executors = 0;
if( MinThread<1 ) {
REPORT("number of threads must be positive\n");
exit(1);
diff --git a/src/test/test_halt.cpp b/src/test/test_halt.cpp
index 69fabf5..6b657ea 100644
--- a/src/test/test_halt.cpp
+++ b/src/test/test_halt.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+#include "harness_defs.h"
#include <cstdio>
#include <cstdlib>
#include <cassert>
diff --git a/src/test/test_handle_perror.cpp b/src/test/test_handle_perror.cpp
index 6f86fa5..8859d21 100644
--- a/src/test/test_handle_perror.cpp
+++ b/src/test/test_handle_perror.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -56,11 +56,11 @@ static void TestHandlePerror() {
#if TBB_USE_EXCEPTIONS
REMARK("caught runtime_exception('%s')\n",e.what());
ASSERT( memcmp(e.what(),"apple: ",7)==0, NULL );
- ASSERT( strstr(e.what(),"unavailable")!=NULL, "bad error message?" );
+ ASSERT( strlen(strstr(e.what(), strerror(EAGAIN))), "bad error message?" );
#endif /* TBB_USE_EXCEPTIONS */
caught = true;
}
- ASSERT(caught,NULL);
+ ASSERT( caught, NULL );
}
int TestMain () {
diff --git a/src/test/test_hw_concurrency.cpp b/src/test/test_hw_concurrency.cpp
index 4e971b9..ffbd0b2 100644
--- a/src/test/test_hw_concurrency.cpp
+++ b/src/test/test_hw_concurrency.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,16 @@
the GNU General Public License.
*/
+#include "harness_defs.h"
+
+#if __TBB_TEST_SKIP_AFFINITY
+#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#include "harness.h"
+int TestMain() {
+ return Harness::Skipped;
+}
+#else /* affinity mask can be set and used by TBB */
+
#include "harness.h"
#include <limits.h>
@@ -56,10 +66,9 @@
tbb::enumerable_thread_specific<std::size_t> ets;
int TestMain () {
-#if _WIN32||_WIN64 || __linux__ || __FreeBSD_version >= 701000
#if _WIN32||_WIN64
SYSTEM_INFO si;
- GetSystemInfo(&si);
+ GetNativeSystemInfo(&si);
if ( si.dwNumberOfProcessors < 2 )
return Harness::Skipped;
int availableProcs = (int)si.dwNumberOfProcessors / 2;
@@ -98,7 +107,5 @@ int TestMain () {
ASSERT( tbb::task_scheduler_init::default_num_threads() == availableProcs, NULL );
ASSERT( (int)tbb::tbb_thread::hardware_concurrency() == availableProcs, NULL );
return Harness::Done;
-#else /* !(WIN || LIN || BSD) */
- return Harness::Skipped;
-#endif /* !(WIN || LIN || BSD) */
}
+#endif /* __TBB_TEST_SKIP_AFFINITY */
diff --git a/src/test/test_inits_loop.cpp b/src/test/test_inits_loop.cpp
index c5a46c9..4f5c96c 100644
--- a/src/test/test_inits_loop.cpp
+++ b/src/test/test_inits_loop.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_intrusive_list.cpp b/src/test/test_intrusive_list.cpp
index 8c48fc5..9ca1db3 100644
--- a/src/test/test_intrusive_list.cpp
+++ b/src/test/test_intrusive_list.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_ittnotify.cpp b/src/test/test_ittnotify.cpp
index 79f4ae8..93e3c29 100644
--- a/src/test/test_ittnotify.cpp
+++ b/src/test/test_ittnotify.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -69,7 +69,7 @@ volatile size_t WorkEmulator<M>::s_anchor = 0;
template<class M>
void Test( const char * name ) {
- REMARK("%s time = ",name);
+ REMARK("Testing %s\n",name);
M mtx;
tbb::profiling::set_name(mtx, name);
diff --git a/src/test/test_join_node.cpp b/src/test/test_join_node.cpp
index 8d1c7e2..3a96341 100644
--- a/src/test/test_join_node.cpp
+++ b/src/test/test_join_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,25 +26,11 @@
the GNU General Public License.
*/
-#if _MSC_VER
-// Name length is limited to avoid "decorated name length exceeded, name was truncated" warning.
-#define _VARIADIC_MAX 8
-#endif
-
#include "harness.h"
-#if !__SUNPRO_CC
-
#include "tbb/flow_graph.h"
#include "tbb/task_scheduler_init.h"
-// the tuple-based tests with more inputs take a long time to compile. If changes
-// are made to the tuple implementation or any switch that controls it, the test
-// should be compiled with COMPREHENSIVE_TEST == 1 to ensure all tuple sizes are tested.
-#ifndef COMPREHENSIVE_TEST
-#define COMPREHENSIVE_TEST 0
-#endif
-
//
// Tests
//
@@ -112,12 +98,12 @@ template<typename TT>
class recirc_func_body {
TT my_mult;
public:
- typedef std::tuple<int, tbb::flow::continue_msg> input_type;
+ typedef tbb::flow::tuple<int, tbb::flow::continue_msg> input_type;
recirc_func_body(TT multiplier ) : my_mult(multiplier) {}
recirc_func_body(const recirc_func_body &other) : my_mult(other.my_mult) { }
void operator=( const recirc_func_body &other) { my_mult = other.my_mult; }
TT operator()(const input_type &v) {
- return TT(std::get<0>(v)) * my_mult;
+ return TT(tbb::flow::get<0>(v)) * my_mult;
}
};
@@ -186,8 +172,8 @@ public:
template<typename JType>
class makeJoin<2,JType,tbb::flow::tag_matching> {
typedef typename JType::output_type TType;
- typedef typename std::tuple_element<0, TType>::type T0;
- typedef typename std::tuple_element<1, TType>::type T1;
+ typedef typename tbb::flow::tuple_element<0, TType>::type T0;
+ typedef typename tbb::flow::tuple_element<1, TType>::type T1;
public:
static JType *create(tbb::flow::graph& g) {
JType *temp = new JType(g,
@@ -199,12 +185,13 @@ public:
static void destroy(JType *p) { delete p; }
};
+#if MAX_TUPLE_TEST_SIZE >= 3
template<typename JType>
class makeJoin<3,JType,tbb::flow::tag_matching> {
typedef typename JType::output_type TType;
- typedef typename std::tuple_element<0, TType>::type T0;
- typedef typename std::tuple_element<1, TType>::type T1;
- typedef typename std::tuple_element<2, TType>::type T2;
+ typedef typename tbb::flow::tuple_element<0, TType>::type T0;
+ typedef typename tbb::flow::tuple_element<1, TType>::type T1;
+ typedef typename tbb::flow::tuple_element<2, TType>::type T2;
public:
static JType *create(tbb::flow::graph& g) {
JType *temp = new JType(g,
@@ -216,14 +203,15 @@ public:
}
static void destroy(JType *p) { delete p; }
};
-
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 4
template<typename JType>
class makeJoin<4,JType,tbb::flow::tag_matching> {
typedef typename JType::output_type TType;
- typedef typename std::tuple_element<0, TType>::type T0;
- typedef typename std::tuple_element<1, TType>::type T1;
- typedef typename std::tuple_element<2, TType>::type T2;
- typedef typename std::tuple_element<3, TType>::type T3;
+ typedef typename tbb::flow::tuple_element<0, TType>::type T0;
+ typedef typename tbb::flow::tuple_element<1, TType>::type T1;
+ typedef typename tbb::flow::tuple_element<2, TType>::type T2;
+ typedef typename tbb::flow::tuple_element<3, TType>::type T3;
public:
static JType *create(tbb::flow::graph& g) {
JType *temp = new JType(g,
@@ -236,15 +224,16 @@ public:
}
static void destroy(JType *p) { delete p; }
};
-
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 5
template<typename JType>
class makeJoin<5,JType,tbb::flow::tag_matching> {
typedef typename JType::output_type TType;
- typedef typename std::tuple_element<0, TType>::type T0;
- typedef typename std::tuple_element<1, TType>::type T1;
- typedef typename std::tuple_element<2, TType>::type T2;
- typedef typename std::tuple_element<3, TType>::type T3;
- typedef typename std::tuple_element<4, TType>::type T4;
+ typedef typename tbb::flow::tuple_element<0, TType>::type T0;
+ typedef typename tbb::flow::tuple_element<1, TType>::type T1;
+ typedef typename tbb::flow::tuple_element<2, TType>::type T2;
+ typedef typename tbb::flow::tuple_element<3, TType>::type T3;
+ typedef typename tbb::flow::tuple_element<4, TType>::type T4;
public:
static JType *create(tbb::flow::graph& g) {
JType *temp = new JType(g,
@@ -258,16 +247,17 @@ public:
}
static void destroy(JType *p) { delete p; }
};
-#if __TBB_VARIADIC_MAX >= 6
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 6
template<typename JType>
class makeJoin<6,JType,tbb::flow::tag_matching> {
typedef typename JType::output_type TType;
- typedef typename std::tuple_element<0, TType>::type T0;
- typedef typename std::tuple_element<1, TType>::type T1;
- typedef typename std::tuple_element<2, TType>::type T2;
- typedef typename std::tuple_element<3, TType>::type T3;
- typedef typename std::tuple_element<4, TType>::type T4;
- typedef typename std::tuple_element<5, TType>::type T5;
+ typedef typename tbb::flow::tuple_element<0, TType>::type T0;
+ typedef typename tbb::flow::tuple_element<1, TType>::type T1;
+ typedef typename tbb::flow::tuple_element<2, TType>::type T2;
+ typedef typename tbb::flow::tuple_element<3, TType>::type T3;
+ typedef typename tbb::flow::tuple_element<4, TType>::type T4;
+ typedef typename tbb::flow::tuple_element<5, TType>::type T5;
public:
static JType *create(tbb::flow::graph& g) {
JType *temp = new JType(g,
@@ -284,17 +274,17 @@ public:
};
#endif
-#if __TBB_VARIADIC_MAX >= 7
+#if MAX_TUPLE_TEST_SIZE >= 7
template<typename JType>
class makeJoin<7,JType,tbb::flow::tag_matching> {
typedef typename JType::output_type TType;
- typedef typename std::tuple_element<0, TType>::type T0;
- typedef typename std::tuple_element<1, TType>::type T1;
- typedef typename std::tuple_element<2, TType>::type T2;
- typedef typename std::tuple_element<3, TType>::type T3;
- typedef typename std::tuple_element<4, TType>::type T4;
- typedef typename std::tuple_element<5, TType>::type T5;
- typedef typename std::tuple_element<6, TType>::type T6;
+ typedef typename tbb::flow::tuple_element<0, TType>::type T0;
+ typedef typename tbb::flow::tuple_element<1, TType>::type T1;
+ typedef typename tbb::flow::tuple_element<2, TType>::type T2;
+ typedef typename tbb::flow::tuple_element<3, TType>::type T3;
+ typedef typename tbb::flow::tuple_element<4, TType>::type T4;
+ typedef typename tbb::flow::tuple_element<5, TType>::type T5;
+ typedef typename tbb::flow::tuple_element<6, TType>::type T6;
public:
static JType *create(tbb::flow::graph& g) {
JType *temp = new JType(g,
@@ -312,18 +302,18 @@ public:
};
#endif
-#if __TBB_VARIADIC_MAX >= 8
+#if MAX_TUPLE_TEST_SIZE >= 8
template<typename JType>
class makeJoin<8,JType,tbb::flow::tag_matching> {
typedef typename JType::output_type TType;
- typedef typename std::tuple_element<0, TType>::type T0;
- typedef typename std::tuple_element<1, TType>::type T1;
- typedef typename std::tuple_element<2, TType>::type T2;
- typedef typename std::tuple_element<3, TType>::type T3;
- typedef typename std::tuple_element<4, TType>::type T4;
- typedef typename std::tuple_element<5, TType>::type T5;
- typedef typename std::tuple_element<6, TType>::type T6;
- typedef typename std::tuple_element<7, TType>::type T7;
+ typedef typename tbb::flow::tuple_element<0, TType>::type T0;
+ typedef typename tbb::flow::tuple_element<1, TType>::type T1;
+ typedef typename tbb::flow::tuple_element<2, TType>::type T2;
+ typedef typename tbb::flow::tuple_element<3, TType>::type T3;
+ typedef typename tbb::flow::tuple_element<4, TType>::type T4;
+ typedef typename tbb::flow::tuple_element<5, TType>::type T5;
+ typedef typename tbb::flow::tuple_element<6, TType>::type T6;
+ typedef typename tbb::flow::tuple_element<7, TType>::type T7;
public:
static JType *create(tbb::flow::graph& g) {
JType *temp = new JType(g,
@@ -342,19 +332,19 @@ public:
};
#endif
-#if __TBB_VARIADIC_MAX >= 9
+#if MAX_TUPLE_TEST_SIZE >= 9
template<typename JType>
class makeJoin<9,JType,tbb::flow::tag_matching> {
typedef typename JType::output_type TType;
- typedef typename std::tuple_element<0, TType>::type T0;
- typedef typename std::tuple_element<1, TType>::type T1;
- typedef typename std::tuple_element<2, TType>::type T2;
- typedef typename std::tuple_element<3, TType>::type T3;
- typedef typename std::tuple_element<4, TType>::type T4;
- typedef typename std::tuple_element<5, TType>::type T5;
- typedef typename std::tuple_element<6, TType>::type T6;
- typedef typename std::tuple_element<7, TType>::type T7;
- typedef typename std::tuple_element<8, TType>::type T8;
+ typedef typename tbb::flow::tuple_element<0, TType>::type T0;
+ typedef typename tbb::flow::tuple_element<1, TType>::type T1;
+ typedef typename tbb::flow::tuple_element<2, TType>::type T2;
+ typedef typename tbb::flow::tuple_element<3, TType>::type T3;
+ typedef typename tbb::flow::tuple_element<4, TType>::type T4;
+ typedef typename tbb::flow::tuple_element<5, TType>::type T5;
+ typedef typename tbb::flow::tuple_element<6, TType>::type T6;
+ typedef typename tbb::flow::tuple_element<7, TType>::type T7;
+ typedef typename tbb::flow::tuple_element<8, TType>::type T8;
public:
static JType *create(tbb::flow::graph& g) {
JType *temp = new JType(g,
@@ -374,20 +364,20 @@ public:
};
#endif
-#if __TBB_VARIADIC_MAX >= 10
+#if MAX_TUPLE_TEST_SIZE >= 10
template<typename JType>
class makeJoin<10,JType,tbb::flow::tag_matching> {
typedef typename JType::output_type TType;
- typedef typename std::tuple_element<0, TType>::type T0;
- typedef typename std::tuple_element<1, TType>::type T1;
- typedef typename std::tuple_element<2, TType>::type T2;
- typedef typename std::tuple_element<3, TType>::type T3;
- typedef typename std::tuple_element<4, TType>::type T4;
- typedef typename std::tuple_element<5, TType>::type T5;
- typedef typename std::tuple_element<6, TType>::type T6;
- typedef typename std::tuple_element<7, TType>::type T7;
- typedef typename std::tuple_element<8, TType>::type T8;
- typedef typename std::tuple_element<9, TType>::type T9;
+ typedef typename tbb::flow::tuple_element<0, TType>::type T0;
+ typedef typename tbb::flow::tuple_element<1, TType>::type T1;
+ typedef typename tbb::flow::tuple_element<2, TType>::type T2;
+ typedef typename tbb::flow::tuple_element<3, TType>::type T3;
+ typedef typename tbb::flow::tuple_element<4, TType>::type T4;
+ typedef typename tbb::flow::tuple_element<5, TType>::type T5;
+ typedef typename tbb::flow::tuple_element<6, TType>::type T6;
+ typedef typename tbb::flow::tuple_element<7, TType>::type T7;
+ typedef typename tbb::flow::tuple_element<8, TType>::type T8;
+ typedef typename tbb::flow::tuple_element<9, TType>::type T9;
public:
static JType *create(tbb::flow::graph& g) {
JType *temp = new JType(g,
@@ -416,11 +406,11 @@ template<int ELEM, typename JNT>
class source_node_helper {
public:
typedef JNT join_node_type;
- typedef tbb::flow::join_node<std::tuple<int, tbb::flow::continue_msg>, tbb::flow::reserving> input_join_type;
+ typedef tbb::flow::join_node<tbb::flow::tuple<int, tbb::flow::continue_msg>, tbb::flow::reserving> input_join_type;
typedef typename join_node_type::output_type TT;
- typedef typename std::tuple_element<ELEM-1,TT>::type IT;
+ typedef typename tbb::flow::tuple_element<ELEM-1,TT>::type IT;
typedef typename tbb::flow::source_node<IT> my_source_node_type;
- typedef typename tbb::flow::function_node<std::tuple<int,tbb::flow::continue_msg>, IT> my_recirc_function_type;
+ typedef typename tbb::flow::function_node<tbb::flow::tuple<int,tbb::flow::continue_msg>, IT> my_recirc_function_type;
static void print_remark(const char * str) {
source_node_helper<ELEM-1,JNT>::print_remark(str);
REMARK(", %s", name_of<IT>::name());
@@ -444,15 +434,15 @@ public:
}
static void only_check_value(const int i, const TT &v) {
- ASSERT( std::get<ELEM-1>(v) == (IT)(i*(ELEM+1)), NULL);
+ ASSERT( tbb::flow::get<ELEM-1>(v) == (IT)(i*(ELEM+1)), NULL);
source_node_helper<ELEM-1,JNT>::only_check_value(i, v);
}
static void check_value(int i, TT &v, bool is_serial) {
// the fetched value will match only if there is only one source_node.
- ASSERT(!is_serial || std::get<ELEM-1>(v) == (IT)(i*(ELEM+1)), NULL);
+ ASSERT(!is_serial || tbb::flow::get<ELEM-1>(v) == (IT)(i*(ELEM+1)), NULL);
// tally the fetched value.
- int ival = (int)std::get<ELEM-1>(v);
+ int ival = (int)tbb::flow::get<ELEM-1>(v);
ASSERT(!(ival%(ELEM+1)), NULL);
ival /= (ELEM+1);
ASSERT(!outputCheck[ELEM-1][ival], NULL);
@@ -480,11 +470,11 @@ public:
template<typename JNT>
class source_node_helper<1, JNT> {
typedef JNT join_node_type;
- typedef tbb::flow::join_node<std::tuple<int, tbb::flow::continue_msg>, tbb::flow::reserving> input_join_type;
+ typedef tbb::flow::join_node<tbb::flow::tuple<int, tbb::flow::continue_msg>, tbb::flow::reserving> input_join_type;
typedef typename join_node_type::output_type TT;
- typedef typename std::tuple_element<0,TT>::type IT;
+ typedef typename tbb::flow::tuple_element<0,TT>::type IT;
typedef typename tbb::flow::source_node<IT> my_source_node_type;
- typedef typename tbb::flow::function_node<std::tuple<int,tbb::flow::continue_msg>, IT> my_recirc_function_type;
+ typedef typename tbb::flow::function_node<tbb::flow::tuple<int,tbb::flow::continue_msg>, IT> my_recirc_function_type;
public:
static void print_remark(const char * str) {
REMARK("%s< %s", str, name_of<IT>::name());
@@ -505,12 +495,12 @@ public:
}
static void only_check_value(const int i, const TT &v) {
- ASSERT( std::get<0>(v) == (IT)(i*2), NULL);
+ ASSERT( tbb::flow::get<0>(v) == (IT)(i*2), NULL);
}
static void check_value(int i, TT &v, bool is_serial) {
- ASSERT(!is_serial || std::get<0>(v) == (IT)(i*(2)), NULL);
- int ival = (int)std::get<0>(v);
+ ASSERT(!is_serial || tbb::flow::get<0>(v) == (IT)(i*(2)), NULL);
+ int ival = (int)tbb::flow::get<0>(v);
ASSERT(!(ival%2), NULL);
ival /= 2;
ASSERT(!outputCheck[0][ival], NULL);
@@ -539,9 +529,9 @@ class recirc_output_func_body {
public:
// we only need this to use source_node_helper
typedef typename tbb::flow::join_node<OutputTupleType, tbb::flow::tag_matching> join_node_type;
- static const int N = std::tuple_size<OutputTupleType>::value;
+ static const int N = tbb::flow::tuple_size<OutputTupleType>::value;
int operator()(const OutputTupleType &v) {
- int out = int(std::get<0>(v)) / 2;
+ int out = int(tbb::flow::get<0>(v)) / 2;
source_node_helper<N,join_node_type>::only_check_value(out,v);
++output_count;
return out;
@@ -552,9 +542,9 @@ template<typename JType>
class tag_recirculation_test {
public:
typedef typename JType::output_type TType;
- typedef typename std::tuple<int, tbb::flow::continue_msg> input_tuple_type;
+ typedef typename tbb::flow::tuple<int, tbb::flow::continue_msg> input_tuple_type;
typedef tbb::flow::join_node<input_tuple_type,tbb::flow::reserving> input_join_type;
- static const int N = std::tuple_size<TType>::value;
+ static const int N = tbb::flow::tuple_size<TType>::value;
static void test() {
source_node_helper<N,JType>::print_remark("Recirculation test of tag-matching join");
REMARK(" >\n");
@@ -569,7 +559,7 @@ public:
// reserving join that matches recirculating tags with continue messages.
input_join_type * my_input_join = makeJoin<2,input_join_type,tbb::flow::reserving>::create(g);
// tbb::flow::make_edge(snode, tbb::flow::input_port<1>(*my_input_join));
- tbb::flow::make_edge(snode, std::get<1>(my_input_join->input_ports()));
+ tbb::flow::make_edge(snode, tbb::flow::get<1>(my_input_join->input_ports()));
// queue to hold the tags
tbb::flow::queue_node<int> tag_queue(g);
tbb::flow::make_edge(tag_queue, tbb::flow::input_port<0>(*my_input_join));
@@ -620,11 +610,11 @@ template<typename JType, tbb::flow::graph_buffer_policy JP>
class parallel_test {
public:
typedef typename JType::output_type TType;
- static const int SIZE = std::tuple_size<TType>::value;
+ static const int TUPLE_SIZE = tbb::flow::tuple_size<TType>::value;
static const tbb::flow::graph_buffer_policy jp = JP;
static void test() {
TType v;
- source_node_helper<SIZE,JType>::print_remark("Parallel test of join_node");
+ source_node_helper<TUPLE_SIZE,JType>::print_remark("Parallel test of join_node");
REMARK(" >\n");
for(int i=0; i < MaxPorts; ++i) {
for(int j=0; j < MaxNSources; ++j) {
@@ -635,39 +625,39 @@ public:
tbb::flow::graph g;
// JType my_join(g);
bool not_out_of_order = (nInputs == 1) && (jp != tbb::flow::tag_matching);
- JType* my_join = makeJoin<SIZE,JType,JP>::create(g);
+ JType* my_join = makeJoin<TUPLE_SIZE,JType,JP>::create(g);
tbb::flow::queue_node<TType> outq1(g);
tbb::flow::queue_node<TType> outq2(g);
tbb::flow::make_edge( *my_join, outq1 );
tbb::flow::make_edge( *my_join, outq2 );
- source_node_helper<SIZE, JType>::add_source_nodes((*my_join), g, nInputs);
+ source_node_helper<TUPLE_SIZE, JType>::add_source_nodes((*my_join), g, nInputs);
g.wait_for_all();
- reset_outputCheck(SIZE, Count);
+ reset_outputCheck(TUPLE_SIZE, Count);
for(int i=0; i < Count; ++i) {
ASSERT(outq1.try_get(v), NULL);
- source_node_helper<SIZE, JType>::check_value(i, v, not_out_of_order);
+ source_node_helper<TUPLE_SIZE, JType>::check_value(i, v, not_out_of_order);
}
- check_outputCheck(SIZE, Count);
- reset_outputCheck(SIZE, Count);
+ check_outputCheck(TUPLE_SIZE, Count);
+ reset_outputCheck(TUPLE_SIZE, Count);
for(int i=0; i < Count; i++) {
ASSERT(outq2.try_get(v), NULL);;
- source_node_helper<SIZE, JType>::check_value(i, v, not_out_of_order);
+ source_node_helper<TUPLE_SIZE, JType>::check_value(i, v, not_out_of_order);
}
- check_outputCheck(SIZE, Count);
+ check_outputCheck(TUPLE_SIZE, Count);
ASSERT(!outq1.try_get(v), NULL);
ASSERT(!outq2.try_get(v), NULL);
- source_node_helper<SIZE, JType>::remove_source_nodes((*my_join), nInputs);
+ source_node_helper<TUPLE_SIZE, JType>::remove_source_nodes((*my_join), nInputs);
tbb::flow::remove_edge( *my_join, outq1 );
tbb::flow::remove_edge( *my_join, outq2 );
- makeJoin<SIZE,JType,JP>::destroy(my_join);
+ makeJoin<TUPLE_SIZE,JType,JP>::destroy(my_join);
}
}
};
@@ -677,7 +667,7 @@ template<int ELEM, typename JType>
class serial_queue_helper {
public:
typedef typename JType::output_type TT;
- typedef typename std::tuple_element<ELEM-1,TT>::type IT;
+ typedef typename tbb::flow::tuple_element<ELEM-1,TT>::type IT;
typedef typename tbb::flow::queue_node<IT> my_queue_node_type;
static void print_remark() {
serial_queue_helper<ELEM-1,JType>::print_remark();
@@ -686,7 +676,7 @@ public:
static void add_queue_nodes(tbb::flow::graph &g, JType &my_join) {
serial_queue_helper<ELEM-1,JType>::add_queue_nodes(g, my_join);
my_queue_node_type *new_node = new my_queue_node_type(g);
- tbb::flow::make_edge( *new_node, std::get<ELEM-1>(my_join.input_ports()) );
+ tbb::flow::make_edge( *new_node, tbb::flow::get<ELEM-1>(my_join.input_ports()) );
all_source_nodes[ELEM-1][0] = (void *)new_node;
}
static void fill_one_queue(int maxVal) {
@@ -705,11 +695,11 @@ public:
}
static void check_queue_value(int i, TT &v) {
serial_queue_helper<ELEM-1,JType>::check_queue_value(i, v);
- ASSERT( std::get<ELEM-1>(v) == (IT)(i * (ELEM+1)), NULL);
+ ASSERT( tbb::flow::get<ELEM-1>(v) == (IT)(i * (ELEM+1)), NULL);
}
static void remove_queue_nodes(JType &my_join) {
my_queue_node_type *vptr = reinterpret_cast<my_queue_node_type *>(all_source_nodes[ELEM-1][0]);
- tbb::flow::remove_edge( *vptr, std::get<ELEM-1>(my_join.input_ports()) );
+ tbb::flow::remove_edge( *vptr, tbb::flow::get<ELEM-1>(my_join.input_ports()) );
serial_queue_helper<ELEM-1, JType>::remove_queue_nodes(my_join);
delete vptr;
}
@@ -719,7 +709,7 @@ template<typename JType>
class serial_queue_helper<1, JType> {
public:
typedef typename JType::output_type TT;
- typedef typename std::tuple_element<0,TT>::type IT;
+ typedef typename tbb::flow::tuple_element<0,TT>::type IT;
typedef typename tbb::flow::queue_node<IT> my_queue_node_type;
static void print_remark() {
REMARK("Serial test of join_node< %s", name_of<IT>::name());
@@ -740,11 +730,11 @@ public:
ASSERT(qptr->try_put((IT)(myVal*2)), NULL);
}
static void check_queue_value(int i, TT &v) {
- ASSERT( std::get<0>(v) == (IT)(i*2), NULL);
+ ASSERT( tbb::flow::get<0>(v) == (IT)(i*2), NULL);
}
static void remove_queue_nodes(JType &my_join) {
my_queue_node_type *vptr = reinterpret_cast<my_queue_node_type *>(all_source_nodes[0][0]);
- tbb::flow::remove_edge( *vptr, std::get<0>(my_join.input_ports()) );
+ tbb::flow::remove_edge( *vptr, tbb::flow::get<0>(my_join.input_ports()) );
delete vptr;
}
};
@@ -757,9 +747,9 @@ public:
template<typename JType, tbb::flow::graph_buffer_policy JP>
void test_one_serial( JType &my_join, tbb::flow::graph &g) {
typedef typename JType::output_type TType;
- static const int SIZE = std::tuple_size<TType>::value;
+ static const int TUPLE_SIZE = tbb::flow::tuple_size<TType>::value;
std::vector<bool> flags;
- serial_queue_helper<SIZE, JType>::add_queue_nodes(g,my_join);
+ serial_queue_helper<TUPLE_SIZE, JType>::add_queue_nodes(g,my_join);
typedef TType q3_input_type;
tbb::flow::queue_node< q3_input_type > q3(g);
@@ -768,7 +758,7 @@ void test_one_serial( JType &my_join, tbb::flow::graph &g) {
// fill each queue with its value one-at-a-time
flags.clear();
for (int i = 0; i < Count; ++i ) {
- serial_queue_helper<SIZE,JType>::put_one_queue_val(i);
+ serial_queue_helper<TUPLE_SIZE,JType>::put_one_queue_val(i);
flags.push_back(false);
}
@@ -780,12 +770,12 @@ void test_one_serial( JType &my_join, tbb::flow::graph &g) {
ASSERT(q3.try_get( v ), "Error in try_get()");
if(jp == tbb::flow::tag_matching) {
// because we look up tags in the hash table, the output may be out of order.
- int j = int(std::get<0>(v)) / 2; // figure what the index should be
- serial_queue_helper<SIZE,JType>::check_queue_value(j, v);
+ int j = int(tbb::flow::get<0>(v)) / 2; // figure what the index should be
+ serial_queue_helper<TUPLE_SIZE,JType>::check_queue_value(j, v);
flags[j] = true;
}
else {
- serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+ serial_queue_helper<TUPLE_SIZE,JType>::check_queue_value(i, v);
}
}
@@ -797,7 +787,7 @@ void test_one_serial( JType &my_join, tbb::flow::graph &g) {
}
// fill each queue completely before filling the next.
- serial_queue_helper<SIZE, JType>::fill_one_queue(Count);
+ serial_queue_helper<TUPLE_SIZE, JType>::fill_one_queue(Count);
g.wait_for_all();
for (int i = 0; i < Count; ++i ) {
@@ -805,12 +795,12 @@ void test_one_serial( JType &my_join, tbb::flow::graph &g) {
g.wait_for_all();
ASSERT(q3.try_get( v ), "Error in try_get()");
if(jp == tbb::flow::tag_matching) {
- int j = int(std::get<0>(v)) / 2;
- serial_queue_helper<SIZE,JType>::check_queue_value(j, v);
+ int j = int(tbb::flow::get<0>(v)) / 2;
+ serial_queue_helper<TUPLE_SIZE,JType>::check_queue_value(j, v);
flags[i] = true;
}
else {
- serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+ serial_queue_helper<TUPLE_SIZE,JType>::check_queue_value(i, v);
}
}
@@ -820,28 +810,28 @@ void test_one_serial( JType &my_join, tbb::flow::graph &g) {
}
}
- serial_queue_helper<SIZE, JType>::remove_queue_nodes(my_join);
+ serial_queue_helper<TUPLE_SIZE, JType>::remove_queue_nodes(my_join);
}
template<typename JType, tbb::flow::graph_buffer_policy JP>
class serial_test {
typedef typename JType::output_type TType;
- static const int SIZE = std::tuple_size<TType>::value;
+ static const int TUPLE_SIZE = tbb::flow::tuple_size<TType>::value;
static const int ELEMS = 3;
public:
static void test() {
tbb::flow::graph g;
std::vector<bool> flags;
flags.reserve(Count);
- JType* my_join = makeJoin<SIZE,JType,JP>::create(g);
- serial_queue_helper<SIZE, JType>::print_remark(); REMARK(" >\n");
+ JType* my_join = makeJoin<TUPLE_SIZE,JType,JP>::create(g);
+ serial_queue_helper<TUPLE_SIZE, JType>::print_remark(); REMARK(" >\n");
test_one_serial<JType,JP>( *my_join, g);
// build the vector with copy construction from the used join node.
std::vector<JType>join_vector(ELEMS, *my_join);
// destroy the tired old join_node in case we're accidentally reusing pieces of it.
- makeJoin<SIZE,JType,JP>::destroy(my_join);
+ makeJoin<TUPLE_SIZE,JType,JP>::destroy(my_join);
for(int e = 0; e < ELEMS; ++e) { // exercise each of the vector elements
@@ -893,7 +883,7 @@ void test_input_port_policies();
template<>
void test_input_port_policies<tbb::flow::reserving>() {
tbb::flow::graph g;
- typedef tbb::flow::join_node<std::tuple<int, int>, tbb::flow::reserving > JType; // two-phase is the default policy
+ typedef tbb::flow::join_node<tbb::flow::tuple<int, int>, tbb::flow::reserving > JType; // two-phase is the default policy
// create join_node<type0,type1> jn
JType jn(g);
// create output_queue oq0, oq1
@@ -912,8 +902,8 @@ void test_input_port_policies<tbb::flow::reserving>() {
tbb::flow::make_edge( jn, oq0 );
tbb::flow::make_edge( jn, oq1 );
// attach iq0, iq1 to jn
- tbb::flow::make_edge( iq0, std::get<0>(jn.input_ports()) );
- tbb::flow::make_edge( iq1, std::get<1>(jn.input_ports()) );
+ tbb::flow::make_edge( iq0, tbb::flow::get<0>(jn.input_ports()) );
+ tbb::flow::make_edge( iq1, tbb::flow::get<1>(jn.input_ports()) );
for(int loop = 0; loop < 3; ++loop) {
// place one item in iq0
ASSERT(iq0.try_put(1), "Error putting to iq1");
@@ -942,8 +932,8 @@ void test_input_port_policies<tbb::flow::reserving>() {
{
OQType t0;
OQType t1;
- ASSERT(oq0.try_get(t0) && std::get<0>(t0) == 3 && std::get<1>(t0) == 2, "Error in oq0 output");
- ASSERT(oq1.try_get(t1) && std::get<0>(t1) == 3 && std::get<1>(t1) == 2, "Error in oq1 output");
+ ASSERT(oq0.try_get(t0) && tbb::flow::get<0>(t0) == 3 && tbb::flow::get<1>(t0) == 2, "Error in oq0 output");
+ ASSERT(oq1.try_get(t1) && tbb::flow::get<0>(t1) == 3 && tbb::flow::get<1>(t1) == 2, "Error in oq1 output");
}
// attach qnp to iq0, qnq to iq1
// qnp and qnq should be empty
@@ -976,7 +966,7 @@ void test_input_port_policies<tbb::flow::reserving>() {
template<>
void test_input_port_policies<tbb::flow::queueing>() {
tbb::flow::graph g;
- typedef tbb::flow::join_node<std::tuple<int, int>, tbb::flow::queueing > JType;
+ typedef tbb::flow::join_node<tbb::flow::tuple<int, int>, tbb::flow::queueing > JType;
// create join_node<type0,type1> jn
JType jn(g);
// create output_queue oq0, oq1
@@ -995,8 +985,8 @@ void test_input_port_policies<tbb::flow::queueing>() {
tbb::flow::make_edge( jn, oq0 );
tbb::flow::make_edge( jn, oq1 );
// attach iq0, iq1 to jn
- tbb::flow::make_edge( iq0, std::get<0>(jn.input_ports()) );
- tbb::flow::make_edge( iq1, std::get<1>(jn.input_ports()) );
+ tbb::flow::make_edge( iq0, tbb::flow::get<0>(jn.input_ports()) );
+ tbb::flow::make_edge( iq1, tbb::flow::get<1>(jn.input_ports()) );
for(int loop = 0; loop < 3; ++loop) {
// place one item in iq0
ASSERT(iq0.try_put(1), "Error putting to iq1");
@@ -1015,8 +1005,8 @@ void test_input_port_policies<tbb::flow::queueing>() {
{
OQType t0;
OQType t1;
- ASSERT(oq0.try_get(t0) && std::get<0>(t0) == 1 && std::get<1>(t0) == 2, "Error in oq0 output");
- ASSERT(oq1.try_get(t1) && std::get<0>(t1) == 1 && std::get<1>(t1) == 2, "Error in oq1 output");
+ ASSERT(oq0.try_get(t0) && tbb::flow::get<0>(t0) == 1 && tbb::flow::get<1>(t0) == 2, "Error in oq0 output");
+ ASSERT(oq1.try_get(t1) && tbb::flow::get<0>(t1) == 1 && tbb::flow::get<1>(t1) == 2, "Error in oq1 output");
}
// attach qnq to iq1
// qnp and qnq should be empty
@@ -1058,7 +1048,7 @@ tbb::flow::tag_value myTagValue(int i) { return tbb::flow::tag_value(i); }
template<>
void test_input_port_policies<tbb::flow::tag_matching>() {
tbb::flow::graph g;
- typedef tbb::flow::join_node<std::tuple<int, int>, tbb::flow::tag_matching > JType;
+ typedef tbb::flow::join_node<tbb::flow::tuple<int, int>, tbb::flow::tag_matching > JType;
JType jn(g, myTagValue, myTagValue);
// create output_queue oq0, oq1
typedef JType::output_type OQType;
@@ -1100,8 +1090,8 @@ void test_input_port_policies<tbb::flow::tag_matching>() {
{
OQType t0;
OQType t1;
- ASSERT(oq0.try_get(t0) && std::get<0>(t0) == loop && std::get<1>(t0) == loop, "Error in oq0 output");
- ASSERT(oq1.try_get(t1) && std::get<0>(t1) == loop && std::get<1>(t1) == loop, "Error in oq1 output");
+ ASSERT(oq0.try_get(t0) && tbb::flow::get<0>(t0) == loop && tbb::flow::get<1>(t0) == loop, "Error in oq0 output");
+ ASSERT(oq1.try_get(t1) && tbb::flow::get<0>(t1) == loop && tbb::flow::get<1>(t1) == loop, "Error in oq1 output");
ASSERT(!oq0.try_get(t0), "extra object in output queue oq0");
ASSERT(!oq1.try_get(t0), "extra object in output queue oq1");
}
@@ -1145,8 +1135,8 @@ void test_input_port_policies<tbb::flow::tag_matching>() {
{
OQType t0;
OQType t1;
- ASSERT(oq0.try_get(t0) && std::get<0>(t0) == lp1 && std::get<1>(t0) == lp1, "Error in oq0 output");
- ASSERT(oq1.try_get(t1) && std::get<0>(t1) == lp1 && std::get<1>(t1) == lp1, "Error in oq1 output");
+ ASSERT(oq0.try_get(t0) && tbb::flow::get<0>(t0) == lp1 && tbb::flow::get<1>(t0) == lp1, "Error in oq0 output");
+ ASSERT(oq1.try_get(t1) && tbb::flow::get<0>(t1) == lp1 && tbb::flow::get<1>(t1) == lp1, "Error in oq1 output");
ASSERT(!oq0.try_get(t0), "extra object in output queue oq0");
ASSERT(!oq1.try_get(t0), "extra object in output queue oq1");
}
@@ -1165,90 +1155,90 @@ int TestMain() {
for (int p = 0; p < 2; ++p) {
REMARK("reserving\n");
- generate_test<serial_test, std::tuple<float, double>, tbb::flow::reserving >::do_test();
- generate_test<serial_test, std::tuple<float, double, int, long>, tbb::flow::reserving >::do_test();
-#if __TBB_VARIADIC_MAX >= 6
- generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::flow::reserving >::do_test();
+ generate_test<serial_test, tbb::flow::tuple<float, double>, tbb::flow::reserving >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 4
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, long>, tbb::flow::reserving >::do_test();
#endif
-#if COMPREHENSIVE_TEST
-#if __TBB_VARIADIC_MAX >= 8
- generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::flow::reserving >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 6
+ generate_test<serial_test, tbb::flow::tuple<double, double, int, long, int, short>, tbb::flow::reserving >::do_test();
#endif
-#if __TBB_VARIADIC_MAX >= 10
- generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::flow::reserving >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 8
+ generate_test<serial_test, tbb::flow::tuple<float, double, double, double, float, int, float, long>, tbb::flow::reserving >::do_test();
#endif
+#if MAX_TUPLE_TEST_SIZE >= 10
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::flow::reserving >::do_test();
#endif
- generate_test<parallel_test, std::tuple<float, double>, tbb::flow::reserving >::do_test();
- generate_test<parallel_test, std::tuple<float, int, long>, tbb::flow::reserving >::do_test();
- generate_test<parallel_test, std::tuple<double, double, int, int, short>, tbb::flow::reserving >::do_test();
-#if COMPREHENSIVE_TEST
-#if __TBB_VARIADIC_MAX >= 7
- generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::flow::reserving >::do_test();
+ generate_test<parallel_test, tbb::flow::tuple<float, double>, tbb::flow::reserving >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 3
+ generate_test<parallel_test, tbb::flow::tuple<float, int, long>, tbb::flow::reserving >::do_test();
#endif
-#if __TBB_VARIADIC_MAX >= 9
- generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::reserving >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 5
+ generate_test<parallel_test, tbb::flow::tuple<double, double, int, int, short>, tbb::flow::reserving >::do_test();
#endif
+#if MAX_TUPLE_TEST_SIZE >= 7
+ generate_test<parallel_test, tbb::flow::tuple<float, int, double, float, long, float, long>, tbb::flow::reserving >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 9
+ generate_test<parallel_test, tbb::flow::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::reserving >::do_test();
#endif
REMARK("queueing\n");
- generate_test<serial_test, std::tuple<float, double>, tbb::flow::queueing >::do_test();
- generate_test<serial_test, std::tuple<float, double, int, long>, tbb::flow::queueing >::do_test();
-#if __TBB_VARIADIC_MAX >= 6
- generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::flow::queueing >::do_test();
+ generate_test<serial_test, tbb::flow::tuple<float, double>, tbb::flow::queueing >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 4
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, long>, tbb::flow::queueing >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 6
+ generate_test<serial_test, tbb::flow::tuple<double, double, int, long, int, short>, tbb::flow::queueing >::do_test();
#endif
-#if COMPREHENSIVE_TEST
-#if __TBB_VARIADIC_MAX >= 8
- generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::flow::queueing >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 8
+ generate_test<serial_test, tbb::flow::tuple<float, double, double, double, float, int, float, long>, tbb::flow::queueing >::do_test();
#endif
-#if __TBB_VARIADIC_MAX >= 10
- generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::flow::queueing >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 10
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::flow::queueing >::do_test();
#endif
+ generate_test<parallel_test, tbb::flow::tuple<float, double>, tbb::flow::queueing >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 3
+ generate_test<parallel_test, tbb::flow::tuple<float, int, long>, tbb::flow::queueing >::do_test();
#endif
- generate_test<parallel_test, std::tuple<float, double>, tbb::flow::queueing >::do_test();
- generate_test<parallel_test, std::tuple<float, int, long>, tbb::flow::queueing >::do_test();
- generate_test<parallel_test, std::tuple<double, double, int, int, short>, tbb::flow::queueing >::do_test();
-#if COMPREHENSIVE_TEST
-#if __TBB_VARIADIC_MAX >= 7
- generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::flow::queueing >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 5
+ generate_test<parallel_test, tbb::flow::tuple<double, double, int, int, short>, tbb::flow::queueing >::do_test();
#endif
-#if __TBB_VARIADIC_MAX >= 9
- generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::queueing >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 7
+ generate_test<parallel_test, tbb::flow::tuple<float, int, double, float, long, float, long>, tbb::flow::queueing >::do_test();
#endif
+#if MAX_TUPLE_TEST_SIZE >= 9
+ generate_test<parallel_test, tbb::flow::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::queueing >::do_test();
#endif
REMARK("tag_matching\n");
- generate_test<serial_test, std::tuple<float, double>, tbb::flow::tag_matching >::do_test();
- generate_test<serial_test, std::tuple<float, double, int, long>, tbb::flow::tag_matching >::do_test();
-#if __TBB_VARIADIC_MAX >= 6
- generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::flow::tag_matching >::do_test();
+ generate_test<serial_test, tbb::flow::tuple<float, double>, tbb::flow::tag_matching >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 4
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, long>, tbb::flow::tag_matching >::do_test();
#endif
-#if COMPREHENSIVE_TEST
-#if __TBB_VARIADIC_MAX >= 8
- generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::flow::tag_matching >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 6
+ generate_test<serial_test, tbb::flow::tuple<double, double, int, long, int, short>, tbb::flow::tag_matching >::do_test();
#endif
-#if __TBB_VARIADIC_MAX >= 10
- generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::flow::tag_matching >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 8
+ generate_test<serial_test, tbb::flow::tuple<float, double, double, double, float, int, float, long>, tbb::flow::tag_matching >::do_test();
#endif
+#if MAX_TUPLE_TEST_SIZE >= 10
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::flow::tag_matching >::do_test();
#endif
- generate_test<parallel_test, std::tuple<float, double>, tbb::flow::tag_matching >::do_test();
- generate_test<parallel_test, std::tuple<float, int, long>, tbb::flow::tag_matching >::do_test();
- generate_test<parallel_test, std::tuple<double, double, int, int, short>, tbb::flow::tag_matching >::do_test();
-#if COMPREHENSIVE_TEST
-#if __TBB_VARIADIC_MAX >= 7
- generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::flow::tag_matching >::do_test();
+ generate_test<parallel_test, tbb::flow::tuple<float, double>, tbb::flow::tag_matching >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 3
+ generate_test<parallel_test, tbb::flow::tuple<float, int, long>, tbb::flow::tag_matching >::do_test();
#endif
-#if __TBB_VARIADIC_MAX >= 9
- generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::tag_matching >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 5
+ generate_test<parallel_test, tbb::flow::tuple<double, double, int, int, short>, tbb::flow::tag_matching >::do_test();
#endif
+#if MAX_TUPLE_TEST_SIZE >= 7
+ generate_test<parallel_test, tbb::flow::tuple<float, int, double, float, long, float, long>, tbb::flow::tag_matching >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 9
+ generate_test<parallel_test, tbb::flow::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::tag_matching >::do_test();
+#endif
+ generate_recirc_test<tbb::flow::tuple<float,double> >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 5
+ generate_recirc_test<tbb::flow::tuple<double, double, int, int, short> >::do_test();
#endif
-
- generate_recirc_test<std::tuple<float,double> >::do_test();
- generate_recirc_test<std::tuple<double, double, int, int, short> >::do_test();
}
return Harness::Done;
}
-#else // __SUNPRO_CC
-
-int TestMain() {
- return Harness::Skipped;
-}
-
-#endif // SUNPRO_CC
diff --git a/src/test/test_lambda.cpp b/src/test/test_lambda.cpp
index 90d95cb..7a5b52d 100644
--- a/src/test/test_lambda.cpp
+++ b/src/test/test_lambda.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_limiter_node.cpp b/src/test/test_limiter_node.cpp
index 3f34b6e..52293e3 100644
--- a/src/test/test_limiter_node.cpp
+++ b/src/test/test_limiter_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -40,10 +40,12 @@ struct serial_receiver : public tbb::flow::receiver<T> {
serial_receiver() : next_value(T(0)) {}
- /* override */ bool try_put( const T &v ) {
+ /* override */ tbb::task *try_put_task( const T &v ) {
ASSERT( next_value++ == v, NULL );
- return true;
+ return const_cast<tbb::task *>(tbb::flow::interface6::SUCCESSFULLY_ENQUEUED);
}
+
+ /*override*/void reset_receiver() {next_value = T(0);}
};
template< typename T >
@@ -53,10 +55,12 @@ struct parallel_receiver : public tbb::flow::receiver<T> {
parallel_receiver() { my_count = 0; }
- /* override */ bool try_put( const T & ) {
+ /* override */ tbb::task *try_put_task( const T &/*v*/ ) {
++my_count;
- return true;
+ return const_cast<tbb::task *>(tbb::flow::interface6::SUCCESSFULLY_ENQUEUED);
}
+
+ /*override*/void reset_receiver() {my_count = 0;}
};
template< typename T >
diff --git a/src/test/test_malloc_atexit.cpp b/src/test/test_malloc_atexit.cpp
index 0baa32a..3bac6b4 100644
--- a/src/test/test_malloc_atexit.cpp
+++ b/src/test/test_malloc_atexit.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -76,19 +76,32 @@ static Foo f;
#else // _USRDLL
#include "harness.h"
+#include "../tbbmalloc/proxy.h"
+
+#if _WIN32||_WIN64 || MALLOC_UNIXLIKE_OVERLOAD_ENABLED
+
+ #if _WIN32||_WIN64
+ extern __declspec(dllimport)
+ #endif
+ bool isMallocOverloaded();
+
+ int TestMain () {
+ #ifdef _PGO_INSTRUMENT
+ REPORT("Known issue: test_malloc_atexit hangs if compiled with -prof-genx\n");
+ return Harness::Skipped;
+ #elif __TBB_MIC_OFFLOAD
+ REPORT("Known issue: libmalloc_proxy.so is loaded too late in the offload mode on the target when linked via -lmalloc_proxy\n");
+ return Harness::Skipped;
+ #else
+ ASSERT( isMallocOverloaded(), "malloc was not replaced" );
+ return Harness::Done;
+ #endif
+ }
-#if _WIN32||_WIN64
-extern __declspec(dllimport)
-#endif
-bool isMallocOverloaded();
-
-int TestMain () {
-#ifdef _PGO_INSTRUMENT
- REPORT("Known issue: test_malloc_atexit hangs if compiled with -prof-genx\n");
- return Harness::Skipped;
#else
- return isMallocOverloaded()? Harness::Done : Harness::Skipped;
+ int TestMain () {
+ return Harness::Skipped;
+ }
#endif
-}
#endif // _USRDLL
diff --git a/src/test/test_malloc_compliance.cpp b/src/test/test_malloc_compliance.cpp
index d2272f9..9a90aac 100644
--- a/src/test/test_malloc_compliance.cpp
+++ b/src/test/test_malloc_compliance.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,13 +29,27 @@
const unsigned MByte = 1024*1024;
bool __tbb_test_errno = false;
+#include "tbb/tbb_config.h"
+
+#if __TBB_WIN8UI_SUPPORT
+// testing allocator itself not iterfaces
+// so we can use desktop functions
+#define _CRT_USE_WINAPI_FAMILY_DESKTOP_APP 1
+#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#include "harness.h"
+// FIXME: fix the test to support New Windows *8 Store Apps mode.
+int TestMain() {
+ return Harness::Skipped;
+}
+#else /* __TBB_WIN8UI_SUPPORT */
+
/* _WIN32_WINNT should be defined at the very beginning,
because other headers might include <windows.h>
*/
#if _WIN32 || _WIN64
#undef _WIN32_WINNT
-#define _WIN32_WINNT 0x0500
+#define _WIN32_WINNT 0x0501
#include "tbb/machine/windows_api.h"
#include <stdio.h>
#include "harness_report.h"
@@ -247,7 +261,8 @@ static void setSystemAllocs()
Raligned_realloc=_aligned_realloc;
Taligned_free=_aligned_free;
Rposix_memalign=0;
-#elif __APPLE__ || __sun // Mac OS* X and Solaris don't have posix_memalign
+#elif __APPLE__ || __sun || __ANDROID__
+// Mac OS* X, Solaris, and Android don't have posix_memalign
Raligned_malloc=0;
Raligned_realloc=0;
Taligned_free=0;
@@ -600,12 +615,18 @@ void myMemset(void *ptr, int c, size_t n)
#endif
}
-// This test requires 200 MB per thread, i.e. for standard 1:4 run
-// more then 800 MB of RAM is required.
+// This test requires more than TOTAL_MB_ALLOC MB of RAM.
+#if __ANDROID__
+// Android requires lower limit due to lack of virtual memory.
+#define TOTAL_MB_ALLOC 200
+#else
+#define TOTAL_MB_ALLOC 800
+#endif
void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
{
+ const int MB_PER_THREAD = TOTAL_MB_ALLOC / total_threads;
// find size to guarantee getting NULL for 1024 B allocations
- const int MAXNUM_1024 = (200+50)*1024;
+ const int MAXNUM_1024 = (MB_PER_THREAD + (MB_PER_THREAD>>2)) * 1024;
std::vector<MemStruct> PointerList;
void *tmp;
@@ -613,7 +634,7 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
int CountNULL, num_1024;
if (FullLog) REPORT("\nNULL return & check errno:\n");
UINT Size;
- Limit limit_200M(200*total_threads), no_limit(0);
+ Limit limit_total(TOTAL_MB_ALLOC), no_limit(0);
void **buf_1024 = (void**)Tmalloc(MAXNUM_1024*sizeof(void*));
ASSERT(buf_1024, NULL);
@@ -621,7 +642,7 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
Reserve enough for the worst case, taking into account race for
limited space between threads.
*/
- PointerList.reserve(200*total_threads*MByte/MinSize);
+ PointerList.reserve(TOTAL_MB_ALLOC*MByte/MinSize);
/* There is a bug in the specific version of GLIBC (2.5-12) shipped
with RHEL5 that leads to erroneous working of the test
@@ -629,9 +650,9 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
Switching to GLIBC 2.5-18 from RHEL5.1 resolved the issue.
*/
if (perProcessLimits)
- limitBarrier->wait(limit_200M);
+ limitBarrier->wait(limit_total);
else
- limitMem(200);
+ limitMem(MB_PER_THREAD);
/* regression test against the bug in allocator when it dereference NULL
while lack of memory
@@ -1006,3 +1027,6 @@ void CMemTest::RunAllTests(int total_threads)
#endif
if (FullLog) REPORT("Tests for %d threads ended\n", total_threads);
}
+
+#endif /* __TBB_WIN8UI_SUPPORT */
+
diff --git a/src/test/test_malloc_init_shutdown.cpp b/src/test/test_malloc_init_shutdown.cpp
index a3cda97..b52fc5e 100644
--- a/src/test/test_malloc_init_shutdown.cpp
+++ b/src/test/test_malloc_init_shutdown.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_malloc_lib_unload.cpp b/src/test/test_malloc_lib_unload.cpp
index 40c2ec5..07dea21 100644
--- a/src/test/test_malloc_lib_unload.cpp
+++ b/src/test/test_malloc_lib_unload.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -125,36 +125,15 @@ extern "C" size_t safer_scalable_msize (void *, size_t (*)(void*))
#include "tbb/tbb_stddef.h"
#define HARNESS_NO_PARSE_COMMAND_LINE 1
#include "harness.h"
-#include "harness_memory.h"
-#include "harness_dynamic_libs.h"
-
-#if TBB_USE_DEBUG
-#define SUFFIX1 "_debug"
-#define SUFFIX2
-#else
-#define SUFFIX1
-#define SUFFIX2 "_debug"
-#endif /* TBB_USE_DEBUG */
-#if _WIN32||_WIN64
-#define PREFIX
-#define EXT ".dll"
-#else
-#define PREFIX "lib"
-#if __APPLE__
-#define EXT ".dylib"
-#elif __linux__
-#define EXT __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION)
-#elif __FreeBSD__ || __NetBSD__ || __sun || _AIX
-#define EXT ".so"
-#else
-#error Unknown OS
-#endif
-#endif
+#if __TBB_WIN8UI_SUPPORT
+int TestMain() {
+ return Harness::Skipped;
+}
+#else /* __TBB_WIN8UI_SUPPORT */
-// Form the names of the TBB memory allocator binaries.
-#define MALLOCLIB_NAME1 PREFIX "tbbmalloc" SUFFIX1 EXT
-#define MALLOCLIB_NAME2 PREFIX "tbbmalloc" SUFFIX2 EXT
+#include "harness_memory.h"
+#include "harness_dynamic_libs.h"
extern "C" {
#if _WIN32||_WIN64
@@ -238,4 +217,6 @@ int TestMain () {
return Harness::Done;
}
+#endif /* __TBB_WIN8UI_SUPPORT */
+
#endif // _USRDLL
diff --git a/src/test/test_malloc_overload.cpp b/src/test/test_malloc_overload.cpp
index 3509b69..55b3b72 100644
--- a/src/test/test_malloc_overload.cpp
+++ b/src/test/test_malloc_overload.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -27,29 +27,36 @@
*/
-#if __linux__
-#define MALLOC_REPLACEMENT_AVAILABLE 1
-#elif _WIN32 && !__MINGW32__ && !__MINGW64__
-#define MALLOC_REPLACEMENT_AVAILABLE 2
-#include "tbb/tbbmalloc_proxy.h"
-#endif
-
-#if MALLOC_REPLACEMENT_AVAILABLE
-
-#if _WIN32 || _WIN64
+#if (_WIN32 || _WIN64) && !(defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
// As the test is intentionally build with /EHs-, suppress multiple VS2005's
// warnings like C4530: C++ exception handler used, but unwind semantics are not enabled
+// The test is skipped under Win8/UI, so do nothing.
#if defined(_MSC_VER) && !__INTEL_COMPILER
/* ICC 10.1 and 11.0 generates code that uses std::_Raise_handler,
but it's only defined in libcpmt(d), which the test doesn't linked with.
*/
+#undef _HAS_EXCEPTIONS
#define _HAS_EXCEPTIONS 0
#endif
// to use strdup and putenv w/o warnings
#define _CRT_NONSTDC_NO_DEPRECATE 1
+#endif // _WIN32 || _WIN64
+
+#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#include "harness.h"
+
+#if __linux__
+#define MALLOC_REPLACEMENT_AVAILABLE 1
+#elif _WIN32 && !__MINGW32__ && !__MINGW64__ && !__TBB_WIN8UI_SUPPORT
+#define MALLOC_REPLACEMENT_AVAILABLE 2
+#include "tbb/tbbmalloc_proxy.h"
#endif
+
+#if MALLOC_REPLACEMENT_AVAILABLE
+
#include "harness_report.h"
#include "harness_assert.h"
+#include "harness_defs.h"
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
@@ -61,6 +68,16 @@
#include <unistd.h> // for sysconf
#include <stdint.h> // for uintptr_t
+extern "C" {
+void *__libc_malloc(size_t size);
+void *__libc_realloc(void *ptr, size_t size);
+void *__libc_calloc(size_t num, size_t size);
+void __libc_free(void *ptr);
+void *__libc_memalign(size_t alignment, size_t size);
+void *__libc_pvalloc(size_t size);
+void *__libc_valloc(size_t size);
+}
+
#elif _WIN32
#include <stddef.h>
#if __MINGW32__
@@ -74,7 +91,7 @@ typedef unsigned __int64 uint64_t;
#endif /* OS selection */
#if _WIN32
-// On Windows, the tricky way to print "done" is necessary to create
+// On Windows, the trick with string "dependence on msvcpXX.dll" is necessary to create
// dependence on msvcpXX.dll, for sake of a regression test.
// On Linux, C++ RTL headers are undesirable because of breaking strict ANSI mode.
#if defined(_MSC_VER) && _MSC_VER >= 1300 && _MSC_VER <= 1310 && !defined(__INTEL_COMPILER)
@@ -177,14 +194,57 @@ struct BigStruct {
char f[minLargeObjectSize];
};
-int main(int , char *[]) {
+void CheckStdFuncOverload(void *(*malloc_p)(size_t), void *(*calloc_p)(size_t, size_t),
+ void *(*realloc_p)(void *, size_t), void (*free_p)(void *))
+{
+ void *ptr = malloc_p(minLargeObjectSize);
+ ASSERT(ptr!=NULL && scalableMallocLargeBlock(ptr, minLargeObjectSize), NULL);
+ free(ptr);
+
+ ptr = calloc_p(minLargeObjectSize, 2);
+ ASSERT(ptr!=NULL && scalableMallocLargeBlock(ptr, minLargeObjectSize*2), NULL);
+ void *ptr1 = realloc_p(ptr, minLargeObjectSize*10);
+ ASSERT(ptr1!=NULL && scalableMallocLargeBlock(ptr1, minLargeObjectSize*10), NULL);
+ free_p(ptr1);
+
+}
+
+#if MALLOC_REPLACEMENT_AVAILABLE == 1
+
+void CheckUnixAlignFuncOverload(void *(*memalign_p)(size_t, size_t),
+ void *(*valloc_p)(size_t), void (*free_p)(void*))
+{
+ void *ptr = memalign_p(128, 4*minLargeObjectSize);
+ ASSERT(ptr!=NULL && scalableMallocLargeBlock(ptr, 4*minLargeObjectSize), NULL);
+ free_p(ptr);
+
+ ptr = valloc_p(minLargeObjectSize);
+ ASSERT(ptr!=NULL && isAligned(ptr, sysconf(_SC_PAGESIZE)) &&
+ scalableMallocLargeBlock(ptr, minLargeObjectSize), NULL);
+ free_p(ptr);
+}
+
+#if __TBB_PVALLOC_PRESENT
+void CheckPvalloc(void *(*pvalloc_p)(size_t), void (*free_p)(void*))
+{
+ long memoryPageSize = sysconf(_SC_PAGESIZE);
+ int sz = 1024*minLargeObjectSize;
+ void *ptr = pvalloc_p(sz);
+ ASSERT(ptr!=NULL && // align size up to the page size
+ scalableMallocLargeBlock(ptr, ((sz-1) | (memoryPageSize-1)) + 1), NULL);
+ free_p(ptr);
+}
+#else
+#define CheckPvalloc(alloc_p, free_p) ((void)0)
+#endif
+
+#endif // MALLOC_REPLACEMENT_AVAILABLE
+
+int TestMain() {
void *ptr, *ptr1;
#if MALLOC_REPLACEMENT_AVAILABLE == 1
- if (NULL == dlsym(RTLD_DEFAULT, "scalable_malloc")) {
- REPORT("libtbbmalloc not found\nfail\n");
- return 1;
- }
+ ASSERT(dlsym(RTLD_DEFAULT, "scalable_malloc"), "libtbbmalloc not found");
#endif
/* On Windows, memory block size returned by _msize() is sometimes used
@@ -208,36 +268,17 @@ int main(int , char *[]) {
free(pathCopy);
free(newEnv);
- ptr = malloc(minLargeObjectSize);
- ASSERT(ptr!=NULL && scalableMallocLargeBlock(ptr, minLargeObjectSize), NULL);
- free(ptr);
-
- ptr = calloc(minLargeObjectSize, 2);
- ASSERT(ptr!=NULL && scalableMallocLargeBlock(ptr, minLargeObjectSize*2), NULL);
- ptr1 = realloc(ptr, minLargeObjectSize*10);
- ASSERT(ptr1!=NULL && scalableMallocLargeBlock(ptr1, minLargeObjectSize*10), NULL);
- free(ptr1);
-
+ CheckStdFuncOverload(malloc, calloc, realloc, free);
#if MALLOC_REPLACEMENT_AVAILABLE == 1
+#if __TBB_POSIX_MEMALIGN_PRESENT
int ret = posix_memalign(&ptr, 1024, 3*minLargeObjectSize);
ASSERT(0==ret && ptr!=NULL && scalableMallocLargeBlock(ptr, 3*minLargeObjectSize), NULL);
free(ptr);
+#endif
- ptr = memalign(128, 4*minLargeObjectSize);
- ASSERT(ptr!=NULL && scalableMallocLargeBlock(ptr, 4*minLargeObjectSize), NULL);
- free(ptr);
-
- ptr = valloc(minLargeObjectSize);
- ASSERT(ptr!=NULL && scalableMallocLargeBlock(ptr, minLargeObjectSize), NULL);
- free(ptr);
-
- long memoryPageSize = sysconf(_SC_PAGESIZE);
- int sz = 1024*minLargeObjectSize;
- ptr = pvalloc(sz);
- ASSERT(ptr!=NULL && // align size up to the page size
- scalableMallocLargeBlock(ptr, ((sz-1) | (memoryPageSize-1)) + 1), NULL);
- free(ptr);
+ CheckUnixAlignFuncOverload(memalign, valloc, free);
+ CheckPvalloc(pvalloc, free);
struct mallinfo info = mallinfo();
// right now mallinfo initialized by zero
@@ -245,6 +286,15 @@ int main(int , char *[]) {
&& !info.hblkhd && !info.usmblks && !info.fsmblks
&& !info.uordblks && !info.fordblks && !info.keepcost, NULL);
+#if __linux__ && !__ANDROID__
+ // Those non-standart functions are exported by GLIBC, and might be used
+ // in conjunction with standart malloc/free. Test that we ovrload them as well.
+ // Bionic doesn't have them.
+ CheckStdFuncOverload(__libc_malloc, __libc_calloc, __libc_realloc, __libc_free);
+ CheckUnixAlignFuncOverload(__libc_memalign, __libc_valloc, __libc_free);
+ CheckPvalloc(__libc_pvalloc, __libc_free);
+#endif // __linux__
+
#elif MALLOC_REPLACEMENT_AVAILABLE == 2
ptr = _aligned_malloc(minLargeObjectSize,16);
@@ -273,24 +323,17 @@ int main(int , char *[]) {
delete []f;
#if _WIN32
- std::string stdstring = "done";
- const char* s = stdstring.c_str();
-#else
- const char* s = "done";
+ std::string stdstring = "dependence on msvcpXX.dll";
+ ASSERT(strcmp(stdstring.c_str(), "dependence on msvcpXX.dll") == 0, NULL);
#endif
- REPORT("%s\n", s);
- return 0;
-}
-#define HARNESS_NO_PARSE_COMMAND_LINE 1
-#define HARNESS_CUSTOM_MAIN 1
-#include "harness.h"
+ return Harness::Done;
+}
#else /* !MALLOC_REPLACEMENT_AVAILABLE */
#include <stdio.h>
-int main(int , char *[]) {
- printf("skip\n");
- return 0;
+int TestMain() {
+ return Harness::Skipped;
}
#endif /* !MALLOC_REPLACEMENT_AVAILABLE */
diff --git a/src/test/test_malloc_pools.cpp b/src/test/test_malloc_pools.cpp
index 7fc3b6a..341fb62 100644
--- a/src/test/test_malloc_pools.cpp
+++ b/src/test/test_malloc_pools.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -422,8 +422,9 @@ static void TestPoolKeepTillDestroy()
pool_malloc(pool, 8*1024*1024);
if (keep)
ASSERT(currGetCalls == getMemCalls, "Must not lead to new getMem call");
+ size_t currPuts = putMemCalls;
pool_reset(pool);
- ASSERT(!putMemCalls, "Pool is not releasing memory during reset.");
+ ASSERT(currPuts == putMemCalls, "Pool is not releasing memory during reset.");
pool_destroy(pool);
ASSERT(putMemCalls, NULL);
totalPutMemCalls += putMemCalls;
diff --git a/src/test/test_malloc_pure_c.c b/src/test/test_malloc_pure_c.c
index 4c40eb9..4ef6bb2 100644
--- a/src/test/test_malloc_pure_c.c
+++ b/src/test/test_malloc_pure_c.c
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -39,9 +39,27 @@
* can be used from pure C programs; also some regression checks are done
*/
+#if __linux__
+/* huge pages supported only under Linux so far */
+void CheckReturnCode(int ret) { assert(!ret); }
+#else
+void CheckReturnCode(int ret) { assert( ret); }
+#endif
+
int main(void) {
size_t i, j;
+ int curr_mode;
void *p1, *p2;
+
+ for ( curr_mode = 0; curr_mode<=1; curr_mode++) {
+ CheckReturnCode(scalable_allocation_mode(USE_HUGE_PAGES, !curr_mode));
+ p1 = scalable_malloc(10*1024*1024);
+ assert(p1);
+ CheckReturnCode(scalable_allocation_mode(USE_HUGE_PAGES, curr_mode));
+ scalable_free(p1);
+ }
+ /* note that huge pages (if supported) are still enabled at this point */
+
for( i=0; i<=1<<16; ++i) {
p1 = scalable_malloc(i);
if( !p1 )
diff --git a/src/test/test_malloc_regression.cpp b/src/test/test_malloc_regression.cpp
index 4671bd4..063ec5c 100644
--- a/src/test/test_malloc_regression.cpp
+++ b/src/test/test_malloc_regression.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_malloc_used_by_lib.cpp b/src/test/test_malloc_used_by_lib.cpp
index f53a7f2..9c40cc0 100644
--- a/src/test/test_malloc_used_by_lib.cpp
+++ b/src/test/test_malloc_used_by_lib.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,6 +29,7 @@
#if _USRDLL
#include <stdlib.h>
+#include "harness_defs.h"
#include "tbb/scalable_allocator.h"
#if __TBB_SOURCE_DIRECTLY_INCLUDED
#include "../tbbmalloc/tbbmalloc_internal_api.h"
@@ -78,6 +79,13 @@ static RegisterProcessShutdownNotification reg;
#define __TBB_NO_IMPLICIT_LINKAGE 1
#define HARNESS_NO_PARSE_COMMAND_LINE 1
#include "harness.h"
+#if __TBB_WIN8UI_SUPPORT
+// FIXME: fix the test to support New Windows *8 Store Apps mode.
+int TestMain() {
+ return Harness::Skipped;
+}
+#else /* __TBB_WIN8UI_SUPPORT */
+
#include "harness_memory.h"
#include "harness_tbb_independence.h"
#include "harness_barrier.h"
@@ -171,3 +179,4 @@ int TestMain () {
}
#endif // _USRDLL
+#endif /* __TBB_WIN8UI_SUPPORT */
diff --git a/src/test/test_malloc_whitebox.cpp b/src/test/test_malloc_whitebox.cpp
index 95f9936..a642b74 100644
--- a/src/test/test_malloc_whitebox.cpp
+++ b/src/test/test_malloc_whitebox.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -42,6 +42,10 @@
#undef DO_ITT_NOTIFY
#endif
+#define __TBB_MALLOC_WHITEBOX_TEST 1 // to get access to LOC internals
+// help trigger rare race condition
+#define WhiteboxTestingYield() (__TBB_Yield(), __TBB_Yield(), __TBB_Yield(), __TBB_Yield())
+
#define protected public
#define private public
#include "../tbbmalloc/frontend.cpp"
@@ -97,7 +101,7 @@ public:
// push to maximal cache limit
for (int i=0; i<2; i++) {
const int sizes[] = { MByte/sizeof(int),
- (MByte-2*largeBlockCacheStep)/sizeof(int) };
+ (MByte-2*LargeObjectCache::largeBlockCacheStep)/sizeof(int) };
for (int q=0; q<2; q++) {
size_t curr = 0;
for (int j=0; j<LARGE_MEM_SIZES_NUM; j++, curr++)
@@ -133,6 +137,18 @@ public:
int TestLargeObjCache::largeMemSizes[LARGE_MEM_SIZES_NUM];
+void TestLargeObjectCache()
+{
+ for (int i=0; i<LARGE_MEM_SIZES_NUM; i++)
+ TestLargeObjCache::largeMemSizes[i] =
+ (int)(minLargeObjectSize + 2*minLargeObjectSize*(1.*rand()/RAND_MAX));
+
+ for( int p=MaxThread; p>=MinThread; --p ) {
+ TestLargeObjCache::initBarrier( p );
+ NativeParallelFor( p, TestLargeObjCache() );
+ }
+}
+
#if MALLOC_CHECK_RECURSION
class TestStartupAlloc: public SimpleBarrier {
@@ -164,13 +180,13 @@ public:
for (size_t j=0; j<blocks1[i].sz; j++)
ASSERT(*((char*)blocks1[i].ptr+j) == i, NULL);
- Block *block = (Block *)alignDown(blocks1[i].ptr, blockSize);
+ Block *block = (Block *)alignDown(blocks1[i].ptr, slabSize);
((StartupBlock *)block)->free(blocks1[i].ptr);
}
for (int i=ITERS-1; i>=0; i--) {
for (size_t j=0; j<blocks2[i].sz; j++)
ASSERT(*((char*)blocks2[i].ptr+j) == i, NULL);
- Block *block = (Block *)alignDown(blocks2[i].ptr, blockSize);
+ Block *block = (Block *)alignDown(blocks2[i].ptr, slabSize);
((StartupBlock *)block)->free(blocks2[i].ptr);
}
}
@@ -237,7 +253,12 @@ static void cleanObjectCache()
}
class TestInvalidBackrefs: public SimpleBarrier {
+#if __ANDROID__
+ // Android requires lower iters due to lack of virtual memory.
+ static const int BACKREF_GROWTH_ITERS = 50*1024;
+#else
static const int BACKREF_GROWTH_ITERS = 200*1024;
+#endif
static tbb::atomic<bool> backrefGrowthDone;
static void *ptrs[BACKREF_GROWTH_ITERS];
@@ -387,7 +408,7 @@ void TestPools() {
from LOC during LOC cleanup, and putMallocMem checks that returned size
is correct.
*/
- const size_t passBackendSz = Backend::maxBinedSize+1,
+ const size_t passBackendSz = Backend::maxBinned_HugePage+1,
anotherLOCBinSz = minLargeObjectSize+1;
for (int i=0; i<10; i++) { // run long enough to be cached
void *p = pool_malloc(mallocPool, passBackendSz);
@@ -419,7 +440,7 @@ void TestPools() {
pool_free(fixedPool, largeObj);
// provoke large object cache cleanup and hope no leaks occurs
- for (size_t sz=minLargeObjectSize; sz<1*1024*1024; sz+=largeBlockCacheStep) {
+ for (size_t sz=minLargeObjectSize; sz<1*1024*1024; sz+=LargeObjectCache::largeBlockCacheStep) {
ptr = pool_malloc(mallocPool, sz);
ASSERT(ptr, "Memory was not allocated");
memset(ptr, sz, sz);
@@ -431,6 +452,57 @@ void TestPools() {
cleanObjectCache();
afterNumBackRef = allocatedBackRefCount();
ASSERT(beforeNumBackRef==afterNumBackRef, "backreference leak detected");
+
+ {
+ // test usedSize/cachedSize and LOC bitmask correctness
+ void *p[5];
+ pool_create_v1(0, &pol, &mallocPool);
+ const LargeObjectCache *loc = &((rml::internal::MemoryPool*)mallocPool)->extMemPool.loc;
+ p[3] = pool_malloc(mallocPool, minLargeObjectSize+2*LargeObjectCache::largeBlockCacheStep);
+ for (int i=0; i<10; i++) {
+ p[0] = pool_malloc(mallocPool, minLargeObjectSize);
+ p[1] = pool_malloc(mallocPool, minLargeObjectSize+LargeObjectCache::largeBlockCacheStep);
+ pool_free(mallocPool, p[0]);
+ pool_free(mallocPool, p[1]);
+ }
+ ASSERT(loc->getUsedSize(), NULL);
+ pool_free(mallocPool, p[3]);
+ ASSERT(loc->getLOCSize() < 3*(minLargeObjectSize+LargeObjectCache::largeBlockCacheStep), NULL);
+ const size_t maxLocalLOCSize = LocalLOC<3,30>::getMaxSize();
+ ASSERT(loc->getUsedSize() <= maxLocalLOCSize, NULL);
+ for (int i=0; i<3; i++)
+ p[i] = pool_malloc(mallocPool, minLargeObjectSize+i*LargeObjectCache::largeBlockCacheStep);
+ size_t currUser = loc->getUsedSize();
+ ASSERT(!loc->getLOCSize() && currUser >= 3*(minLargeObjectSize+LargeObjectCache::largeBlockCacheStep), NULL);
+ p[4] = pool_malloc(mallocPool, minLargeObjectSize+3*LargeObjectCache::largeBlockCacheStep);
+ ASSERT(loc->getUsedSize() - currUser >= minLargeObjectSize+3*LargeObjectCache::largeBlockCacheStep, NULL);
+ pool_free(mallocPool, p[4]);
+ ASSERT(loc->getUsedSize() <= currUser+maxLocalLOCSize, NULL);
+ pool_reset(mallocPool);
+ ASSERT(!loc->getLOCSize() && !loc->getUsedSize(), NULL);
+ pool_destroy(mallocPool);
+ }
+ // To test LOC we need bigger lists than released by current LocalLOC
+ // in production code. Create special LocalLOC.
+ {
+ LocalLOC<2, 20> lLOC;
+ pool_create_v1(0, &pol, &mallocPool);
+ rml::internal::ExtMemoryPool *mPool = &((rml::internal::MemoryPool*)mallocPool)->extMemPool;
+ const LargeObjectCache *loc = &((rml::internal::MemoryPool*)mallocPool)->extMemPool.loc;
+ for (int i=0; i<22; i++) {
+ void *o = pool_malloc(mallocPool, minLargeObjectSize+i*LargeObjectCache::largeBlockCacheStep);
+ bool ret = lLOC.put(((LargeObjectHdr*)o - 1)->memoryBlock, mPool);
+ ASSERT(ret, NULL);
+
+ o = pool_malloc(mallocPool, minLargeObjectSize+i*LargeObjectCache::largeBlockCacheStep);
+ ret = lLOC.put(((LargeObjectHdr*)o - 1)->memoryBlock, mPool);
+ ASSERT(ret, NULL);
+ }
+ lLOC.clean(mPool);
+ ASSERT(!loc->getUsedSize(), NULL);
+
+ pool_destroy(mallocPool);
+ }
}
void TestObjectRecognition() {
@@ -441,24 +513,24 @@ void TestObjectRecognition() {
ASSERT(sizeof(BackRefIdx)==4, "Unexpected size of BackRefIdx");
ASSERT(getObjectSize(falseObjectSize)!=falseObjectSize, "Error in test: bad choice for false object size");
- void* mem = scalable_malloc(2*blockSize);
+ void* mem = scalable_malloc(2*slabSize);
ASSERT(mem, "Memory was not allocated");
- Block* falseBlock = (Block*)alignUp((uintptr_t)mem, blockSize);
+ Block* falseBlock = (Block*)alignUp((uintptr_t)mem, slabSize);
falseBlock->objectSize = falseObjectSize;
char* falseSO = (char*)falseBlock + falseObjectSize*7;
- ASSERT(alignDown(falseSO, blockSize)==(void*)falseBlock, "Error in test: false object offset is too big");
+ ASSERT(alignDown(falseSO, slabSize)==(void*)falseBlock, "Error in test: false object offset is too big");
- void* bufferLOH = scalable_malloc(2*blockSize + headersSize);
+ void* bufferLOH = scalable_malloc(2*slabSize + headersSize);
ASSERT(bufferLOH, "Memory was not allocated");
LargeObjectHdr* falseLO =
- (LargeObjectHdr*)alignUp((uintptr_t)bufferLOH + headersSize, blockSize);
+ (LargeObjectHdr*)alignUp((uintptr_t)bufferLOH + headersSize, slabSize);
LargeObjectHdr* headerLO = (LargeObjectHdr*)falseLO-1;
headerLO->memoryBlock = (LargeMemoryBlock*)bufferLOH;
- headerLO->memoryBlock->unalignedSize = 2*blockSize + headersSize;
- headerLO->memoryBlock->objectSize = blockSize + headersSize;
+ headerLO->memoryBlock->unalignedSize = 2*slabSize + headersSize;
+ headerLO->memoryBlock->objectSize = slabSize + headersSize;
headerLO->backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/true);
setBackRef(headerLO->backRefIdx, headerLO);
- ASSERT(scalable_msize(falseLO) == blockSize + headersSize,
+ ASSERT(scalable_msize(falseLO) == slabSize + headersSize,
"Error in test: LOH falsification failed");
removeBackRef(headerLO->backRefIdx);
@@ -500,7 +572,7 @@ void TestObjectRecognition() {
scalable_free(smallPtr);
obtainedSize = safer_scalable_msize(mem, NULL);
- ASSERT(obtainedSize>=2*blockSize, "Correct pointer not accepted?");
+ ASSERT(obtainedSize>=2*slabSize, "Correct pointer not accepted?");
scalable_free(mem);
scalable_free(bufferLOH);
}
@@ -510,19 +582,19 @@ class TestBackendWork: public SimpleBarrier {
intptr_t data;
BackRefIdx idx;
};
- static const int ITERS = 100;
+ static const int ITERS = 20;
rml::internal::Backend *backend;
public:
TestBackendWork(rml::internal::Backend *bknd) : backend(bknd) {}
void operator()(int) const {
barrier.wait();
-
+
for (int i=0; i<ITERS; i++) {
- BlockI *block16K = backend->get16KBlock(1);
- ASSERT(block16K, "Memory was not allocated");
- LargeMemoryBlock *lmb = backend->getLargeBlock(16*1024);
- backend->put16KBlock(block16K);
+ BlockI *slabBlock = backend->getSlabBlock(1);
+ ASSERT(slabBlock, "Memory was not allocated");
+ LargeMemoryBlock *lmb = backend->getLargeBlock(8*1024);
+ backend->putSlabBlock(slabBlock);
backend->putLargeBlock(lmb);
}
}
@@ -533,25 +605,29 @@ void TestBackend()
rml::MemPoolPolicy pol(getMallocMem, putMallocMem);
rml::MemoryPool *mPool;
pool_create_v1(0, &pol, &mPool);
- rml::internal::ExtMemoryPool *ePool =
+ rml::internal::ExtMemoryPool *ePool =
&((rml::internal::MemoryPool*)mPool)->extMemPool;
rml::internal::Backend *backend = &ePool->backend;
for( int p=MaxThread; p>=MinThread; --p ) {
- TestBackendWork::initBarrier(p);
- NativeParallelFor( p, TestBackendWork(backend) );
+ // regression test against an race condition in backend synchronization,
+ // triggered only when WhiteboxTestingYield() call yields
+ for (int i=0; i<100; i++) {
+ TestBackendWork::initBarrier(p);
+ NativeParallelFor( p, TestBackendWork(backend) );
+ }
}
- BlockI *block = backend->get16KBlock(1);
+ BlockI *block = backend->getSlabBlock(1);
ASSERT(block, "Memory was not allocated");
- backend->put16KBlock(block);
+ backend->putSlabBlock(block);
pool_destroy(mPool);
}
void TestBitMask()
{
- BitMask<256> mask;
+ BitMaskMin<256> mask;
mask.reset();
mask.set(10, 1);
@@ -575,9 +651,21 @@ void TestBitMask()
ASSERT(mask.getMinTrue(201) == -1, NULL);
}
+void checkNoHugePages()
+{
+ ASSERT(!hugePages.enabled, "scalable_allocation_mode "
+ "must have priority over environment variable");
+}
+
int TestMain () {
+ scalable_allocation_mode(USE_HUGE_PAGES, 0);
+#if !_XBOX && !__TBB_WIN8UI_SUPPORT
+ putenv((char*)"TBB_MALLOC_USE_HUGE_PAGES=yes");
+#endif
+ checkNoHugePages();
// backreference requires that initialization was done
if(!isMallocInitialized()) doInitialization();
+ checkNoHugePages();
// to succeed, leak detection must be the 1st memory-intensive test
TestBackRef();
TestPools();
@@ -591,15 +679,7 @@ int TestMain () {
}
#endif
- for (int i=0; i<LARGE_MEM_SIZES_NUM; i++)
- TestLargeObjCache::largeMemSizes[i] =
- (int)(minLargeObjectSize + 2*minLargeObjectSize*(1.*rand()/RAND_MAX));
-
- for( int p=MaxThread; p>=MinThread; --p ) {
- TestLargeObjCache::initBarrier( p );
- NativeParallelFor( p, TestLargeObjCache() );
- }
-
+ TestLargeObjectCache();
TestObjectRecognition();
TestBitMask();
return Harness::Done;
diff --git a/src/test/test_model_plugin.cpp b/src/test/test_model_plugin.cpp
index 39facd8..23f2a85 100644
--- a/src/test/test_model_plugin.cpp
+++ b/src/test/test_model_plugin.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -28,227 +28,8 @@
#include "tbb/tbb_config.h"
-#if __TBB_DEFINE_MIC
-
-#ifndef _USRDLL
#define HARNESS_NO_PARSE_COMMAND_LINE 1
#include "harness.h"
int TestMain() {
return Harness::Skipped;
}
-#endif
-
-#else /* !__MIC__ */
-
-#if _WIN32 || _WIN64
-#include "tbb/machine/windows_api.h"
-#else
-#include <dlfcn.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#if !TBB_USE_EXCEPTIONS && _MSC_VER
- // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
- #pragma warning (push)
- #pragma warning (disable: 4530)
-#endif
-
-#include <stdexcept>
-
-#if !TBB_USE_EXCEPTIONS && _MSC_VER
- #pragma warning (pop)
-#endif
-
-#if TBB_USE_EXCEPTIONS
- #include "harness_report.h"
-#endif
-
-#ifdef _USRDLL
-#include "tbb/task_scheduler_init.h"
-
-class CModel {
-public:
- CModel(void) {};
- static tbb::task_scheduler_init tbb_init;
-
- void init_and_terminate( int );
-};
-
-tbb::task_scheduler_init CModel::tbb_init(1);
-
-//! Test that task::initialize and task::terminate work when doing nothing else.
-/** maxthread is treated as the "maximum" number of worker threads. */
-void CModel::init_and_terminate( int maxthread ) {
- for( int i=0; i<200; ++i ) {
- switch( i&3 ) {
- default: {
- tbb::task_scheduler_init init( rand() % maxthread + 1 );
- break;
- }
- case 0: {
- tbb::task_scheduler_init init;
- break;
- }
- case 1: {
- tbb::task_scheduler_init init( tbb::task_scheduler_init::automatic );
- break;
- }
- case 2: {
- tbb::task_scheduler_init init( tbb::task_scheduler_init::deferred );
- init.initialize( rand() % maxthread + 1 );
- init.terminate();
- break;
- }
- }
- }
-}
-
-extern "C"
-#if _WIN32 || _WIN64
-__declspec(dllexport)
-#endif
-void plugin_call(int maxthread)
-{
- srand(2);
- __TBB_TRY {
- CModel model;
- model.init_and_terminate(maxthread);
- } __TBB_CATCH( std::runtime_error& error ) {
-#if TBB_USE_EXCEPTIONS
- REPORT("ERROR: %s\n", error.what());
-#endif /* TBB_USE_EXCEPTIONS */
- }
-}
-
-#else /* _USRDLL undefined */
-
-#define HARNESS_NO_ASSERT 1
-#include "harness.h"
-#include "harness_dynamic_libs.h"
-
-extern "C" void plugin_call(int);
-
-void report_error_in(const char* function_name)
-{
-#if _WIN32 || _WIN64
- char* message;
- int code = GetLastError();
-
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
- NULL, code,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (char*)&message, 0, NULL );
-#else
- char* message = (char*)dlerror();
- int code = 0;
-#endif
- REPORT( "%s failed with error %d: %s\n", function_name, code, message);
-
-#if _WIN32 || _WIN64
- LocalFree(message);
-#endif
-}
-
-int use_lot_of_tls() {
- int count = 0;
-#if _WIN32 || _WIN64
- DWORD last_handles[10];
- DWORD result;
- result = TlsAlloc();
- while( result!=TLS_OUT_OF_INDEXES ) {
- last_handles[++count%10] = result;
- result = TlsAlloc();
- }
- for( int i=0; i<10; ++i )
- TlsFree(last_handles[i]);
-#else
- pthread_key_t last_handles[10];
- pthread_key_t result;
- int setspecific_dummy=10;
- while( pthread_key_create(&result, NULL)==0
- && count < 4096 ) // Sun Solaris doesn't have any built-in limit, so we set something big enough
- {
- last_handles[++count%10] = result;
- pthread_setspecific(result,&setspecific_dummy);
- }
- REMARK("Created %d keys\n", count);
- for( int i=0; i<10; ++i )
- pthread_key_delete(last_handles[i]);
-#endif
- return count-10;
-}
-
-typedef void (*PLUGIN_CALL)(int);
-
-#if __linux__
- #define RML_LIBRARY_NAME(base) TEST_LIBRARY_NAME(base) ".1"
-#else
- #define RML_LIBRARY_NAME(base) TEST_LIBRARY_NAME(base)
-#endif
-
-int TestMain () {
-#if !RML_USE_WCRM
- PLUGIN_CALL my_plugin_call;
-
- int tls_key_count = use_lot_of_tls();
- REMARK("%d thread local objects allocated in advance\n", tls_key_count);
-
- Harness::LIBRARY_HANDLE hLib;
-#if _WIN32 || _WIN64
- hLib = LoadLibrary("irml.dll");
- if ( !hLib )
- hLib = LoadLibrary("irml_debug.dll");
- if ( !hLib )
- return Harness::Skipped; // No shared RML, skip the test
- FreeLibrary(hLib);
-#else /* !WIN */
-#if __TBB_ARENA_PER_MASTER
- hLib = dlopen(RML_LIBRARY_NAME("libirml"), RTLD_LAZY);
- if ( !hLib )
- hLib = dlopen(RML_LIBRARY_NAME("libirml_debug"), RTLD_LAZY);
- if ( !hLib )
- return Harness::Skipped;
- dlclose(hLib);
-#endif /* __TBB_ARENA_PER_MASTER */
-#endif /* OS */
- for( int i=1; i<100; ++i ) {
- REMARK("Iteration %d, loading plugin library...\n", i);
- hLib = Harness::OpenLibrary(TEST_LIBRARY_NAME("test_model_plugin_dll"));
- if ( !hLib ) {
-#if !__TBB_NO_IMPLICIT_LINKAGE
-#if _WIN32 || _WIN64
- report_error_in("LoadLibrary");
-#else
- report_error_in("dlopen");
-#endif
- return -1;
-#else
- return Harness::Skipped;
-#endif
- }
- my_plugin_call = (PLUGIN_CALL)Harness::GetAddress(hLib, "plugin_call");
- if (my_plugin_call==NULL) {
-#if _WIN32 || _WIN64
- report_error_in("GetProcAddress");
-#else
- report_error_in("dlsym");
-#endif
- return -1;
- }
- REMARK("Calling plugin method...\n");
- my_plugin_call(MaxThread);
-
- REMARK("Unloading plugin library...\n");
- Harness::CloseLibrary(hLib);
- } // end for(1,100)
-
- return Harness::Done;
-#else
- return Harness::Skipped;
-#endif /* !RML_USE_WCRM */
-}
-
-#endif//_USRDLL
-#endif//__MIC__
diff --git a/src/test/test_multifunction_node.cpp b/src/test/test_multifunction_node.cpp
index 9e2935d..3f45737 100644
--- a/src/test/test_multifunction_node.cpp
+++ b/src/test/test_multifunction_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,18 +29,18 @@
#include "harness_graph.h"
#include "tbb/task_scheduler_init.h"
-#include "tbb/spin_mutex.h"
-
-#if !__SUNPRO_CC
-
-tbb::spin_mutex global_mutex;
+#include "tbb/spin_rw_mutex.h"
+#if TBB_USE_DEBUG
+#define N 16
+#else
#define N 100
+#endif
#define MAX_NODES 4
//! Performs test on function nodes with limited concurrency and buffering
/** Theses tests check:
- 1) that the number of executing copies never exceed the concurreny limit
+ 1) that the number of executing copies never exceed the concurrency limit
2) that the node never rejects
3) that no items are lost
and 4) all of this happens even if there are multiple predecessors and successors
@@ -64,17 +64,19 @@ struct parallel_put_until_limit : private NoAssign {
//! exercise buffered multifunction_node.
template< typename InputType, typename OutputTuple, typename Body >
void buffered_levels( size_t concurrency, Body body ) {
- typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type OutputType;
// Do for lc = 1 to concurrency level
for ( size_t lc = 1; lc <= concurrency; ++lc ) {
tbb::flow::graph g;
// Set the execute_counter back to zero in the harness
- harness_graph_multifunction_executor<InputType, OutputTuple,tbb::spin_mutex>::execute_count = 0;
+ harness_graph_multifunction_executor<InputType, OutputTuple>::execute_count = 0;
+ // Set the number of current executors to zero.
+ harness_graph_multifunction_executor<InputType, OutputTuple>::current_executors = 0;
// Set the max allowed executors to lc. There is a check in the functor to make sure this is never exceeded.
- harness_graph_multifunction_executor<InputType, OutputTuple,tbb::spin_mutex>::max_executors = lc;
+ harness_graph_multifunction_executor<InputType, OutputTuple>::max_executors = lc;
- // Create the function_node with the appropriate concurreny level, and use default buffering
+ // Create the function_node with the appropriate concurrency level, and use default buffering
tbb::flow::multifunction_node< InputType, OutputTuple > exe_node( g, lc, body );
//Create a vector of identical exe_nodes
@@ -108,7 +110,7 @@ void buffered_levels( size_t concurrency, Body body ) {
NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
g.wait_for_all();
- // cofirm that each sender was requested from N times
+ // confirm that each sender was requested from N times
for (size_t s = 0; s < num_senders; ++s ) {
size_t n = senders[s].my_received;
ASSERT( n == N, NULL );
@@ -148,14 +150,14 @@ struct inc_functor {
void operator()( int i, output_ports_type &p ) {
++global_execute_count;
++local_execute_count;
- (void)std::get<0>(p).try_put(i);
+ (void)tbb::flow::get<0>(p).try_put(i);
}
};
template< typename InputType, typename OutputTuple >
void buffered_levels_with_copy( size_t concurrency ) {
- typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type OutputType;
// Do for lc = 1 to concurrency level
for ( size_t lc = 1; lc <= concurrency; ++lc ) {
tbb::flow::graph g;
@@ -219,13 +221,12 @@ void buffered_levels_with_copy( size_t concurrency ) {
template< typename InputType, typename OutputTuple >
void run_buffered_levels( int c ) {
- typedef typename tbb::flow::multifunction_node<InputType,OutputTuple>::output_ports_type output_ports_type;
- harness_graph_multifunction_executor<InputType, OutputTuple, tbb::spin_mutex>::max_executors = c;
#if __TBB_LAMBDAS_PRESENT
- buffered_levels<InputType,OutputTuple>( c, []( InputType i, output_ports_type &p ) { harness_graph_multifunction_executor<InputType, OutputTuple, tbb::spin_mutex>::func(i,p); } );
+ typedef typename tbb::flow::multifunction_node<InputType,OutputTuple>::output_ports_type output_ports_type;
+ buffered_levels<InputType,OutputTuple>( c, []( InputType i, output_ports_type &p ) { harness_graph_multifunction_executor<InputType, OutputTuple>::func(i,p); } );
#endif
- buffered_levels<InputType,OutputTuple>( c, &harness_graph_multifunction_executor<InputType, OutputTuple, tbb::spin_mutex>::func );
- buffered_levels<InputType,OutputTuple>( c, typename harness_graph_multifunction_executor<InputType, OutputTuple, tbb::spin_mutex>::functor() );
+ buffered_levels<InputType,OutputTuple>( c, &harness_graph_multifunction_executor<InputType, OutputTuple>::func );
+ buffered_levels<InputType,OutputTuple>( c, typename harness_graph_multifunction_executor<InputType, OutputTuple>::functor() );
buffered_levels_with_copy<InputType,OutputTuple>( c );
}
@@ -241,10 +242,17 @@ void run_buffered_levels( int c ) {
template< typename InputType, typename OutputTuple, typename Body >
void concurrency_levels( size_t concurrency, Body body ) {
- typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type OutputType;
for ( size_t lc = 1; lc <= concurrency; ++lc ) {
tbb::flow::graph g;
- harness_graph_multifunction_executor<InputType, OutputTuple, tbb::spin_mutex>::execute_count = 0;
+
+ // Set the execute_counter back to zero in the harness
+ harness_graph_multifunction_executor<InputType, OutputTuple>::execute_count = 0;
+ // Set the number of current executors to zero.
+ harness_graph_multifunction_executor<InputType, OutputTuple>::current_executors = 0;
+ // Set the max allowed executors to lc. There is a check in the functor to make sure this is never exceeded.
+ harness_graph_multifunction_executor<InputType, OutputTuple>::max_executors = lc;
+
tbb::flow::multifunction_node< InputType, OutputTuple, tbb::flow::rejecting > exe_node( g, lc, body );
@@ -260,8 +268,8 @@ void concurrency_levels( size_t concurrency, Body body ) {
for (size_t num_senders = 1; num_senders <= MAX_NODES; ++num_senders ) {
{
- // lock m to prevent exe_node from finishing
- tbb::spin_mutex::scoped_lock l( harness_graph_multifunction_executor< InputType, OutputTuple, tbb::spin_mutex >::mutex );
+ // Exclusively lock m to prevent exe_node from finishing
+ tbb::spin_rw_mutex::scoped_lock l( harness_graph_multifunction_executor< InputType, OutputTuple>::template mutex_holder<tbb::spin_rw_mutex>::mutex );
// put to lc level, it will accept and then block at m
for ( size_t c = 0 ; c < lc ; ++c ) {
@@ -310,13 +318,12 @@ void concurrency_levels( size_t concurrency, Body body ) {
template< typename InputType, typename OutputTuple >
void run_concurrency_levels( int c ) {
- harness_graph_multifunction_executor<InputType, OutputTuple, tbb::spin_mutex>::max_executors = c;
- typedef typename tbb::flow::multifunction_node<InputType,OutputTuple>::output_ports_type output_ports_type;
#if __TBB_LAMBDAS_PRESENT
- concurrency_levels<InputType,OutputTuple>( c, []( InputType i, output_ports_type &p ) { harness_graph_multifunction_executor<InputType, OutputTuple, tbb::spin_mutex>::func(i,p); } );
+ typedef typename tbb::flow::multifunction_node<InputType,OutputTuple>::output_ports_type output_ports_type;
+ concurrency_levels<InputType,OutputTuple>( c, []( InputType i, output_ports_type &p ) { harness_graph_multifunction_executor<InputType, OutputTuple>::template tfunc<tbb::spin_rw_mutex>(i,p); } );
#endif
- concurrency_levels<InputType,OutputTuple>( c, &harness_graph_multifunction_executor<InputType, OutputTuple, tbb::spin_mutex>::func );
- concurrency_levels<InputType,OutputTuple>( c, typename harness_graph_multifunction_executor<InputType, OutputTuple, tbb::spin_mutex>::functor() );
+ concurrency_levels<InputType,OutputTuple>( c, &harness_graph_multifunction_executor<InputType, OutputTuple>::template tfunc<tbb::spin_rw_mutex> );
+ concurrency_levels<InputType,OutputTuple>( c, typename harness_graph_multifunction_executor<InputType, OutputTuple>::template tfunctor<tbb::spin_rw_mutex>() );
}
@@ -353,7 +360,7 @@ struct parallel_puts : private NoAssign {
template< typename InputType, typename OutputTuple, typename Body >
void unlimited_concurrency( Body body ) {
- typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type OutputType;
for (int p = 1; p < 2*MaxThread; ++p) {
tbb::flow::graph g;
@@ -384,9 +391,9 @@ void unlimited_concurrency( Body body ) {
template< typename InputType, typename OutputTuple >
void run_unlimited_concurrency() {
- typedef typename tbb::flow::multifunction_node<InputType,OutputTuple>::output_ports_type output_ports_type;
harness_graph_multifunction_executor<InputType, OutputTuple>::max_executors = 0;
#if __TBB_LAMBDAS_PRESENT
+ typedef typename tbb::flow::multifunction_node<InputType,OutputTuple>::output_ports_type output_ports_type;
unlimited_concurrency<InputType,OutputTuple>( []( InputType i, output_ports_type &p ) { harness_graph_multifunction_executor<InputType, OutputTuple>::func(i,p); } );
#endif
unlimited_concurrency<InputType,OutputTuple>( &harness_graph_multifunction_executor<InputType, OutputTuple>::func );
@@ -396,14 +403,14 @@ void run_unlimited_concurrency() {
template<typename InputType, typename OutputTuple>
struct oddEvenBody {
typedef typename tbb::flow::multifunction_node<InputType,OutputTuple>::output_ports_type output_ports_type;
- typedef typename std::tuple_element<0,OutputTuple>::type EvenType;
- typedef typename std::tuple_element<1,OutputTuple>::type OddType;
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type EvenType;
+ typedef typename tbb::flow::tuple_element<1,OutputTuple>::type OddType;
void operator() (const InputType &i, output_ports_type &p) {
if((int)i % 2) {
- (void)std::get<1>(p).try_put(OddType(i));
+ (void)tbb::flow::get<1>(p).try_put(OddType(i));
}
else {
- (void)std::get<0>(p).try_put(EvenType(i));
+ (void)tbb::flow::get<0>(p).try_put(EvenType(i));
}
}
};
@@ -411,8 +418,8 @@ struct oddEvenBody {
template<typename InputType, typename OutputTuple >
void run_multiport_test(int num_threads) {
typedef typename tbb::flow::multifunction_node<InputType, OutputTuple> mo_node_type;
- typedef typename std::tuple_element<0,OutputTuple>::type EvenType;
- typedef typename std::tuple_element<1,OutputTuple>::type OddType;
+ typedef typename tbb::flow::tuple_element<0,OutputTuple>::type EvenType;
+ typedef typename tbb::flow::tuple_element<1,OutputTuple>::type OddType;
tbb::task_scheduler_init init(num_threads);
tbb::flow::graph g;
mo_node_type mo_node(g, tbb::flow::unlimited, oddEvenBody<InputType, OutputTuple>() );
@@ -439,21 +446,20 @@ void run_multiport_test(int num_threads) {
//! Tests limited concurrency cases for nodes that accept data messages
void test_concurrency(int num_threads) {
tbb::task_scheduler_init init(num_threads);
- run_concurrency_levels<int,std::tuple<int> >(num_threads);
- run_concurrency_levels<int,std::tuple<tbb::flow::continue_msg> >(num_threads);
- run_buffered_levels<int, std::tuple<int> >(num_threads);
- run_unlimited_concurrency<int, std::tuple<int> >();
- run_unlimited_concurrency<int,std::tuple<empty_no_assign> >();
- run_unlimited_concurrency<empty_no_assign,std::tuple<int> >();
- run_unlimited_concurrency<empty_no_assign,std::tuple<empty_no_assign> >();
- run_unlimited_concurrency<int,std::tuple<tbb::flow::continue_msg> >();
- run_unlimited_concurrency<empty_no_assign,std::tuple<tbb::flow::continue_msg> >();
- run_multiport_test<int, std::tuple<int, int> >(num_threads);
- run_multiport_test<float, std::tuple<int, double> >(num_threads);
+ run_concurrency_levels<int,tbb::flow::tuple<int> >(num_threads);
+ run_concurrency_levels<int,tbb::flow::tuple<tbb::flow::continue_msg> >(num_threads);
+ run_buffered_levels<int, tbb::flow::tuple<int> >(num_threads);
+ run_unlimited_concurrency<int, tbb::flow::tuple<int> >();
+ run_unlimited_concurrency<int,tbb::flow::tuple<empty_no_assign> >();
+ run_unlimited_concurrency<empty_no_assign,tbb::flow::tuple<int> >();
+ run_unlimited_concurrency<empty_no_assign,tbb::flow::tuple<empty_no_assign> >();
+ run_unlimited_concurrency<int,tbb::flow::tuple<tbb::flow::continue_msg> >();
+ run_unlimited_concurrency<empty_no_assign,tbb::flow::tuple<tbb::flow::continue_msg> >();
+ run_multiport_test<int, tbb::flow::tuple<int, int> >(num_threads);
+ run_multiport_test<float, tbb::flow::tuple<int, double> >(num_threads);
}
int TestMain() {
- current_executors = 0;
if( MinThread<1 ) {
REPORT("number of threads must be positive\n");
exit(1);
@@ -463,8 +469,3 @@ int TestMain() {
}
return Harness::Done;
}
-#else // __SUNPRO_CC
-int TestMain() {
- return Harness::Skipped;
-}
-#endif // __SUNPRO_CC
diff --git a/src/test/test_mutex.cpp b/src/test/test_mutex.cpp
index cb3cc26..d35d9fe 100644
--- a/src/test/test_mutex.cpp
+++ b/src/test/test_mutex.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -35,6 +35,7 @@
//
// Compile with _OPENMP and -openmp
//------------------------------------------------------------------------
+#include "harness_defs.h"
#include "tbb/spin_mutex.h"
#include "tbb/critical_section.h"
#include "tbb/spin_rw_mutex.h"
@@ -200,11 +201,9 @@ struct Invariant {
M mutex;
const char* mutex_name;
volatile long value[N];
- volatile long single_value;
Invariant( const char* mutex_name_ ) :
mutex_name(mutex_name_)
{
- single_value = 0;
for( size_t k=0; k<N; ++k )
value[k] = 0;
tbb::profiling::set_name(mutex, mutex_name_);
diff --git a/src/test/test_mutex_native_threads.cpp b/src/test/test_mutex_native_threads.cpp
index c198383..9555c7d 100644
--- a/src/test/test_mutex_native_threads.cpp
+++ b/src/test/test_mutex_native_threads.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -69,11 +69,9 @@ struct Invariant {
M mutex;
const char* mutex_name;
volatile long value[N];
- volatile long single_value;
Invariant( const char* mutex_name_ ) :
mutex_name(mutex_name_)
{
- single_value = 0;
for( long k=0; k<N; ++k )
value[k] = 0;
}
diff --git a/src/test/test_openmp.cpp b/src/test/test_openmp.cpp
index 531c1f3..d58c879 100644
--- a/src/test/test_openmp.cpp
+++ b/src/test/test_openmp.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -29,7 +29,7 @@
// Test mixing OpenMP and TBB
/* SCR #471
- Bellow is workaround to compile test within enviroment of Intel Compiler
+ Below is workaround to compile test within enviroment of Intel Compiler
but by Microsoft Compiler. So, there is wrong "omp.h" file included and
manifest section is missed from .exe file - restoring here.
diff --git a/src/test/test_or_node.cpp b/src/test/test_or_node.cpp
index 76406bb..2ff8ddb 100644
--- a/src/test/test_or_node.cpp
+++ b/src/test/test_or_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,7 +30,6 @@
#define TBB_PREVIEW_GRAPH_NODES 1
#include "tbb/flow_graph.h"
-#if !__SUNPRO_CC
//
// Tests
//
@@ -142,7 +141,7 @@ struct getval_helper {
typedef typename ONT::output_type OT;
static int get_integer_val(OT &o) {
- return int(std::get<ELEM-1>(o.result));
+ return int(tbb::flow::get<ELEM-1>(o.result));
}
};
@@ -155,7 +154,7 @@ class source_node_helper {
public:
typedef ONT or_node_type;
typedef typename or_node_type::output_type TT;
- typedef typename std::tuple_element<ELEM-1,typename ONT::tuple_types>::type IT;
+ typedef typename tbb::flow::tuple_element<ELEM-1,typename ONT::tuple_types>::type IT;
typedef typename tbb::flow::source_node<IT> my_source_node_type;
static void print_remark() {
source_node_helper<ELEM-1,ONT>::print_remark();
@@ -197,7 +196,7 @@ template<typename ONT>
class source_node_helper<1, ONT> {
typedef ONT or_node_type;
typedef typename or_node_type::output_type TT;
- typedef typename std::tuple_element<0, typename ONT::tuple_types>::type IT;
+ typedef typename tbb::flow::tuple_element<0, typename ONT::tuple_types>::type IT;
typedef typename tbb::flow::source_node<IT> my_source_node_type;
public:
static void print_remark() {
@@ -231,7 +230,7 @@ class parallel_test {
public:
typedef typename OType::output_type TType;
typedef typename OType::tuple_types union_types;
- static const int SIZE = std::tuple_size<union_types>::value;
+ static const int SIZE = tbb::flow::tuple_size<union_types>::value;
static void test() {
TType v;
source_node_helper<SIZE,OType>::print_remark();
@@ -287,7 +286,7 @@ class serial_queue_helper {
public:
typedef typename OType::output_type OT;
typedef typename OType::tuple_types TT;
- typedef typename std::tuple_element<ELEM-1,TT>::type IT;
+ typedef typename tbb::flow::tuple_element<ELEM-1,TT>::type IT;
static void print_remark() {
serial_queue_helper<ELEM-1,OType>::print_remark();
REMARK(", %s", name_of<IT>::name());
@@ -322,7 +321,7 @@ class serial_queue_helper<1, OType> {
public:
typedef typename OType::output_type OT;
typedef typename OType::tuple_types TT;
- typedef typename std::tuple_element<0,TT>::type IT;
+ typedef typename tbb::flow::tuple_element<0,TT>::type IT;
static void print_remark() {
REMARK("Serial test of or_node< %s", name_of<IT>::name());
}
@@ -392,7 +391,7 @@ template<typename OType>
class serial_test {
typedef typename OType::output_type TType; // this is the union
typedef typename OType::tuple_types union_types;
- static const int SIZE = std::tuple_size<union_types>::value;
+ static const int SIZE = tbb::flow::tuple_size<union_types>::value;
public:
static void test() {
tbb::flow::graph g;
@@ -434,25 +433,32 @@ int TestMain() {
#endif
for (int p = 0; p < 2; ++p) {
- generate_test<serial_test, std::tuple<float, test_class> >::do_test();
- generate_test<serial_test, std::tuple<float, double, int, long> >::do_test();
- generate_test<serial_test, std::tuple<double, double, int, long, int, short> >::do_test();
-#if COMPREHENSIVE_TEST
- generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long> >::do_test();
- generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long> >::do_test();
+ generate_test<serial_test, tbb::flow::tuple<float, test_class> >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 4
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, long> >::do_test();
#endif
- generate_test<parallel_test, std::tuple<float, double> >::do_test();
- generate_test<parallel_test, std::tuple<float, int, long> >::do_test();
- generate_test<parallel_test, std::tuple<double, double, int, int, short> >::do_test();
-#if COMPREHENSIVE_TEST
- generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long> >::do_test();
- generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long> >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 6
+ generate_test<serial_test, tbb::flow::tuple<double, double, int, long, int, short> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 8
+ generate_test<serial_test, tbb::flow::tuple<float, double, double, double, float, int, float, long> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 10
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, double, double, float, long, int, float, long> >::do_test();
+#endif
+ generate_test<parallel_test, tbb::flow::tuple<float, double> >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 3
+ generate_test<parallel_test, tbb::flow::tuple<float, int, long> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 5
+ generate_test<parallel_test, tbb::flow::tuple<double, double, int, int, short> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 7
+ generate_test<parallel_test, tbb::flow::tuple<float, int, double, float, long, float, long> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 9
+ generate_test<parallel_test, tbb::flow::tuple<float, double, int, double, double, long, int, float, long> >::do_test();
#endif
}
return Harness::Done;
}
-#else // __SUNPRO_CC
-int TestMain() {
- return Harness::Skipped;
-}
-#endif // __SUNPRO_CC
diff --git a/src/test/test_overwrite_node.cpp b/src/test/test_overwrite_node.cpp
index 4227979..d6ad601 100644
--- a/src/test/test_overwrite_node.cpp
+++ b/src/test/test_overwrite_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_parallel_do.cpp b/src/test/test_parallel_do.cpp
index fa7c4bf..9bf9253 100644
--- a/src/test/test_parallel_do.cpp
+++ b/src/test/test_parallel_do.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -119,7 +119,7 @@ private:
TaskGeneratorBody ( const TaskGeneratorBody& );
// TestBody() needs access to the default constructor
template<class Body, class Iterator> friend void TestBody( size_t );
-}; // class TaskGeneratorBody
+};
/** Work item is passed by reference here. **/
class TaskGeneratorBody_RefVersion
@@ -128,7 +128,7 @@ public:
void operator() ( value_t& depth, tbb::parallel_do_feeder<value_t>& feeder ) const {
do_work(depth, feeder);
}
-}; // class TaskGeneratorBody
+};
/** Work item is passed as const here. Compilers must ignore the const qualifier. **/
class TaskGeneratorBody_ConstVersion
@@ -137,7 +137,7 @@ public:
void operator() ( const value_t depth, tbb::parallel_do_feeder<value_t>& feeder ) const {
do_work(depth, feeder);
}
-}; // class TaskGeneratorBody
+};
/** Work item is passed by reference to const here. **/
class TaskGeneratorBody_ConstRefVersion
@@ -146,7 +146,7 @@ public:
void operator() ( const value_t& depth, tbb::parallel_do_feeder<value_t>& feeder ) const {
do_work(depth, feeder);
}
-}; // class TaskGeneratorBody
+};
/** Work item is passed by reference to volatile here. **/
class TaskGeneratorBody_VolatileRefVersion
@@ -155,16 +155,16 @@ public:
void operator() ( volatile value_t& depth, tbb::parallel_do_feeder<value_t>& feeder ) const {
do_work(const_cast<value_t&>(depth), feeder);
}
-}; // class TaskGeneratorBody
+};
-/** Work item is passed by reference to volatile here. **/
+/** Work item is passed by reference to const volatile here. **/
class TaskGeneratorBody_ConstVolatileRefVersion
{
public:
void operator() ( const volatile value_t& depth, tbb::parallel_do_feeder<value_t>& feeder ) const {
do_work(const_cast<value_t&>(depth), feeder);
}
-}; // class TaskGeneratorBody
+};
static value_t g_depths[N_DEPTHS] = {0, 1, 2, 3, 4, 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 0, 1, 2};
@@ -183,7 +183,6 @@ void TestBody ( size_t depth ) {
template<class Iterator>
void TestIterator_RvalueOnly ( int /*nthread*/, size_t depth ) {
- g_values_counter = 0;
TestBody<FakeTaskGeneratorBody, Iterator> (depth);
TestBody<FakeTaskGeneratorBody_ConstRefVersion, Iterator> (depth);
TestBody<TaskGeneratorBody, Iterator> (depth);
@@ -224,6 +223,7 @@ int TestMain () {
REPORT("number of threads must be positive\n");
exit(1);
}
+ g_values_counter = 0;
for( int p=MinThread; p<=MaxThread; ++p ) {
tbb::task_scheduler_init init( p );
Run(p);
diff --git a/src/test/test_parallel_for.cpp b/src/test/test_parallel_for.cpp
index 9605408..7c70227 100644
--- a/src/test/test_parallel_for.cpp
+++ b/src/test/test_parallel_for.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -45,6 +45,7 @@
#define _SCL_SECURE_NO_WARNINGS
#endif //#if _MSC_VER
+#include "harness_defs.h"
#include "tbb/parallel_for.h"
#include "tbb/atomic.h"
#include "harness_assert.h"
@@ -115,65 +116,82 @@ static tbb::atomic<int> Array[N];
struct serial_tag {};
struct parallel_tag {};
+struct empty_partitioner_tag {};
-template <typename Flavor, typename Range, typename Body>
+template <typename Flavor, typename Partitioner, typename Range, typename Body>
struct Invoker;
template <typename Range, typename Body>
-struct Invoker<serial_tag, Range, Body> {
- void operator()( const Range& r, const Body& body, const tbb::simple_partitioner& p ) {
- tbb::serial:: parallel_for( r, body, p );
- }
- void operator()( const Range& r, const Body& body, const tbb::auto_partitioner& p ) {
- tbb::serial:: parallel_for( r, body, p );
+struct Invoker<serial_tag, empty_partitioner_tag, Range, Body> {
+ void operator()( const Range& r, const Body& body, empty_partitioner_tag& ) {
+ tbb::serial:: parallel_for( r, body );
}
- void operator()( const Range& r, const Body& body, tbb::affinity_partitioner& p ) {
+};
+
+template <typename Partitioner, typename Range, typename Body>
+struct Invoker<serial_tag, Partitioner, Range, Body> {
+ void operator()( const Range& r, const Body& body, Partitioner& p ) {
tbb::serial:: parallel_for( r, body, p );
}
- void operator()( const Range& r, const Body& body ) {
- tbb::serial:: parallel_for( r, body, tbb::auto_partitioner() );
- }
};
template <typename Range, typename Body>
-struct Invoker<parallel_tag, Range, Body> {
- void operator()( const Range& r, const Body& body, const tbb::simple_partitioner& p ) {
- tbb:: parallel_for( r, body, p );
- }
- void operator()( const Range& r, const Body& body, const tbb::auto_partitioner& p ) {
- tbb:: parallel_for( r, body, p );
+struct Invoker<parallel_tag, empty_partitioner_tag, Range, Body> {
+ void operator()( const Range& r, const Body& body, empty_partitioner_tag& ) {
+ tbb:: parallel_for( r, body );
}
- void operator()( const Range& r, const Body& body, tbb::affinity_partitioner& p ) {
+};
+
+template <typename Partitioner, typename Range, typename Body>
+struct Invoker<parallel_tag, Partitioner, Range, Body> {
+ void operator()( const Range& r, const Body& body, Partitioner& p ) {
tbb:: parallel_for( r, body, p );
}
- void operator()( const Range& r, const Body& body ) {
- tbb:: parallel_for( r, body, tbb::auto_partitioner() );
- }
};
-template <typename Flavor, typename T, typename Body>
+template <typename Flavor, typename Partitioner, typename T, typename Body>
struct InvokerStep;
template <typename T, typename Body>
-struct InvokerStep<serial_tag, T, Body> {
- void operator()( const T& first, const T& last, const Body& f ) {
+struct InvokerStep<serial_tag, empty_partitioner_tag, T, Body> {
+ void operator()( const T& first, const T& last, const Body& f, empty_partitioner_tag& ) {
tbb::serial:: parallel_for( first, last, f );
}
- void operator()( const T& first, const T& last, const T& step, const Body& f ) {
+ void operator()( const T& first, const T& last, const T& step, const Body& f, empty_partitioner_tag& ) {
tbb::serial:: parallel_for( first, last, step, f );
}
};
+template <typename Partitioner, typename T, typename Body>
+struct InvokerStep<serial_tag, Partitioner, T, Body> {
+ void operator()( const T& first, const T& last, const Body& f, Partitioner& p ) {
+ tbb::serial:: parallel_for( first, last, f, p);
+ }
+ void operator()( const T& first, const T& last, const T& step, const Body& f, Partitioner& p ) {
+ tbb::serial:: parallel_for( first, last, step, f, p );
+ }
+};
+
template <typename T, typename Body>
-struct InvokerStep<parallel_tag, T, Body> {
- void operator()( const T& first, const T& last, const Body& f ) {
+struct InvokerStep<parallel_tag, empty_partitioner_tag, T, Body> {
+ void operator()( const T& first, const T& last, const Body& f, empty_partitioner_tag& ) {
tbb:: parallel_for( first, last, f );
}
- void operator()( const T& first, const T& last, const T& step, const Body& f ) {
+ void operator()( const T& first, const T& last, const T& step, const Body& f, empty_partitioner_tag& ) {
tbb:: parallel_for( first, last, step, f );
}
};
+template <typename Partitioner, typename T, typename Body>
+struct InvokerStep<parallel_tag, Partitioner, T, Body> {
+ void operator()( const T& first, const T& last, const Body& f, Partitioner& p ) {
+ tbb:: parallel_for( first, last, f, p );
+ }
+ void operator()( const T& first, const T& last, const T& step, const Body& f, Partitioner& p ) {
+ tbb:: parallel_for( first, last, step, f, p );
+ }
+};
+
template<typename Flavor, size_t Pad>
void Flog( int nthread ) {
tbb::tick_count T0 = tbb::tick_count::now();
@@ -185,21 +203,28 @@ void Flog( int nthread ) {
const FooBody<Pad> fc = f;
memset( Array, 0, sizeof(Array) );
FooBodyCount = 1;
- Invoker< Flavor, FooRange<Pad>, FooBody<Pad> > invoke_for;
switch (mode) {
- case 0:
- invoke_for( rc, fc );
+ case 0: {
+ empty_partitioner_tag p;
+ Invoker< Flavor, empty_partitioner_tag, FooRange<Pad>, FooBody<Pad> > invoke_for;
+ invoke_for( rc, fc, p );
+ }
break;
- case 1:
- invoke_for( rc, fc, tbb::simple_partitioner() );
+ case 1: {
+ Invoker< Flavor, const tbb::simple_partitioner, FooRange<Pad>, FooBody<Pad> > invoke_for;
+ invoke_for( rc, fc, tbb::simple_partitioner() );
+ }
break;
- case 2:
- invoke_for( rc, fc, tbb::auto_partitioner() );
+ case 2: {
+ Invoker< Flavor, const tbb::auto_partitioner, FooRange<Pad>, FooBody<Pad> > invoke_for;
+ invoke_for( rc, fc, tbb::auto_partitioner() );
+ }
break;
- case 3: {
- static tbb::affinity_partitioner affinity;
- invoke_for( rc, fc, affinity );
- }
+ case 3: {
+ static tbb::affinity_partitioner affinity;
+ Invoker< Flavor, tbb::affinity_partitioner, FooRange<Pad>, FooBody<Pad> > invoke_for;
+ invoke_for( rc, fc, affinity );
+ }
break;
}
for( int j=0; j<i; ++j )
@@ -239,21 +264,21 @@ public:
#pragma warning (pop)
#endif
-template <typename Flavor, typename T>
-void TestParallelForWithStepSupport()
+template <typename Flavor, typename T, typename Partitioner>
+void TestParallelForWithStepSupportHelper(Partitioner& p)
{
const T pfor_buffer_test_size = static_cast<T>(PFOR_BUFFER_TEST_SIZE);
const T pfor_buffer_actual_size = static_cast<T>(PFOR_BUFFER_ACTUAL_SIZE);
// Testing parallel_for with different step values
- InvokerStep< Flavor, T, TestFunctor<T> > invoke_for;
+ InvokerStep< Flavor, Partitioner, T, TestFunctor<T> > invoke_for;
for (T begin = 0; begin < pfor_buffer_test_size - 1; begin += pfor_buffer_test_size / 10 + 1) {
T step;
for (step = 1; step < pfor_buffer_test_size; step++) {
memset(pfor_buffer, 0, pfor_buffer_actual_size * sizeof(size_t));
if (step == 1){
- invoke_for(begin, pfor_buffer_test_size, TestFunctor<T>());
+ invoke_for(begin, pfor_buffer_test_size, TestFunctor<T>(), p);
} else {
- invoke_for(begin, pfor_buffer_test_size, step, TestFunctor<T>());
+ invoke_for(begin, pfor_buffer_test_size, step, TestFunctor<T>(), p);
}
// Verifying that parallel_for processed all items it should
for (T i = begin; i < pfor_buffer_test_size; i = i + step) {
@@ -266,6 +291,21 @@ void TestParallelForWithStepSupport()
}
}
}
+}
+
+template <typename Flavor, typename T>
+void TestParallelForWithStepSupport()
+{
+ static tbb::affinity_partitioner affinity_p;
+ tbb::auto_partitioner auto_p;
+ tbb::simple_partitioner simple_p;
+ empty_partitioner_tag p;
+
+ // Try out all partitioner combinations
+ TestParallelForWithStepSupportHelper< Flavor,T,empty_partitioner_tag >(p);
+ TestParallelForWithStepSupportHelper< Flavor,T,const tbb::auto_partitioner >(auto_p);
+ TestParallelForWithStepSupportHelper< Flavor,T,const tbb::simple_partitioner >(simple_p);
+ TestParallelForWithStepSupportHelper< Flavor,T,tbb::affinity_partitioner >(affinity_p);
// Testing some corner cases
tbb::parallel_for(static_cast<T>(2), static_cast<T>(1), static_cast<T>(1), TestFunctor<T>());
diff --git a/src/test/test_parallel_for_each.cpp b/src/test/test_parallel_for_each.cpp
index 8cdb52e..3ef17da 100644
--- a/src/test/test_parallel_for_each.cpp
+++ b/src/test/test_parallel_for_each.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_parallel_invoke.cpp b/src/test/test_parallel_invoke.cpp
index 12a3616..1427587 100644
--- a/src/test/test_parallel_invoke.cpp
+++ b/src/test/test_parallel_invoke.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_parallel_pipeline.cpp b/src/test/test_parallel_pipeline.cpp
index 6713148..9a2cb77 100644
--- a/src/test/test_parallel_pipeline.cpp
+++ b/src/test/test_parallel_pipeline.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -37,6 +37,7 @@ int filter_node_count = 0;
#include <string.h>
#include "tbb/tbb_allocator.h"
+#include "tbb/spin_mutex.h"
const unsigned n_tokens = 8;
// we can conceivably have two buffers used in the middle filter for every token in flight, so
@@ -50,20 +51,20 @@ static tbb::atomic<int> non_pointer_specialized_calls;
static tbb::atomic<int> pointer_specialized_calls;
static tbb::atomic<int> first_pointer_specialized_calls;
static tbb::atomic<int> second_pointer_specialized_calls;
+static tbb::spin_mutex buffer_mutex;
static int intbuffer[max_counter]; // store results for <int,int> parallel pipeline test
static bool check_intbuffer;
static void* buffers[n_buffers];
static bool buf_available[n_buffers];
-static tbb::atomic<size_t> nextBuffer;
void *fetchNextBuffer() {
+ tbb::spin_mutex::scoped_lock sl1(buffer_mutex);
for(size_t icnt = 0; icnt < n_buffers; ++icnt) {
- size_t indx = ++nextBuffer;
- if(buf_available[indx%n_buffers]) {
- buf_available[indx%n_buffers] = false;
- return buffers[indx%n_buffers];
+ if(buf_available[icnt]) {
+ buf_available[icnt] = false;
+ return buffers[icnt];
}
}
ASSERT(0, "Ran out of buffers");
@@ -350,7 +351,6 @@ typedef enum {
void resetCounters() {
output_counter = 0;
input_counter = max_counter;
- nextBuffer = 0;
non_pointer_specialized_calls = 0;
pointer_specialized_calls = 0;
first_pointer_specialized_calls = 0;
diff --git a/src/test/test_parallel_reduce.cpp b/src/test/test_parallel_reduce.cpp
index 854d59f..d450afc 100644
--- a/src/test/test_parallel_reduce.cpp
+++ b/src/test/test_parallel_reduce.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,7 +26,6 @@
the GNU General Public License.
*/
-#define TBB_PREVIEW_DETERMINISTIC_REDUCE 1
#include "tbb/parallel_reduce.h"
#include "tbb/atomic.h"
#include "harness_assert.h"
diff --git a/src/test/test_parallel_scan.cpp b/src/test/test_parallel_scan.cpp
index cd0d880..e5da340 100644
--- a/src/test/test_parallel_scan.cpp
+++ b/src/test/test_parallel_scan.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_parallel_sort.cpp b/src/test/test_parallel_sort.cpp
index 709bb02..601a28b 100644
--- a/src/test/test_parallel_sort.cpp
+++ b/src/test/test_parallel_sort.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+#include "harness_defs.h"
#include "tbb/parallel_sort.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/concurrent_vector.h"
diff --git a/src/test/test_parallel_while.cpp b/src/test/test_parallel_while.cpp
index 1fe5790..e768599 100644
--- a/src/test/test_parallel_while.cpp
+++ b/src/test/test_parallel_while.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_pipeline.cpp b/src/test/test_pipeline.cpp
index 974d490..3f19bc1 100644
--- a/src/test/test_pipeline.cpp
+++ b/src/test/test_pipeline.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -173,7 +173,7 @@ struct hacked_pipeline {
//! The struct below repeats layout of tbb::internal::input_buffer.
struct hacked_input_buffer {
void* array; // This should be changed to task_info* if ever used
- void* my_sem; // This should be changed to semaphore* if ever used
+ void* my_sem; // This should be changed to semaphore* if ever used
tbb::internal::Token array_size;
tbb::internal::Token low_token;
tbb::spin_mutex array_mutex;
diff --git a/src/test/test_pipeline_with_tbf.cpp b/src/test/test_pipeline_with_tbf.cpp
index 3e45cc3..c4653d4 100644
--- a/src/test/test_pipeline_with_tbf.cpp
+++ b/src/test/test_pipeline_with_tbf.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_priority_queue_node.cpp b/src/test/test_priority_queue_node.cpp
index 999a965..2efecf8 100644
--- a/src/test/test_priority_queue_node.cpp
+++ b/src/test/test_priority_queue_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_queue_node.cpp b/src/test/test_queue_node.cpp
index 058232a..0f293cb 100644
--- a/src/test/test_queue_node.cpp
+++ b/src/test/test_queue_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_reader_writer_lock.cpp b/src/test/test_reader_writer_lock.cpp
index bb5e002..553b9b7 100644
--- a/src/test/test_reader_writer_lock.cpp
+++ b/src/test/test_reader_writer_lock.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -30,14 +30,15 @@
#include "tbb/reader_writer_lock.h"
#include "tbb/atomic.h"
#include "tbb/tbb_exception.h"
-#include "harness_assert.h"
#include "harness.h"
+#include "harness_barrier.h"
tbb::reader_writer_lock the_mutex;
const int MAX_WORK = 10000;
tbb::atomic<size_t> active_readers, active_writers;
tbb::atomic<bool> sim_readers;
+size_t n_tested__sim_readers;
int BusyWork(int percentOfMaxWork) {
@@ -119,10 +120,12 @@ struct StressRWLBody : NoAssign {
struct CorrectRWLScopedBody : NoAssign {
const int nThread;
+ Harness::SpinBarrier& my_barrier;
- CorrectRWLScopedBody(int nThread_) : nThread(nThread_) {}
+ CorrectRWLScopedBody(int nThread_, Harness::SpinBarrier& b_) : nThread(nThread_),my_barrier(b_) {}
void operator()(const int /* threadID */ ) const {
+ my_barrier.wait();
for (int i=0; i<50; i++) {
const bool is_reader = i%5==0; // 1 writer for every 4 readers
@@ -148,10 +151,12 @@ struct CorrectRWLScopedBody : NoAssign {
struct CorrectRWLBody : NoAssign {
const int nThread;
+ Harness::SpinBarrier& my_barrier;
- CorrectRWLBody(int nThread_) : nThread(nThread_) {}
+ CorrectRWLBody(int nThread_, Harness::SpinBarrier& b_ ) : nThread(nThread_), my_barrier(b_) {}
void operator()(const int /* threadID */ ) const {
+ my_barrier.wait();
for (int i=0; i<50; i++) {
const bool is_reader = i%5==0; // 1 writer for every 4 readers
@@ -188,20 +193,40 @@ void TestReaderWriterLockOnNThreads(int nThreads) {
REMARK(" OK.\n");
}
+ int i;
+ n_tested__sim_readers = 0;
REMARK("Testing with %d threads, direct/unscoped locking mode...", nThreads); // TODO: choose direct or unscoped?
- CorrectRWLBody myCorrectBody(nThreads);
- active_writers = active_readers = 0;
- sim_readers = false;
- NativeParallelFor(nThreads, myCorrectBody);
- ASSERT(sim_readers || nThreads<2, "There were no simultaneous readers.");
+ // TODO: refactor the following two for loops into a shared function
+ for( i=0; i<100; ++i ) {
+ Harness::SpinBarrier bar0(nThreads);
+
+ CorrectRWLBody myCorrectBody(nThreads,bar0);
+ active_writers = active_readers = 0;
+ sim_readers = false;
+ NativeParallelFor(nThreads, myCorrectBody);
+
+ if( sim_readers || nThreads==1 ) {
+ if( ++n_tested__sim_readers>5 )
+ break;
+ }
+ }
+ ASSERT(i<100, "There were no simultaneous readers.");
REMARK(" OK.\n");
+ n_tested__sim_readers = 0;
REMARK("Testing with %d threads, scoped locking mode...", nThreads);
- CorrectRWLScopedBody myCorrectScopedBody(nThreads);
- active_writers = active_readers = 0;
- sim_readers = false;
- NativeParallelFor(nThreads, myCorrectScopedBody);
- ASSERT(sim_readers || nThreads<2, "There were no simultaneous readers.");
+ for( i=0; i<100; ++i ) {
+ Harness::SpinBarrier bar0(nThreads);
+ CorrectRWLScopedBody myCorrectScopedBody(nThreads, bar0);
+ active_writers = active_readers = 0;
+ sim_readers = false;
+ NativeParallelFor(nThreads, myCorrectScopedBody);
+ if( sim_readers || nThreads==1 ) {
+ if( ++n_tested__sim_readers>5 )
+ break;
+ }
+ }
+ ASSERT(i<100, "There were no simultaneous readers.");
REMARK(" OK.\n");
}
diff --git a/src/test/test_runtime_loader.cpp b/src/test/test_runtime_loader.cpp
index 8b1c61d..55dbd5d 100644
--- a/src/test/test_runtime_loader.cpp
+++ b/src/test/test_runtime_loader.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,7 +26,13 @@
the GNU General Public License.
*/
-#if !(_WIN32||_WIN64)
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+ #pragma warning (push)
+ #pragma warning (disable: 4530)
+#endif
+
+#if !(_WIN32||_WIN64) || (__MINGW64__||__MINGW32__)
#include "harness.h"
@@ -45,27 +51,21 @@ int TestMain () {
#include <cstdio>
#include <cstdlib>
#include <cerrno>
-
-#if !TBB_USE_EXCEPTIONS && _MSC_VER
- // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
- #pragma warning (push)
- #pragma warning (disable: 4530)
-#endif
-
#include <vector>
#include <string>
#include <utility>
#include <typeinfo>
-
-#if !TBB_USE_EXCEPTIONS && _MSC_VER
- #pragma warning (pop)
-#endif
+#include <stdexcept>
#ifdef HARNESS_USE_RUNTIME_LOADER
#undef HARNESS_USE_RUNTIME_LOADER // We do not want harness to preload tbb.
#endif
#include "harness.h"
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
static int errors = 0;
#define CHECK( cond ) { \
diff --git a/src/test/test_rwm_upgrade_downgrade.cpp b/src/test/test_rwm_upgrade_downgrade.cpp
index 4525fe1..221381b 100644
--- a/src/test/test_rwm_upgrade_downgrade.cpp
+++ b/src/test/test_rwm_upgrade_downgrade.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_semaphore.cpp b/src/test/test_semaphore.cpp
index 5cb520b..2b8da9e 100644
--- a/src/test/test_semaphore.cpp
+++ b/src/test/test_semaphore.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -105,7 +105,7 @@ void testSemaphore( int semInitCnt, int extraThreads ) {
REMARK( " sem(%d) with %d extra threads\n", semInitCnt, extraThreads);
pCount = 0;
NativeParallelFor(nThreads, myBody);
- if(extraThreads == 0) {
+ if(extraThreads == 0) {
double allPWaits = 0;
for(vector<double>::const_iterator j = totTimes.begin(); j != totTimes.end(); ++j) {
allPWaits += *j;
@@ -127,8 +127,32 @@ void testSemaphore( int semInitCnt, int extraThreads ) {
#include "../tbb/semaphore.cpp"
#if _WIN32||_WIN64
#include "../tbb/dynamic_link.cpp"
+
+void testOSVersion() {
+#if __TBB_USE_SRWLOCK
+ BOOL bIsWindowsVistaOrLater;
+#if __TBB_WIN8UI_SUPPORT
+ bIsWindowsVistaOrLater = true;
+#else
+ OSVERSIONINFO osvi;
+
+ memset( (void*)&osvi, 0, sizeof(OSVERSIONINFO) );
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&osvi);
+ bIsWindowsVistaOrLater = (osvi.dwMajorVersion >= 6 );
#endif
+ if( bIsWindowsVistaOrLater ) {
+ REMARK("Checking SRWLock is loaded\n");
+ tbb::internal::binary_semaphore s;
+ ASSERT( (uintptr_t)tbb::internal::__TBB_init_binsem!=(uintptr_t)&tbb::internal::init_binsem_using_event, NULL );
+ ASSERT( (uintptr_t)tbb::internal::__TBB_acquire_binsem!=(uintptr_t)&tbb::internal::acquire_binsem_using_event, NULL );
+ ASSERT( (uintptr_t)tbb::internal::__TBB_release_binsem!=(uintptr_t)&tbb::internal::release_binsem_using_event, NULL );
+ }
+#endif /* __TBB_USE_SRWLOCK */
+}
+#endif /* _WIN32||_WIN64 */
+
#define N_TIMES 1000
template<typename S>
@@ -140,7 +164,7 @@ struct Counter {
//! Function object for use with parallel_for.h.
template<typename C>
-struct AddOne: NoAssign {
+struct AddOne: NoAssign {
C& my_counter;
/** Increments counter once for each iteration in the iteration space. */
void operator()( int /*tid*/ ) const {
@@ -178,15 +202,15 @@ protected:
unsigned curToken;
public:
FilterBase( FilterType ima_
- ,unsigned totTokens_
- ,tbb::atomic<unsigned>& myTokens_
+ ,unsigned totTokens_
+ ,tbb::atomic<unsigned>& myTokens_
,tbb::atomic<unsigned>& otherTokens_
,unsigned myWait_
- ,semaphore &mySem_
+ ,semaphore &mySem_
,semaphore &nextSem_
,unsigned* myBuffer_
,unsigned* nextBuffer_
- )
+ )
: ima(ima_),totTokens(totTokens_),myTokens(myTokens_),otherTokens(otherTokens_),myWait(myWait_),mySem(mySem_),
nextSem(nextSem_),myBuffer(myBuffer_),nextBuffer(nextBuffer_)
{
@@ -211,19 +235,19 @@ void FilterBase::Produce(const int /*tid*/) {
nextBuffer[0] = 0; // just in case we provide no tokens
sBarrier.wait();
while(totTokens) {
- while(!myTokens)
+ while(!myTokens)
mySem.P();
// we have a slot available.
--myTokens; // moving this down reduces spurious wakeups
--totTokens;
- if(totTokens)
+ if(totTokens)
nextBuffer[curToken&(MAX_TOKENS-1)] = curToken*3+1;
else
nextBuffer[curToken&(MAX_TOKENS-1)] = (unsigned)NULL;
++curToken;
Harness::Sleep(myWait);
unsigned temp = ++otherTokens;
- if(temp == 1)
+ if(temp == 1)
nextSem.V();
}
nextSem.V(); // final wakeup
@@ -233,7 +257,7 @@ void FilterBase::Consume(const int /*tid*/) {
unsigned myToken;
sBarrier.wait();
do {
- while(!myTokens)
+ while(!myTokens)
mySem.P();
// we have a slot available.
--myTokens; // moving this down reduces spurious wakeups
@@ -243,7 +267,7 @@ void FilterBase::Consume(const int /*tid*/) {
++curToken;
Harness::Sleep(myWait);
unsigned temp = ++otherTokens;
- if(temp == 1)
+ if(temp == 1)
nextSem.V();
}
} while(myToken);
@@ -277,6 +301,9 @@ void testProducerConsumer( unsigned totTokens, unsigned nTokens, unsigned pWait,
int TestMain() {
REMARK("Started\n");
+#if _WIN32||_WIN64
+ testOSVersion();
+#endif
if(MaxThread > 0) {
testBinarySemaphore( MaxThread );
for(int semSize = 1; semSize <= MaxThread; ++semSize) {
diff --git a/src/test/test_sequencer_node.cpp b/src/test/test_sequencer_node.cpp
index 8444d32..c4f0980 100644
--- a/src/test/test_sequencer_node.cpp
+++ b/src/test/test_sequencer_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_source_node.cpp b/src/test/test_source_node.cpp
index b9c0b1b..01c8767 100644
--- a/src/test/test_source_node.cpp
+++ b/src/test/test_source_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,8 +26,9 @@
the GNU General Public License.
*/
-#include "harness_graph.h"
-
+#include "harness.h"
+#include "tbb/flow_graph.h"
+#include "tbb/task.h"
#include "tbb/task_scheduler_init.h"
const int N = 1000;
@@ -49,12 +50,13 @@ public:
return v;
}
- bool try_put( const T &v ) {
+ tbb::task *try_put_task( const T &v ) {
int i = (int)v;
++my_counters[i];
- return true;
+ return const_cast<tbb::task *>(tbb::flow::interface6::SUCCESSFULLY_ENQUEUED);
}
+ /*override*/void reset_receiver() {}
};
template< typename T >
@@ -90,7 +92,7 @@ public:
bool operator()( T v ) {
++my_counters[(int)v];
- return true;
+ return true;
}
};
diff --git a/src/test/test_split_node.cpp b/src/test/test_split_node.cpp
index e7853c6..336fe46 100644
--- a/src/test/test_split_node.cpp
+++ b/src/test/test_split_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,17 +26,11 @@
the GNU General Public License.
*/
-#if _MSC_VER
-#pragma warning (disable : 4503) // decorated name length exceeded, name was truncated
-#endif
-
#include "harness.h"
#define TBB_PREVIEW_GRAPH_NODES 1
#include "tbb/flow_graph.h"
#include "tbb/task_scheduler_init.h"
-#if !__SUNPRO_CC
-
//
// Tests
//
@@ -89,7 +83,7 @@ template<int N>
struct tuple_helper {
template<typename TupleType>
static void set_element( TupleType &t, int i) {
- std::get<N-1>(t) = (typename std::tuple_element<N-1,TupleType>::type)(i * (N+1));
+ tbb::flow::get<N-1>(t) = (typename tbb::flow::tuple_element<N-1,TupleType>::type)(i * (N+1));
tuple_helper<N-1>::set_element(t, i);
}
};
@@ -98,7 +92,7 @@ template<>
struct tuple_helper<1> {
template<typename TupleType>
static void set_element(TupleType &t, int i) {
- std::get<0>(t) = (typename std::tuple_element<0,TupleType>::type)(i * 2);
+ tbb::flow::get<0>(t) = (typename tbb::flow::tuple_element<0,TupleType>::type)(i * 2);
}
};
@@ -107,7 +101,7 @@ struct tuple_helper<1> {
template<typename TupleType>
class source_body {
typedef TupleType TT;
- static const int N = std::tuple_size<TT>::value;
+ static const int N = tbb::flow::tuple_size<TT>::value;
int my_count;
const int addend;
source_body& operator=( const source_body& other);
@@ -142,7 +136,7 @@ template<int ELEM, typename SType>
class sink_node_helper {
public:
typedef typename SType::input_type TT;
- typedef typename std::tuple_element<ELEM-1,TT>::type IT;
+ typedef typename tbb::flow::tuple_element<ELEM-1,TT>::type IT;
typedef typename tbb::flow::queue_node<IT> my_sink_node_type;
static void print_parallel_remark() {
sink_node_helper<ELEM-1,SType>::print_parallel_remark();
@@ -183,7 +177,7 @@ public:
template<typename SType>
class sink_node_helper<1, SType> {
typedef typename SType::input_type TT;
- typedef typename std::tuple_element<0,TT>::type IT;
+ typedef typename tbb::flow::tuple_element<0,TT>::type IT;
typedef typename tbb::flow::queue_node<IT> my_sink_node_type;
public:
static void print_parallel_remark() {
@@ -223,7 +217,7 @@ class parallel_test {
public:
typedef typename SType::input_type TType;
typedef tbb::flow::source_node<TType> source_type;
- static const int N = std::tuple_size<TType>::value;
+ static const int N = tbb::flow::tuple_size<TType>::value;
static void test() {
TType v;
source_type* all_source_nodes[MaxNSources];
@@ -270,8 +264,8 @@ public:
template<typename SType>
void test_one_serial( SType &my_split, tbb::flow::graph &g) {
typedef typename SType::input_type TType;
- static const int SIZE = std::tuple_size<TType>::value;
- sink_node_helper<SIZE, SType>::add_sink_nodes(my_split,g);
+ static const int TUPLE_SIZE = tbb::flow::tuple_size<TType>::value;
+ sink_node_helper<TUPLE_SIZE, SType>::add_sink_nodes(my_split,g);
typedef TType q3_input_type;
tbb::flow::queue_node< q3_input_type > q3(g);
@@ -281,36 +275,36 @@ void test_one_serial( SType &my_split, tbb::flow::graph &g) {
flags.clear();
for (int i = 0; i < Count; ++i ) {
TType v;
- tuple_helper<SIZE>::set_element(v, i);
+ tuple_helper<TUPLE_SIZE>::set_element(v, i);
ASSERT(my_split.try_put(v), NULL);
flags.push_back(false);
}
g.wait_for_all();
- sink_node_helper<SIZE,SType>::check_sink_values();
+ sink_node_helper<TUPLE_SIZE,SType>::check_sink_values();
- sink_node_helper<SIZE, SType>::remove_sink_nodes(my_split);
+ sink_node_helper<TUPLE_SIZE, SType>::remove_sink_nodes(my_split);
}
template<typename SType>
class serial_test {
typedef typename SType::input_type TType;
- static const int SIZE = std::tuple_size<TType>::value;
+ static const int TUPLE_SIZE = tbb::flow::tuple_size<TType>::value;
static const int ELEMS = 3;
public:
static void test() {
tbb::flow::graph g;
flags.reserve(Count);
- SType* my_split = makeSplit<SIZE,SType>::create(g);
- sink_node_helper<SIZE, SType>::print_serial_remark(); REMARK(" >\n");
+ SType* my_split = makeSplit<TUPLE_SIZE,SType>::create(g);
+ sink_node_helper<TUPLE_SIZE, SType>::print_serial_remark(); REMARK(" >\n");
test_one_serial<SType>( *my_split, g);
// build the vector with copy construction from the used split node.
std::vector<SType>split_vector(ELEMS, *my_split);
// destroy the tired old split_node in case we're accidentally reusing pieces of it.
- makeSplit<SIZE,SType>::destroy(my_split);
+ makeSplit<TUPLE_SIZE,SType>::destroy(my_split);
for(int e = 0; e < ELEMS; ++e) { // exercise each of the vector elements
@@ -337,27 +331,32 @@ int TestMain() {
REMARK(" Using platform tuple\n");
#endif
for (int p = 0; p < 2; ++p) {
- generate_test<serial_test, std::tuple<float, double> >::do_test();
- generate_test<serial_test, std::tuple<float, double, int, long> >::do_test();
- generate_test<serial_test, std::tuple<double, double, int, long, int, short> >::do_test();
-#if COMPREHENSIVE_TEST
- generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long> >::do_test();
- generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long> >::do_test();
+ generate_test<serial_test, tbb::flow::tuple<float, double> >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 4
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, long> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 6
+ generate_test<serial_test, tbb::flow::tuple<double, double, int, long, int, short> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 8
+ generate_test<serial_test, tbb::flow::tuple<float, double, double, double, float, int, float, long> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 10
+ generate_test<serial_test, tbb::flow::tuple<float, double, int, double, double, float, long, int, float, long> >::do_test();
+#endif
+ generate_test<parallel_test, tbb::flow::tuple<float, double> >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 3
+ generate_test<parallel_test, tbb::flow::tuple<float, int, long> >::do_test();
#endif
- generate_test<parallel_test, std::tuple<float, double> >::do_test();
- generate_test<parallel_test, std::tuple<float, int, long> >::do_test();
- generate_test<parallel_test, std::tuple<double, double, int, int, short> >::do_test();
-#if COMPREHENSIVE_TEST
- generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long> >::do_test();
- generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long> >::do_test();
+#if MAX_TUPLE_TEST_SIZE >= 5
+ generate_test<parallel_test, tbb::flow::tuple<double, double, int, int, short> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 7
+ generate_test<parallel_test, tbb::flow::tuple<float, int, double, float, long, float, long> >::do_test();
+#endif
+#if MAX_TUPLE_TEST_SIZE >= 9
+ generate_test<parallel_test, tbb::flow::tuple<float, double, int, double, double, long, int, float, long> >::do_test();
#endif
}
return Harness::Done;
}
-#else // __SUNPRO_CC
-
-int TestMain() {
- return Harness::Skipped;
-}
-
-#endif // SUNPRO_CC
diff --git a/src/test/test_static_assert.cpp b/src/test/test_static_assert.cpp
new file mode 100644
index 0000000..ac6751d
--- /dev/null
+++ b/src/test/test_static_assert.cpp
@@ -0,0 +1,96 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#include "tbb/tbb_stddef.h"
+
+void TestInsideFunction(){
+ __TBB_STATIC_ASSERT(sizeof(char)>=1,"");
+}
+void TestTwiceAtTheSameLine(){
+// for current implementation it is not possible to use
+// two __TBB_STATIC_ASSERT on a same line
+// __TBB_STATIC_ASSERT(true,""); __TBB_STATIC_ASSERT(true,"");
+}
+
+void TestInsideStructure(){
+ struct helper{
+ __TBB_STATIC_ASSERT(true,"");
+ };
+}
+
+void TestTwiceInsideStructure(){
+ struct helper{
+ //for current implementation it is not possible to use
+ //two __TBB_STATIC_ASSERT on a same line inside a class definition
+ //__TBB_STATIC_ASSERT(true,"");__TBB_STATIC_ASSERT(true,"");
+
+ __TBB_STATIC_ASSERT(true,"");
+ __TBB_STATIC_ASSERT(true,"");
+ };
+}
+
+namespace TestTwiceInsideNamespaceHelper{
+ __TBB_STATIC_ASSERT(true,"");
+ __TBB_STATIC_ASSERT(true,"");
+}
+
+namespace TestTwiceInsideClassTemplateHelper{
+ template <typename T>
+ struct template_struct{
+ __TBB_STATIC_ASSERT(true,"");
+ __TBB_STATIC_ASSERT(true,"");
+ };
+}
+
+void TestTwiceInsideTemplateClass(){
+ using namespace TestTwiceInsideClassTemplateHelper;
+ typedef template_struct<int> template_struct_int_typedef;
+ typedef template_struct<char> template_struct_char_typedef;
+}
+
+template<typename T>
+void TestTwiceInsideTemplateFunction(){
+ __TBB_STATIC_ASSERT(sizeof(T)>=1,"");
+ __TBB_STATIC_ASSERT(true,"");
+}
+
+#include "harness.h"
+int TestMain() {
+ #if __TBB_STATIC_ASSERT_PRESENT
+ REPORT("Known issue: %s\n", "no need to test ad-hoc implementation as native feature of C++11 is used");
+ return Harness::Skipped;
+ #else
+ TestInsideFunction();
+ TestInsideStructure();
+ TestTwiceAtTheSameLine();
+ TestTwiceInsideStructure();
+ TestTwiceInsideTemplateClass();
+ TestTwiceInsideTemplateFunction<char>();
+ return Harness::Done;
+ #endif
+}
diff --git a/src/test/test_std_thread.cpp b/src/test/test_std_thread.cpp
index f8626c1..2408004 100644
--- a/src/test/test_std_thread.cpp
+++ b/src/test/test_std_thread.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -27,6 +27,15 @@
*/
#define TBB_IMPLEMENT_CPP0X 1
+#include "tbb/tbb_config.h"
+
+#if __TBB_WIN8UI_SUPPORT
+#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#include "harness.h"
+int TestMain() {
+ return Harness::Skipped;
+}
+#else
#include "tbb/compat/thread"
#define THREAD std::thread
#define THIS_THREAD std::this_thread
@@ -39,3 +48,4 @@ int TestMain () {
RunTests();
return Harness::Done;
}
+#endif
diff --git a/src/test/test_task.cpp b/src/test/test_task.cpp
index a3ee377..6303c26 100644
--- a/src/test/test_task.cpp
+++ b/src/test/test_task.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_task_arena.cpp b/src/test/test_task_arena.cpp
new file mode 100644
index 0000000..9b22e62
--- /dev/null
+++ b/src/test/test_task_arena.cpp
@@ -0,0 +1,315 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#if __TBB_CPF_BUILD
+// undefine __TBB_CPF_BUILD to simulate user's setup
+#undef __TBB_CPF_BUILD
+
+#define TBB_PREVIEW_TASK_ARENA 1
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+ #pragma warning (push)
+ #pragma warning (disable: 4530)
+#endif
+
+#include <stdexcept>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
+#include <cstdlib>
+#include <cstdio>
+
+#include "tbb/task_arena.h"
+#include "tbb/task_scheduler_observer.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/parallel_for.h"
+#include "tbb/blocked_range.h"
+#include "tbb/enumerable_thread_specific.h"
+
+#include "harness_assert.h"
+#include "harness.h"
+#include "harness_barrier.h"
+#include "harness_concurrency_tracker.h"
+
+#if _MSC_VER
+// plays around __TBB_NO_IMPLICIT_LINKAGE. __TBB_LIB_NAME should be defined (in makefiles)
+ #pragma comment(lib, __TBB_STRING(__TBB_LIB_NAME))
+#endif
+
+//! Test that task_arena::initialize and task_arena::terminate work when doing nothing else.
+/** maxthread is treated as the biggest possible concurrency level. */
+void InitializeAndTerminate( int maxthread ) {
+ __TBB_TRY {
+ for( int i=0; i<200; ++i ) {
+ switch( i&3 ) {
+ // Arena is created inactive, initialization is always explicit. Lazy initialization is covered by other test functions.
+ // Explicit initialization can either keep the original values or change those.
+ // Arena termination can be explicit or implicit (in the destructor).
+ // TODO: extend with concurrency level checks if such a method is added.
+ // TODO: test for different master slot reservation values (perhaps in another function)
+ default: {
+ tbb::task_arena arena( std::rand() % maxthread + 1 );
+ ASSERT(!arena.is_active(), "arena should not be active until initialized");
+ arena.initialize();
+ ASSERT(arena.is_active(), NULL);
+ arena.terminate();
+ ASSERT(!arena.is_active(), "arena should not be active; it was terminated");
+ break;
+ }
+ case 0: {
+ tbb::task_arena arena( 1 );
+ ASSERT(!arena.is_active(), "arena should not be active until initialized");
+ arena.initialize( std::rand() % maxthread + 1 ); // change the parameters
+ ASSERT(arena.is_active(), NULL);
+ break;
+ }
+ case 1: {
+ tbb::task_arena arena( tbb::task_arena::automatic );
+ ASSERT(!arena.is_active(), NULL);
+ arena.initialize();
+ ASSERT(arena.is_active(), NULL);
+ break;
+ }
+ case 2: {
+ tbb::task_arena arena;
+ ASSERT(!arena.is_active(), "arena should not be active until initialized");
+ arena.initialize( std::rand() % maxthread + 1 );
+ ASSERT(arena.is_active(), NULL);
+ arena.terminate();
+ ASSERT(!arena.is_active(), "arena should not be active; it was terminated");
+ break;
+ }
+ }
+ }
+ } __TBB_CATCH( std::runtime_error& error ) {
+#if TBB_USE_EXCEPTIONS
+ REPORT("ERROR: %s\n", error.what() );
+#endif /* TBB_USE_EXCEPTIONS */
+ }
+}
+
+typedef tbb::blocked_range<int> Range;
+
+Harness::SpinBarrier our_barrier;
+
+static tbb::enumerable_thread_specific<int> local_id, old_id, slot_id(-1);
+void ResetTLS() {
+ local_id.clear();
+ old_id.clear();
+ slot_id.clear();
+}
+
+class ConcurrencyTrackingBody {
+public:
+ void operator() ( const Range& ) const {
+ ASSERT(slot_id.local() == tbb::task_arena::current_slot(), NULL);
+ Harness::ConcurrencyTracker ct;
+ for ( volatile int i = 0; i < 100000; ++i )
+ ;
+ }
+};
+
+class ArenaObserver : public tbb::task_scheduler_observer {
+ int myId;
+ tbb::atomic<int> myTrappedSlot;
+ /*override*/
+ void on_scheduler_entry( bool is_worker ) {
+ REMARK("a %s #%p is entering arena %d from %d\n", is_worker?"worker":"master", &local_id.local(), myId, local_id.local());
+ ASSERT(!old_id.local(), "double-call to on_scheduler_entry");
+ old_id.local() = local_id.local();
+ ASSERT(old_id.local() != myId, "double-entry to the same arena");
+ local_id.local() = myId;
+ slot_id.local() = tbb::task_arena::current_slot();
+ if(is_worker) ASSERT(tbb::task_arena::current_slot()>0, NULL);
+ else ASSERT(tbb::task_arena::current_slot()==0, NULL);
+ }
+ /*override*/
+ void on_scheduler_exit( bool is_worker ) {
+ REMARK("a %s #%p is leaving arena %d to %d\n", is_worker?"worker":"master", &local_id.local(), myId, old_id.local());
+ ASSERT(local_id.local() == myId, "nesting of arenas is broken");
+ ASSERT(slot_id.local() == tbb::task_arena::current_slot(), NULL);
+ slot_id.local() = -1;
+ local_id.local() = old_id.local();
+ old_id.local() = 0;
+ }
+ /*override*/
+ bool on_scheduler_leaving() {
+ ASSERT(slot_id.local() == tbb::task_arena::current_slot(), NULL);
+ return tbb::task_arena::current_slot() >= myTrappedSlot;
+ }
+public:
+ ArenaObserver(tbb::task_arena &a, int id, int trap = 0) : tbb::task_scheduler_observer(a) {
+ ASSERT(id, NULL);
+ myId = id;
+ myTrappedSlot = trap;
+ observe(true);
+ }
+ ~ArenaObserver () {
+ ASSERT(!old_id.local(), "inconsistent observer state");
+ }
+};
+
+struct AsynchronousWork : NoAssign {
+ Harness::SpinBarrier &my_barrier;
+ bool my_is_blocking;
+ AsynchronousWork(Harness::SpinBarrier &a_barrier, bool blocking = true)
+ : my_barrier(a_barrier), my_is_blocking(blocking) {}
+ void operator()() const {
+ ASSERT(local_id.local() != 0, "not in explicit arena");
+ tbb::parallel_for(Range(0,500), ConcurrencyTrackingBody(), tbb::simple_partitioner());
+ if(my_is_blocking) my_barrier.timed_wait(10); // must be asynchronous to master thread
+ else my_barrier.signal_nowait();
+ }
+};
+
+void TestConcurrentArenas(int p) {
+ //Harness::ConcurrencyTracker::Reset();
+ tbb::task_arena a1;
+ a1.initialize(1,0);
+ ArenaObserver o1(a1, p*2+1);
+ tbb::task_arena a2(2,1);
+ ArenaObserver o2(a2, p*2+2);
+ Harness::SpinBarrier barrier(2);
+ AsynchronousWork work(barrier);
+ a1.enqueue(work); // put async work
+ barrier.timed_wait(10);
+ a2.enqueue(work); // another work
+ a2.execute(work); // my_barrier.timed_wait(10) inside
+ a1.wait_until_empty();
+ a2.wait_until_empty();
+}
+
+class MultipleMastersBody : NoAssign {
+ int mode;
+ tbb::task_arena &my_a;
+ Harness::SpinBarrier &my_b;
+public:
+ MultipleMastersBody(int m, tbb::task_arena &a, Harness::SpinBarrier &b)
+ : mode(m), my_a(a), my_b(b) {}
+ void operator()(int) const {
+ my_a.execute(AsynchronousWork(my_b, /*blocking=*/false));
+ if( mode == 0 ) {
+ my_a.wait_until_empty();
+ // A regression test for bugs 1954 & 1971
+ my_a.enqueue(AsynchronousWork(my_b, /*blocking=*/false));
+ }
+ }
+};
+
+class MultipleMastersPart3 : NoAssign {
+ tbb::task_arena &my_a;
+ Harness::SpinBarrier &my_b;
+
+ struct Runner : NoAssign {
+ tbb::task* const a_task;
+ Runner(tbb::task* const t) : a_task(t) {}
+ void operator()() const {
+ for ( volatile int i = 0; i < 10000; ++i )
+ ;
+ a_task->decrement_ref_count();
+ }
+ };
+
+ struct Waiter : NoAssign {
+ tbb::task* const a_task;
+ Waiter(tbb::task* const t) : a_task(t) {}
+ void operator()() const {
+ a_task->wait_for_all();
+ }
+ };
+
+public:
+ MultipleMastersPart3(tbb::task_arena &a, Harness::SpinBarrier &b)
+ : my_a(a), my_b(b) {}
+ void operator()(int idx) const {
+ tbb::empty_task* root_task = new(tbb::task::allocate_root()) tbb::empty_task;
+ for( int i=0; i<100; ++i) {
+ root_task->set_ref_count(2);
+ my_a.enqueue(Runner(root_task));
+ my_a.execute(Waiter(root_task));
+ }
+ tbb::task::destroy(*root_task);
+ REMARK("Master #%d: job completed, wait for others\n", idx);
+ my_b.timed_wait(10);
+ }
+};
+
+
+void TestMultipleMasters(int p) {
+ {
+ REMARK("multiple masters, part 1\n");
+ tbb::task_arena a(1,0);
+ a.initialize();
+ ArenaObserver o(a, 1);
+ Harness::SpinBarrier barrier(2*p+1); // each of p threads will submit two tasks signaling the barrier
+ NativeParallelFor( p, MultipleMastersBody(0, a, barrier) );
+ barrier.timed_wait(10);
+ a.wait_until_empty();
+ } {
+ REMARK("multiple masters, part 2\n");
+ tbb::task_arena a(2,1);
+ ArenaObserver o(a, 2);
+ Harness::SpinBarrier barrier(p+2);
+ a.enqueue(AsynchronousWork(barrier, /*blocking=*/true)); // occupy the worker, a regression test for bug 1981
+ NativeParallelFor( p, MultipleMastersBody(1, a, barrier) );
+ barrier.timed_wait(10);
+ a.wait_until_empty();
+ } {
+ // Regression test for the bug 1981 part 2 (task_arena::execute() with wait_for_all for an enqueued task)
+ REMARK("multiple masters, part 3: wait_for_all() in execute()\n");
+ tbb::task_arena a(p,1);
+ Harness::SpinBarrier barrier(p+1); // for masters to avoid endless waiting at least in some runs
+ // "Oversubscribe" the arena by 1 master thread
+ NativeParallelFor( p+1, MultipleMastersPart3(a, barrier) );
+ a.wait_until_empty();
+ }
+}
+
+
+int TestMain () {
+ // TODO: a workaround for temporary p-1 issue in market
+ tbb::task_scheduler_init init_market_p_plus_one(MaxThread+1);
+ InitializeAndTerminate(MaxThread);
+ for( int p=MinThread; p<=MaxThread; ++p ) {
+ REMARK("testing with %d threads\n", p );
+ NativeParallelFor( p, &TestConcurrentArenas );
+ ResetTLS();
+ TestMultipleMasters( p );
+ ResetTLS();
+ }
+ return Harness::Done;
+}
+#else // __TBB_CPF_BUILD
+#include "harness.h"
+int TestMain () {
+ return Harness::Skipped;
+}
+#endif
diff --git a/src/test/test_task_assertions.cpp b/src/test/test_task_assertions.cpp
index 7fb623e..2bc2d82 100644
--- a/src/test/test_task_assertions.cpp
+++ b/src/test/test_task_assertions.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_task_auto_init.cpp b/src/test/test_task_auto_init.cpp
index 13dbdd1..d44084c 100644
--- a/src/test/test_task_auto_init.cpp
+++ b/src/test/test_task_auto_init.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_task_enqueue.cpp b/src/test/test_task_enqueue.cpp
index a0ff46e..fcd262d 100644
--- a/src/test/test_task_enqueue.cpp
+++ b/src/test/test_task_enqueue.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -318,7 +318,46 @@ void TestDequeueByMaster () {
tbb::task::destroy(r);
}
+////////////////////// Missed wake-ups ///////
+#include "tbb/blocked_range.h"
+#include "tbb/parallel_for.h"
+
+static const int NUM_TASKS = 4;
+static const size_t NUM_REPEATS = 100000;
+
+struct Functor : NoAssign
+{
+ Harness::SpinBarrier &my_barrier;
+ Functor(Harness::SpinBarrier &a_barrier) : my_barrier(a_barrier) { }
+ void operator()(const tbb::blocked_range<int>& r) const
+ {
+ ASSERT(r.size() == 1, NULL);
+ tbb::task *t = new(tbb::task::allocate_root()) tbb::empty_task();
+ tbb::task::enqueue(*t); // ensure no missing wake-ups
+ my_barrier.timed_wait(10, "Attention: poorly reproducible event, if seen stress testing required" );
+ }
+};
+
+void TestWakeups()
+{
+ tbb::task_scheduler_init my(tbb::task_scheduler_init::deferred);
+ if( tbb::task_scheduler_init::default_num_threads() <= NUM_TASKS )
+ my.initialize(NUM_TASKS*2);
+ Harness::SpinBarrier barrier(NUM_TASKS);
+ REMARK("Missing wake-up: affinity_partitioner\n");
+ tbb::affinity_partitioner aff;
+ for (size_t i = 0; i < NUM_REPEATS; ++i)
+ tbb::parallel_for(tbb::blocked_range<int>(0, NUM_TASKS), Functor(barrier), aff);
+ REMARK("Missing wake-up: simple_partitioner\n");
+ for (size_t i = 0; i < NUM_REPEATS; ++i)
+ tbb::parallel_for(tbb::blocked_range<int>(0, NUM_TASKS), Functor(barrier), tbb::simple_partitioner());
+ REMARK("Missing wake-up: auto_partitioner\n");
+ for (size_t i = 0; i < NUM_REPEATS; ++i)
+ tbb::parallel_for(tbb::blocked_range<int>(0, NUM_TASKS), Functor(barrier)); // auto
+}
+
int TestMain () {
+ TestWakeups();
TestDequeueByMaster();
TestCascadedEnqueue();
for( int p=MinThread; p<=MaxThread; ++p ) {
diff --git a/src/test/test_task_group.cpp b/src/test/test_task_group.cpp
index 3896c67..413f83b 100644
--- a/src/test/test_task_group.cpp
+++ b/src/test/test_task_group.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,13 +26,20 @@
the GNU General Public License.
*/
-//! task_handle<T> cannot be instantiated with a function ptr without explicit cast
-#define __TBB_FUNC_PTR_AS_TEMPL_PARAM_BROKEN ((__linux__ || __APPLE__) && __INTEL_COMPILER && __INTEL_COMPILER < 1100) || __SUNPRO_CC
-#define __TBB_UNQUALIFIED_CALL_OF_DTOR_BROKEN (__GNUC__==3 && __GNUC_MINOR__<=3)
+#include "harness_defs.h"
+//Concurrency scheduler is not supported by Windows* new UI apps
+//TODO: check whether we can test anything here
+#include "tbb/tbb_config.h"
+#if !__TBB_WIN8UI_SUPPORT
#ifndef TBBTEST_USE_TBB
#define TBBTEST_USE_TBB 1
#endif
+#else
+ #define TBBTEST_USE_TBB 0
+ #undef __TBB_TASK_GROUP_CONTEXT
+ #define __TBB_TASK_GROUP_CONTEXT 0
+#endif
#if !TBBTEST_USE_TBB
#if defined(_MSC_VER) && _MSC_VER < 1600
@@ -71,6 +78,7 @@
#if __TBB_TASK_GROUP_CONTEXT
#include "tbb/atomic.h"
+#include "tbb/aligned_space.h"
#include "harness_concurrency_tracker.h"
unsigned g_MaxConcurrency = 0;
@@ -256,8 +264,8 @@ atomic_t g_Sum;
//------------------------------------------------------------------------
// Test for a complex tree of task groups
//
-// The test executes a tree of task groups of the same sort with asymmetric
-// descendant nodes distribution at each level at each level.
+// The test executes a tree of task groups of the same sort with asymmetric
+// descendant nodes distribution at each level at each level.
//
// The chores are specified as functor objects. Each task group contains only one chore.
//------------------------------------------------------------------------
@@ -269,7 +277,7 @@ struct FibTask : NoAssign, Harness::NoAfterlife {
FibTask( uint_t* y, uint_t n ) : m_pRes(y), m_Num(n) {}
void operator() () const {
*m_pRes = Func(m_Num);
- }
+ }
};
uint_t Fib_SpawnRightChildOnly ( uint_t n ) {
@@ -288,7 +296,7 @@ uint_t Fib_SpawnRightChildOnly ( uint_t n ) {
void TestFib1 () {
FIB_TEST_PROLOGUE();
- uint_t sum = 0;
+ uint_t sum = 0;
for( unsigned i = 0; i < numRepeats; ++i )
sum += Fib_SpawnRightChildOnly(N);
FIB_TEST_EPILOGUE(sum);
@@ -298,7 +306,7 @@ void TestFib1 () {
//------------------------------------------------------------------------
// Test for a mixed tree of task groups.
//
-// The test executes a tree with multiple task of one sort at the first level,
+// The test executes a tree with multiple task of one sort at the first level,
// each of which originates in its turn a binary tree of descendant task groups.
//
// The chores are specified both as functor objects and as function pointers
@@ -325,7 +333,7 @@ void RunFib2 () {
void TestFib2 () {
FIB_TEST_PROLOGUE();
- g_Sum = 0;
+ g_Sum = 0;
Concurrency::task_group rg;
for( unsigned i = 0; i < numRepeats - 1; ++i )
rg.run( &RunFib2 );
@@ -373,7 +381,7 @@ uint_t RunFib3 ( uint_t n ) {
void TestTaskHandle () {
FIB_TEST_PROLOGUE();
- uint_t sum = 0;
+ uint_t sum = 0;
for( unsigned i = 0; i < numRepeats; ++i )
sum += RunFib3(N);
FIB_TEST_EPILOGUE(sum);
@@ -396,7 +404,7 @@ public:
if( m_Num < 2 ) {
*m_pRes = m_Num;
} else {
- uint_t x = ~0u, // initialized only to suppress warning
+ uint_t x = ~0u, // initialized only to suppress warning
y = ~0u;
task_group_type tg;
Concurrency::task_handle<FibTask_SpawnBothChildren> h1 = FibTask_SpawnBothChildren(&y, m_Num-1),
@@ -420,13 +428,13 @@ void RunFib4 () {
template<class task_group_type>
void TestTaskHandle2 () {
FIB_TEST_PROLOGUE();
- g_Sum = 0;
+ g_Sum = 0;
task_group_type rg;
const unsigned hSize = sizeof(handle_type);
char *handles = new char [numRepeats * hSize];
handle_type *h = NULL;
for( unsigned i = 0; ; ++i ) {
- h = (handle_type*)(handles + i * hSize);
+ h = tbb::internal::punned_cast<handle_type*,char>(handles + i * hSize);
#if __TBB_FUNC_PTR_AS_TEMPL_PARAM_BROKEN
new ( h ) handle_type((void(*)())RunFib4<task_group_type>);
#else
@@ -453,9 +461,9 @@ void TestTaskHandle2 () {
rg.run_and_wait( *h );
for( unsigned i = 0; i < numRepeats; ++i )
#if __TBB_UNQUALIFIED_CALL_OF_DTOR_BROKEN
- ((handle_type*)(handles + i * hSize))->Concurrency::task_handle<void(*)()>::~task_handle();
+ tbb::internal::punned_cast<handle_type*,char>(handles + i * hSize)->Concurrency::task_handle<void(*)()>::~task_handle();
#else
- ((handle_type*)(handles + i * hSize))->~handle_type();
+ tbb::internal::punned_cast<handle_type*,char>(handles + i * hSize)->~handle_type();
#endif
delete []handles;
FIB_TEST_EPILOGUE(g_Sum);
@@ -568,7 +576,7 @@ public:
Harness::ConcurrencyTracker ct;
AssertLive();
if ( g_Throw ) {
- if ( ++m_TaskCount == SKIP_CHORES )
+ if ( ++m_TaskCount == SKIP_CHORES )
__TBB_THROW( test_exception(EXCEPTION_DESCR1) );
__TBB_Yield();
}
@@ -612,7 +620,7 @@ void TestEh1 () {
ResetGlobals( true, false );
Concurrency::task_group rg;
for( unsigned i = 0; i < NUM_GROUPS; ++i )
- // TBB version does not require taking function address
+ // TBB version does not require taking function address
rg.run( &LaunchChildren );
try {
rg.wait();
@@ -628,7 +636,7 @@ void TestEh2 () {
Concurrency::task_group rg;
bool exceptionCaught = false;
for( unsigned i = 0; i < NUM_GROUPS; ++i )
- // TBB version does not require taking function address
+ // TBB version does not require taking function address
rg.run( &LaunchChildren );
try {
rg.wait();
@@ -653,7 +661,7 @@ void TestCancellation1 () {
ResetGlobals( false, false );
Concurrency::task_group rg;
for( unsigned i = 0; i < NUM_GROUPS; ++i )
- // TBB version does not require taking function address
+ // TBB version does not require taking function address
rg.run( &LaunchChildren );
ASSERT ( !Concurrency::is_current_task_group_canceling(), "Unexpected cancellation" );
ASSERT ( !rg.is_canceling(), "Unexpected cancellation" );
@@ -681,10 +689,9 @@ void StructuredLaunchChildren () {
Concurrency::structured_task_group g;
bool exceptionCaught = false;
typedef Concurrency::task_handle<ThrowingTask> throwing_handle_type;
- static const unsigned hSize = sizeof(throwing_handle_type);
- char handles[NUM_CHORES * hSize];
+ tbb::aligned_space<throwing_handle_type,NUM_CHORES> handles;
for( unsigned i = 0; i < NUM_CHORES; ++i ) {
- throwing_handle_type *h = (throwing_handle_type*)(handles + i * hSize);
+ throwing_handle_type *h = handles.begin()+i;
new ( h ) throwing_handle_type( ThrowingTask(count) );
g.run( *h );
}
@@ -705,7 +712,7 @@ void StructuredLaunchChildren () {
} CATCH_ANY();
ASSERT( !g_Throw || exceptionCaught, "No exception in the child task group" );
for( unsigned i = 0; i < NUM_CHORES; ++i )
- ((throwing_handle_type*)(handles + i * hSize))->~throwing_handle_type();
+ (handles.begin()+i)->~throwing_handle_type();
if ( g_Rethrow && g_ExceptionCount > SKIP_GROUPS ) {
#if __TBB_SILENT_CANCELLATION_BROKEN
g_CancellationPropagationInProgress = true;
@@ -715,14 +722,13 @@ void StructuredLaunchChildren () {
}
class StructuredCancellationTestDriver {
- static const unsigned hSize = sizeof(handle_type);
- char m_handles[NUM_CHORES * hSize];
+ tbb::aligned_space<handle_type,NUM_CHORES> m_handles;
public:
void Launch ( Concurrency::structured_task_group& rg ) {
ResetGlobals( false, false );
for( unsigned i = 0; i < NUM_GROUPS; ++i ) {
- handle_type *h = (handle_type*)(m_handles + i * hSize);
+ handle_type *h = m_handles.begin()+i;
new ( h ) handle_type( StructuredLaunchChildren );
rg.run( *h );
}
@@ -737,7 +743,7 @@ public:
void Finish () {
for( unsigned i = 0; i < NUM_GROUPS; ++i )
- ((handle_type*)(m_handles + i * hSize))->~handle_type();
+ (m_handles.begin()+i)->~handle_type();
ASSERT( g_TaskCount <= NUM_GROUPS * NUM_CHORES, "Too many tasks reported. The test is broken" );
ASSERT( g_TaskCount < NUM_GROUPS * NUM_CHORES, "No tasks were cancelled. Cancellation model changed?" );
ASSERT( g_TaskCount <= g_ExecutedAtCancellation + g_MaxConcurrency, "Too many tasks survived cancellation" );
diff --git a/src/test/test_task_leaks.cpp b/src/test/test_task_leaks.cpp
index 4aa4f30..01c21a6 100644
--- a/src/test/test_task_leaks.cpp
+++ b/src/test/test_task_leaks.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_task_priority.cpp b/src/test/test_task_priority.cpp
index 6c98ea0..9cb2ae7 100644
--- a/src/test/test_task_priority.cpp
+++ b/src/test/test_task_priority.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,8 +26,12 @@
the GNU General Public License.
*/
+#if __TBB_CPF_BUILD
+ #define TBB_PREVIEW_TASK_ARENA 1
+#endif
#include "harness.h"
+
#if __TBB_TASK_GROUP_CONTEXT
#include "tbb/task.h"
@@ -35,6 +39,11 @@
#include "tbb/atomic.h"
#include <cstdlib>
+#if _MSC_VER && __TBB_NO_IMPLICIT_LINKAGE
+// plays around __TBB_NO_IMPLICIT_LINKAGE. __TBB_LIB_NAME should be defined (in makefiles)
+ #pragma comment(lib, __TBB_STRING(__TBB_LIB_NAME))
+#endif
+
const int NumIterations = 100;
const int NumLeafTasks = 2;
int MinBaseDepth = 9;
@@ -284,7 +293,7 @@ public:
template<class NodeType>
void RunPrioritySwitchBetweenTwoMasters ( int idx, uintptr_t opts ) {
ASSERT( idx < NumTests, NULL );
- REMARK( "Config %d\r", ++g_CurConfig );
+ REMARK( "Config %d: idx=%i, opts=%u\r", ++g_CurConfig, idx, (unsigned)opts );
NativeParallelFor ( 2, MasterBody<NodeType>(idx, opts) );
Harness::Sleep(50);
}
diff --git a/src/test/test_task_scheduler_init.cpp b/src/test/test_task_scheduler_init.cpp
index 57bf015..70e78d5 100644
--- a/src/test/test_task_scheduler_init.cpp
+++ b/src/test/test_task_scheduler_init.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_task_scheduler_observer.cpp b/src/test/test_task_scheduler_observer.cpp
index 16e2170..bf7f72b 100644
--- a/src/test/test_task_scheduler_observer.cpp
+++ b/src/test/test_task_scheduler_observer.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,103 +26,372 @@
the GNU General Public License.
*/
+// TODO: rework as non-CPF or make two tests out of it
+#define TBB_PREVIEW_LOCAL_OBSERVER 1
+#if __TBB_CPF_BUILD
+ #define TBB_PREVIEW_TASK_ARENA 1
+#endif
+
+#include "tbb/tbb_config.h"
+#include "harness.h"
+
+#if __TBB_SCHEDULER_OBSERVER
#include "tbb/task_scheduler_observer.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/atomic.h"
+#include "tbb/task.h"
+#include "../tbb/tls.h"
+#include "tbb/tick_count.h"
+#include "harness_barrier.h"
-typedef uintptr_t FlagType;
-const int MaxFlagIndex = sizeof(FlagType)*8-1;
+#if _MSC_VER && __TBB_NO_IMPLICIT_LINKAGE
+// plays around __TBB_NO_IMPLICIT_LINKAGE. __TBB_LIB_NAME should be defined (in makefiles)
+ #pragma comment(lib, __TBB_STRING(__TBB_LIB_NAME))
+#endif
-class MyObserver: public tbb::task_scheduler_observer {
- FlagType flags;
- /*override*/ void on_scheduler_entry( bool is_worker );
- /*override*/ void on_scheduler_exit( bool is_worker );
-public:
- MyObserver( FlagType flags_ ) : flags(flags_) {
- observe(true);
+const int MaxFlagIndex = sizeof(uintptr_t)*8-1;
+
+struct ObserverStats {
+ tbb::atomic<int> m_entries;
+ tbb::atomic<int> m_exits;
+ tbb::atomic<int> m_workerEntries;
+ tbb::atomic<int> m_workerExits;
+
+ void Reset () {
+ m_entries = m_exits = m_workerEntries = m_workerExits = 0;
+ }
+
+ void operator += ( const ObserverStats& s ) {
+ m_entries += s.m_entries;
+ m_exits += s.m_exits;
+ m_workerEntries += s.m_workerEntries;
+ m_workerExits += s.m_workerExits;
}
};
-#include "harness_assert.h"
-#include "tbb/atomic.h"
+struct ThreadState {
+ uintptr_t m_flags;
+ tbb::task_scheduler_observer *m_dyingObserver;
+ bool m_isMaster;
+ ThreadState() : m_flags(0), m_dyingObserver(NULL), m_isMaster(false) {}
+};
+
+tbb::internal::tls<ThreadState*> theLocalState;
+static ObserverStats theStats;
+static tbb::atomic<int> theNumObservers;
-tbb::atomic<int> EntryCount;
-tbb::atomic<int> ExitCount;
+const int P = min( tbb::task_scheduler_init::default_num_threads(), (int)sizeof(int) * CHAR_BIT );
-struct State {
- FlagType MyFlags;
- bool IsMaster;
- State() : MyFlags(), IsMaster() {}
+enum TestMode {
+ //! Ensure timely workers destruction in order to guarantee all exit notification are fired.
+ tmSynchronized = 1,
+ //! Use local observer.
+ tmLocalObservation = 2,
+ //! Observer causes autoinitialization of the scheduler
+ tmAutoinitialization = 4,
+ //! test on_scheduler_leaving
+ tmLeavingControl = 8
};
-#include "../tbb/tls.h"
-tbb::internal::tls<State*> LocalState;
+uintptr_t theTestMode,
+ thePrevMode = 0;
-void MyObserver::on_scheduler_entry( bool is_worker ) {
- State& state = *LocalState;
- ASSERT( is_worker==!state.IsMaster, NULL );
- ++EntryCount;
- state.MyFlags |= flags;
-}
+class MyObserver : public tbb::task_scheduler_observer, public ObserverStats {
+ uintptr_t m_flag;
+ bool m_dying;
+ tbb::atomic<int> m_leave_ticket;
-void MyObserver::on_scheduler_exit( bool is_worker ) {
- State& state = *LocalState;
- ASSERT( is_worker==!state.IsMaster, NULL );
- ++ExitCount;
- state.MyFlags &= ~flags;
-}
+ /*override*/
+ void on_scheduler_entry( bool is_worker ) {
+ ThreadState& state = *theLocalState;
+ ASSERT( is_worker==!state.m_isMaster, NULL );
+ if ( thePrevMode & tmSynchronized ) {
+ ASSERT( !(state.m_flags & m_flag), "Observer repeatedly invoked for the same thread" );
+ if ( theTestMode & tmLocalObservation )
+ ASSERT( !state.m_flags, "Observer locality breached" );
+ }
+ if ( m_dying && theTestMode & tmLocalObservation ) {
+ // In case of local observation a worker may enter the arena after
+ // the wait for lagging on_entry calls in the MyObserver destructor
+ // succeeds but before its base class tbb::task_scheduler_observer
+ // destructor removes it from the internal list maintained by the
+ // task scheduler. This will result in on_entry notification without,
+ // subsequent on_exit as the observer is likely to be destroyed before
+ // the worker discovers that the arena is empty and leaves it.
+ //
+ // To prevent statistics distortion, ignore the notifications for
+ // observers about to be destroyed.
+ ASSERT( !state.m_dyingObserver || state.m_dyingObserver != this || thePrevMode & tmSynchronized, NULL );
+ state.m_dyingObserver = this;
+ return;
+ }
+ state.m_dyingObserver = NULL;
+ ++m_entries;
+ state.m_flags |= m_flag;
+ if ( is_worker )
+ ++m_workerEntries;
+ }
+ /*override*/
+ void on_scheduler_exit( bool is_worker ) {
+ ThreadState& state = *theLocalState;
+ ASSERT( is_worker==!state.m_isMaster, NULL );
+ if ( m_dying && state.m_dyingObserver ) {
+ ASSERT( state.m_dyingObserver == this, "Exit without entry (for a dying observer)" );
+ state.m_dyingObserver = NULL;
+ return;
+ }
+ ASSERT( state.m_flags & m_flag, "Exit without entry" );
+ // TODO: if(!is_leaving_test()) // workers are not supposed to return back for leaving test
+ state.m_flags &= ~m_flag;
+ ++m_exits;
+ if ( is_worker )
+ ++m_workerExits;
+ }
+ /*override*/
+ bool on_scheduler_leaving() {
+ if( m_leave_ticket == 0 ) return true;
+ return m_leave_ticket.fetch_and_store(-1) > 0;
+ }
+public:
+ void test_leaving() { m_leave_ticket.store<tbb::relaxed>(-1); }
+ void dismiss_one() { m_leave_ticket = 1; }
+ bool is_leaving_test() { return m_leave_ticket.load<tbb::relaxed>() != 0; }
-#include "tbb/task.h"
+ MyObserver( uintptr_t flag )
+ : tbb::task_scheduler_observer(theTestMode & tmLocalObservation ? true : false)
+ , m_flag(flag)
+ , m_dying(false)
+ {
+ m_leave_ticket.store<tbb::relaxed>(0);
+ ++theNumObservers;
+ Reset();
+ // Local observer causes automatic scheduler initialization
+ // in the current thread, so here, we must postpone the activation.
+ if ( !(theTestMode & tmLocalObservation) )
+ observe(true);
+ }
+
+ ~MyObserver () {
+ m_dying = true;
+ --theNumObservers;
+ ASSERT( m_exits <= m_entries, NULL );
+ if ( theTestMode & tmSynchronized ) {
+ tbb::tick_count t0 = tbb::tick_count::now();
+ while ( m_exits < m_entries && (tbb::tick_count::now() - t0).seconds() < 5 )
+ Harness::Sleep(10);
+ if ( m_exits < m_entries )
+ REPORT( "Warning: Entry/exit count mismatch (%d, %d). Observer is broken or machine is overloaded.\n", (int)m_entries, (int)m_exits );
+ }
+ theStats += *this;
+ // it is recommended to disable observation before destructor of the base class starts,
+ // otherwise it can lead to concurrent notification callback on partly destroyed object,
+ // which in turn can harm (in addition) if derived class has new virtual methods.
+ // This class has no, and for test purposes we rely on implementation failsafe mechanism.
+ //observe(false);
+ }
+}; // class MyObserver
-class FibTask: public tbb::task {
- const int n;
- FlagType flags;
+Harness::SpinBarrier theGlobalBarrier;
+bool theGlobalBarrierActive = true;
+
+class FibTask : public tbb::task {
+ const int N;
+ uintptr_t m_flag;
+ MyObserver &m_observer;
public:
- FibTask( int n_, FlagType flags_ ) : n(n_), flags(flags_) {}
+ FibTask( int n, uintptr_t flags, MyObserver &obs ) : N(n), m_flag(flags), m_observer(obs) {}
+
/*override*/ tbb::task* execute() {
- ASSERT( !(~LocalState->MyFlags & flags), NULL );
- if( n>=2 ) {
- set_ref_count(3);
- spawn(*new( allocate_child() ) FibTask(n-1,flags));
- spawn_and_wait_for_all(*new( allocate_child() ) FibTask(n-2,flags));
+ ASSERT( !(~theLocalState->m_flags & m_flag), NULL );
+ if( N < 2 )
+ return NULL;
+ bool globalBarrierActive = false;
+ if ( theLocalState->m_isMaster ) {
+ if ( theGlobalBarrierActive ) {
+ // This is the root task. Its N is equal to the number of threads.
+ // Spawn a task for each worker.
+ set_ref_count(N);
+ for ( int i = 1; i < N; ++i )
+ spawn( *new( allocate_child() ) FibTask(20, m_flag, m_observer) );
+ if ( theTestMode & tmSynchronized ) {
+ theGlobalBarrier.wait();
+ ASSERT( m_observer.m_entries >= N, "Wrong number of on_entry calls after the first barrier" );
+ // All the spawned tasks have been stolen by workers.
+ // Now wait for workers to spawn some more tasks for this thread to steal back.
+ theGlobalBarrier.wait();
+ ASSERT( !theGlobalBarrierActive, "Workers are expected to have reset this flag" );
+ }
+ else
+ theGlobalBarrierActive = false;
+ wait_for_all();
+ return NULL;
+ }
+ }
+ else {
+ if ( theGlobalBarrierActive ) {
+ if ( theTestMode & tmSynchronized ) {
+ theGlobalBarrier.wait();
+ globalBarrierActive = true;
+ }
+ theGlobalBarrierActive = false;
+ }
+ }
+ set_ref_count(3);
+ spawn( *new( allocate_child() ) FibTask(N-1, m_flag, m_observer) );
+ spawn( *new( allocate_child() ) FibTask(N-2, m_flag, m_observer) );
+ if ( globalBarrierActive ) {
+ // It's the first task executed by a worker. Release the master thread.
+ theGlobalBarrier.wait();
}
+ wait_for_all();
return NULL;
}
-};
+}; // class FibTask
-void DoFib( FlagType flags ) {
- tbb::task* t = new( tbb::task::allocate_root() ) FibTask(10,flags);
- tbb::task::spawn_root_and_wait(*t);
-}
+Harness::SpinBarrier theMasterBarrier;
-#include "tbb/task_scheduler_init.h"
-#include "harness.h"
-
-class DoTest {
- int nthread;
+class TestBody {
+ int m_numThreads;
public:
- DoTest( int n ) : nthread(n) {}
+ TestBody( int numThreads ) : m_numThreads(numThreads) {}
+
void operator()( int i ) const {
- LocalState->IsMaster = true;
- if( i==0 ) {
- tbb::task_scheduler_init init(nthread);
- DoFib(0);
- } else {
- FlagType f = i<=MaxFlagIndex? 1<<i : 0;
- MyObserver w(f);
- tbb::task_scheduler_init init(nthread);
- DoFib(f);
+ theLocalState->m_isMaster = true;
+ uintptr_t f = i <= MaxFlagIndex ? 1<<i : 0;
+ MyObserver o(f);
+ if ( theTestMode & tmSynchronized )
+ theMasterBarrier.wait();
+ // when mode is local observation but not synchronized and when num threads == default
+ if ( theTestMode & tmAutoinitialization )
+ o.observe(true); // test autoinitialization can be done by observer
+ // when mode is local synchronized observation and when num threads == default
+ if ( theTestMode & tmLeavingControl )
+ o.test_leaving();
+ // Observer in enabled state must outlive the scheduler to ensure that
+ // all exit notifications are called.
+ tbb::task_scheduler_init init(m_numThreads);
+ // when local & non-autoinitialized observation mode
+ if ( theTestMode & tmLocalObservation )
+ o.observe(true);
+ for ( int j = 0; j < 2; ++j ) {
+ tbb::task &t = *new( tbb::task::allocate_root() ) FibTask(m_numThreads, f, o);
+ tbb::task::spawn_root_and_wait(t);
+ thePrevMode = theTestMode;
}
+ if( o.is_leaving_test() ) {
+ REMARK( "Testing on_scheduler_leaving()\n");
+ ASSERT(o.m_workerEntries > 0, "Unbelievable");
+ // TODO: start from 0?
+ for ( int j = o.m_workerExits; j < o.m_workerEntries; j++ ) {
+ REMARK( "Round %d: entries %d, exits %d\n", j, (int)o.m_workerEntries, (int)o.m_workerExits );
+ ASSERT_WARNING(o.m_workerExits == j, "Workers unexpectedly leaved arena");
+ o.dismiss_one();
+ double n_seconds = 5;
+ (Harness::TimedWaitWhileEq(n_seconds))(o.m_workerExits, j);
+ ASSERT( n_seconds >= 0, "Time out while waiting for a worker to leave arena");
+ __TBB_Yield();
+ }
+ }
+ }
+}; // class TestBody
+
+Harness::SpinBarrier theWorkersBarrier;
+
+class CleanerTask : public tbb::task {
+public:
+ tbb::task* execute () {
+ theLocalState->m_flags = 0;
+ theWorkersBarrier.wait();
+ return NULL;
}
};
-void TestObserver( int p, int q ) {
- NativeParallelFor( p, DoTest(q) );
+void CleanLocalState () {
+ tbb::task_scheduler_init init;
+ tbb::task &r = *new( tbb::task::allocate_root() ) tbb::empty_task;
+ r.set_ref_count(P + 1);
+ for ( int i = 1; i < P; ++i )
+ tbb::task::spawn( *new(r.allocate_child()) CleanerTask );
+ r.spawn_and_wait_for_all( *new(r.allocate_child()) CleanerTask );
+ tbb::task::destroy( r );
+}
+
+void TestObserver( int M, int T, uintptr_t testMode ) {
+ theStats.Reset();
+ theGlobalBarrierActive = true;
+ theTestMode = testMode;
+ NativeParallelFor( M, TestBody(T) );
+ // When T (number of threads in arena, i.e. master + workers) is less than P
+ // (hardware concurrency), more than T-1 workers can visit the same arena. This
+ // is possible in case of imbalance or when other arenas are activated/deactivated
+ // concurrently).
+ ASSERT( !theNumObservers, "Unexpected alive observer(s)" );
+ REMARK( "Entries %d / %d, exits %d\n", (int)theStats.m_entries, (int)theStats.m_workerEntries, (int)theStats.m_exits );
+ if ( testMode & tmSynchronized ) {
+ if ( testMode & tmLocalObservation ) {
+ ASSERT( theStats.m_entries >= M * T, "Too few on_entry calls" );
+ ASSERT( theStats.m_workerEntries >= M * (T - 1), "Too few worker entries" );
+ }
+ else {
+ ASSERT( theStats.m_entries >= M * M * T, "Too few on_entry calls" );
+ ASSERT( theStats.m_entries <= M * (P + 1), "Too many on_entry calls" );
+ ASSERT( theStats.m_workerEntries >= M * M * (T - 1), "Too few worker entries" );
+ ASSERT( theStats.m_workerEntries <= M * (P - 1), "Too many worker entries" );
+ }
+ ASSERT( theStats.m_entries == theStats.m_exits, "Entries/exits mismatch" );
+ }
+ else {
+ ASSERT( theStats.m_entries >= M, "Too few on_entry calls" );
+ ASSERT( theStats.m_exits >= M || (testMode & tmAutoinitialization), "Too few on_exit calls" );
+ if ( !(testMode & tmLocalObservation) ) {
+ ASSERT( theStats.m_entries <= M * M * P, "Too many on_entry calls" );
+ ASSERT( theStats.m_exits <= M * M * T, "Too many on_exit calls" );
+ }
+ ASSERT( theStats.m_entries >= theStats.m_exits, "More exits than entries" );
+ }
}
int TestMain () {
- for( int p=MinThread; p<=MaxThread; ++p )
- for( int q=MinThread; q<=MaxThread; ++q )
- TestObserver(p,q);
- ASSERT( EntryCount>0, "on_scheduler_entry not exercised" );
- ASSERT( ExitCount>0, "on_scheduler_exit not exercised" );
+ if ( P < 2 )
+ return Harness::Skipped;
+ theNumObservers = 0;
+ theWorkersBarrier.initialize(P);
+ // Fully- and under-utilized mode
+ for ( int M = 1; M < P; M <<= 1 ) {
+ if ( M > P/2 ) {
+ ASSERT( P & (P-1), "Can get here only in case of non power of two cores" );
+ M = P/2;
+ if ( M & (M-1) )
+ break; // Already tested this configuration
+ }
+ int T = P / M;
+ ASSERT( T > 1, NULL );
+ REMARK( "Masters: %d; Arena size: %d\n", M, T );
+ theMasterBarrier.initialize(M);
+ theGlobalBarrier.initialize(M * T);
+ TestObserver(M, T, 0);
+ TestObserver(M, T, tmLocalObservation | ( T==P? tmAutoinitialization : 0) );
+ CleanLocalState();
+ TestObserver(M, T, tmSynchronized);
+ TestObserver(M, T, tmSynchronized | tmLocalObservation
+#if __TBB_TASK_ARENA
+ | ( T==P? tmLeavingControl : 0)
+#endif
+ );
+ }
+ // Oversubscribed mode
+ for ( int i = 0; i < 5; ++i ) {
+ REMARK( "Masters: %d; Arena size: %d\n", P-1, P );
+ TestObserver(P-1, P, 0);
+ TestObserver(P-1, P, tmLocalObservation);
+ }
+ Harness::Sleep(20);
return Harness::Done;
}
+
+#else /* !__TBB_SCHEDULER_OBSERVER */
+
+int TestMain () {
+ return Harness::Skipped;
+}
+#endif /* !__TBB_SCHEDULER_OBSERVER */
diff --git a/src/test/test_task_steal_limit.cpp b/src/test/test_task_steal_limit.cpp
index 5cb22c6..aeaf75e 100644
--- a/src/test/test_task_steal_limit.cpp
+++ b/src/test/test_task_steal_limit.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -74,8 +74,14 @@ void TestStealingIsEnabled () {
}
int TestMain () {
- if ( tbb::task_scheduler_init::default_num_threads() == 1 )
+#if !__TBB_THREAD_LOCAL_VARIABLES_PRESENT
+ REPORT( "Known issue: Test skipped because no compiler support for __thread keyword.\n" );
+ return Harness::Skipped;
+#endif
+ if ( tbb::task_scheduler_init::default_num_threads() == 1 ) {
+ REPORT( "Known issue: Test requires at least 2 hardware threads.\n" );
return Harness::Skipped;
+ }
TestStealingIsEnabled();
return Harness::Done;
}
diff --git a/src/test/test_tbb_condition_variable.cpp b/src/test/test_tbb_condition_variable.cpp
index b2e8a89..2db8b93 100644
--- a/src/test/test_tbb_condition_variable.cpp
+++ b/src/test/test_tbb_condition_variable.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_tbb_fork.cpp b/src/test/test_tbb_fork.cpp
new file mode 100644
index 0000000..6cead71
--- /dev/null
+++ b/src/test/test_tbb_fork.cpp
@@ -0,0 +1,203 @@
+/*
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#define TBB_PREVIEW_WAITING_FOR_WORKERS 1
+#include "tbb/task_scheduler_init.h"
+#include "tbb/blocked_range.h"
+#include "tbb/cache_aligned_allocator.h"
+#include "tbb/parallel_for.h"
+
+#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#include "harness.h"
+
+#if _WIN32||_WIN64
+#include "tbb/concurrent_hash_map.h"
+
+HANDLE getCurrentThreadHandle()
+{
+ HANDLE hProc = GetCurrentProcess(), hThr = INVALID_HANDLE_VALUE;
+#if TBB_USE_ASSERT
+ BOOL res =
+#endif
+ DuplicateHandle( hProc, GetCurrentThread(), hProc, &hThr, 0, FALSE, DUPLICATE_SAME_ACCESS );
+ __TBB_ASSERT( res, "Retrieving current thread handle failed" );
+ return hThr;
+}
+
+bool threadTerminated(HANDLE h)
+{
+ DWORD ret = WaitForSingleObjectEx(h, 0, FALSE);
+ return WAIT_OBJECT_0 == ret;
+}
+
+struct Data {
+ HANDLE h;
+};
+
+typedef tbb::concurrent_hash_map<DWORD, Data> TidTableType;
+
+static TidTableType tidTable;
+
+#else
+
+#if __sun || __SUNPRO_CC
+#define _POSIX_PTHREAD_SEMANTICS 1 // to get standard-conforming sigwait(2)
+#endif
+#include <signal.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sched.h>
+
+#include "tbb/tick_count.h"
+
+static void SigHandler(int) { }
+
+#endif // _WIN32||_WIN64
+
+class AllocTask {
+public:
+ void operator() (const tbb::blocked_range<int> &r) const {
+#if _WIN32||_WIN64
+ HANDLE h = getCurrentThreadHandle();
+ DWORD tid = GetCurrentThreadId();
+ {
+ TidTableType::accessor acc;
+ if (tidTable.insert(acc, tid)) {
+ acc->second.h = h;
+ }
+ }
+#endif
+ for (int y = r.begin(); y != r.end(); ++y) {
+ void *p = tbb::internal::NFS_Allocate(1, 7000, NULL);
+ tbb::internal::NFS_Free(p);
+ }
+ }
+ AllocTask() {}
+};
+
+int TestMain()
+{
+ using namespace Harness;
+
+#if _WIN32||_WIN64
+ DWORD masterTid = GetCurrentThreadId();
+#else
+ bool child = false;
+ struct sigaction sa;
+ sigset_t sig_set;
+
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = 0;
+ sa.sa_handler = SigHandler;
+ if (sigaction(SIGCHLD, &sa, NULL))
+ ASSERT(0, "sigaction failed");
+ if (sigaction(SIGALRM, &sa, NULL))
+ ASSERT(0, "sigaction failed");
+ // block SIGCHLD and SIGALRM, the mask is inherited by worker threads
+ sigemptyset(&sig_set);
+ sigaddset(&sig_set, SIGCHLD);
+ sigaddset(&sig_set, SIGALRM);
+ if (pthread_sigmask(SIG_BLOCK, &sig_set, NULL))
+ ASSERT(0, "pthread_sigmask failed");
+#endif
+ for (int threads = 16; threads<=64; threads+=16) {
+ for (int i=0; i<20; i++) {
+ {
+ tbb::task_scheduler_init sch(threads, 0, /*wait_workers=*/true);
+ }
+ tbb::task_scheduler_init sch(threads, 0, /*wait_workers=*/true);
+
+ tbb::parallel_for(tbb::blocked_range<int>(0, 10000, 1), AllocTask(),
+ tbb::simple_partitioner());
+ sch.terminate();
+
+#if _WIN32||_WIN64
+ // check that there is no alive threads after terminate()
+ for (TidTableType::const_iterator it = tidTable.begin();
+ it != tidTable.end(); ++it) {
+ if (masterTid != it->first) {
+ ASSERT(threadTerminated(it->second.h), NULL);
+ }
+ }
+ tidTable.clear();
+#else // _WIN32||_WIN64
+ if (child)
+ exit(0);
+ else {
+ pid_t pid = fork();
+ if (!pid) {
+ i = -1;
+ child = true;
+ } else {
+ int sig;
+ pid_t w_ret = 0;
+ // wait for SIGCHLD up to timeout
+ alarm(30);
+ if (0 != sigwait(&sig_set, &sig))
+ ASSERT(0, "sigwait failed");
+ alarm(0);
+ w_ret = waitpid(pid, NULL, WNOHANG);
+ ASSERT(w_ret>=0, "waitpid failed");
+ if (!w_ret) {
+ ASSERT(!kill(pid, SIGKILL), NULL);
+ w_ret = waitpid(pid, NULL, 0);
+ ASSERT(w_ret!=-1, "waitpid failed");
+
+ ASSERT(0, "Hang after fork");
+ }
+ // clean pending signals (if any occurs since sigwait)
+ sigset_t p_mask;
+ for (;;) {
+ sigemptyset(&p_mask);
+ sigpending(&p_mask);
+ if (sigismember(&p_mask, SIGALRM)
+ || sigismember(&p_mask, SIGCHLD)) {
+ if (0 != sigwait(&p_mask, &sig))
+ ASSERT(0, "sigwait failed");
+ } else
+ break;
+ }
+ }
+ }
+#endif // _WIN32||_WIN64
+ }
+ }
+#if TBB_USE_EXCEPTIONS
+ try {
+ {
+ tbb::task_scheduler_init schBlock(2, 0, /*wait_workers=*/true);
+ tbb::task_scheduler_init schBlock1(2, 0, /*wait_workers=*/true);
+ }
+ ASSERT(0, "Nesting of blocking schedulers is impossible.");
+ } catch (...) {}
+#endif
+
+ return Harness::Done;
+}
+
diff --git a/src/test/test_tbb_header.cpp b/src/test/test_tbb_header.cpp
index 38794dd..a2cbed4 100644
--- a/src/test/test_tbb_header.cpp
+++ b/src/test/test_tbb_header.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -33,10 +33,16 @@
Most of the checks happen at the compilation or link phases.
**/
-#include "tbb/tbb.h"
#if _MSC_VER
#pragma warning (disable : 4503) // decorated name length exceeded, name was truncated
+#if !TBB_USE_EXCEPTIONS
+ // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+ #pragma warning (push)
+ #pragma warning (disable: 4530)
+#endif
#endif
+
+#include "tbb/tbb.h"
#include "tbb/flow_graph.h"
static volatile size_t g_sink;
@@ -45,9 +51,6 @@ static volatile size_t g_sink;
#define TestTypeDefinitionPresence2(TypeStart, TypeEnd) g_sink = sizeof(tbb::TypeStart,TypeEnd);
#define TestFuncDefinitionPresence(Fn, Args, ReturnType) { ReturnType (*pfn)Args = &tbb::Fn; (void)pfn; }
-//! Utility template function to prevent "unused" warnings by various compilers.
-template<typename T> void squelch_unused_warning( const T& ) {}
-
struct Body {
void operator() () const {}
};
@@ -83,6 +86,12 @@ struct Body3 {
// Test if all the necessary symbols are exported for the exceptions thrown by TBB.
// Missing exports result either in link error or in runtime assertion failure.
#include "tbb/tbb_exception.h"
+#include <stdexcept>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
template <typename E>
void TestExceptionClassExports ( const E& exc, tbb::internal::exception_id eid ) {
@@ -105,9 +114,9 @@ void TestExceptionClassExports ( const E& exc, tbb::internal::exception_id eid )
ASSERT ( __TBB_EXCEPTION_TYPE_INFO_BROKEN, "Unrecognized exception. Likely RTTI related exports are missing" );
}
}
-#else /* !TBB_USE_EXCEPTIONS */
+#else /* TBB_USE_EXCEPTIONS */
(void)exc;
-#endif /* !TBB_USE_EXCEPTIONS */
+#endif /* TBB_USE_EXCEPTIONS */
}
void TestExceptionClassesExports () {
@@ -147,7 +156,7 @@ int TestMain ()
TestTypeDefinitionPresence( flow::graph );
TestTypeDefinitionPresence( flow::source_node<int> );
TestTypeDefinitionPresence2( flow::function_node<int, int> );
- typedef std::tuple<int, int> intpair;
+ typedef tbb::flow::tuple<int, int> intpair;
TestTypeDefinitionPresence2( flow::multifunction_node<int, intpair> );
TestTypeDefinitionPresence( flow::split_node<intpair> );
TestTypeDefinitionPresence( flow::continue_node<int> );
@@ -159,10 +168,8 @@ int TestMain ()
TestTypeDefinitionPresence( flow::sequencer_node<int> );
TestTypeDefinitionPresence( flow::priority_queue_node<int> );
TestTypeDefinitionPresence( flow::limiter_node<int> );
- typedef tbb::flow::interface6::internal::graph_policy_namespace::graph_buffer_policy join_policy;
- const join_policy a = tbb::flow::interface6::internal::graph_policy_namespace::queueing;
- TestTypeDefinitionPresence2( flow::join_node< intpair, a > );
- squelch_unused_warning(a);
+ using tbb::flow::queueing;
+ TestTypeDefinitionPresence2( flow::join_node< intpair, queueing > );
TestTypeDefinitionPresence( mutex );
TestTypeDefinitionPresence( null_mutex );
TestTypeDefinitionPresence( null_rw_mutex );
diff --git a/src/test/test_tbb_thread.cpp b/src/test/test_tbb_thread.cpp
index d5e6076..8e530f7 100644
--- a/src/test/test_tbb_thread.cpp
+++ b/src/test/test_tbb_thread.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_tbb_version.cpp b/src/test/test_tbb_version.cpp
index 298f17d..a9f7533 100644
--- a/src/test/test_tbb_version.cpp
+++ b/src/test/test_tbb_version.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -28,6 +28,15 @@
#include "tbb/tbb_stddef.h"
+#if __TBB_WIN8UI_SUPPORT
+// TODO: figure out how the test can be enabled for win8ui
+#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#include "harness.h"
+int TestMain() {
+ return Harness::Skipped;
+}
+#else
+
#include <stdio.h>
#include <stdlib.h>
@@ -74,15 +83,15 @@ const char stdout_stream[] = "version_test.out";
HARNESS_EXPORT
int main(int argc, char *argv[] ) {
- char psBuffer[512];
+ const size_t psBuffer_len = 512;
+ char psBuffer[psBuffer_len];
/* We first introduced runtime version identification in 3014 */
#if TBB_INTERFACE_VERSION>=3014
// For now, just test that run-time TBB version matches the compile-time version,
// since otherwise the subsequent test of "TBB: INTERFACE VERSION" string will fail anyway.
// We need something more clever in future.
if ( tbb::TBB_runtime_interface_version()!=TBB_INTERFACE_VERSION ){
- snprintf( psBuffer,
- 512,
+ snprintf( psBuffer, psBuffer_len,
"%s %s %d %s %d.",
"Running with the library of different version than the test was compiled against.",
"Expected",
@@ -93,12 +102,12 @@ int main(int argc, char *argv[] ) {
ASSERT( tbb::TBB_runtime_interface_version()==TBB_INTERFACE_VERSION, psBuffer );
}
#endif
-#if __TBB_MIC
+#if __TBB_MIC_OFFLOAD
// Skip the test in offload mode.
// Run the test in 'true' native mode (because 'system()' works in 'true' native mode).
(argc, argv);
REPORT("skip\n");
-#else //__TBB_MIC
+#else //__TBB_MIC_OFFLOAD
#if __TBB_MPI_INTEROP
REPORT("skip\n");
#else
@@ -139,7 +148,7 @@ int main(int argc, char *argv[] ) {
exit( 1 );
}
while( !feof( stream_err ) ) {
- if( fgets( psBuffer, 512, stream_err ) != NULL ){
+ if( fgets( psBuffer, psBuffer_len, stream_err ) != NULL ){
REPORT( "Error (step 1): stderr should be empty\n" );
exit( 1 );
}
@@ -151,7 +160,7 @@ int main(int argc, char *argv[] ) {
exit( 1 );
}
while( !feof( stream_out ) ) {
- if( fgets( psBuffer, 512, stream_out ) != NULL ){
+ if( fgets( psBuffer, psBuffer_len, stream_out ) != NULL ){
REPORT( "Error (step 1): stdout should be empty\n" );
exit( 1 );
}
@@ -181,7 +190,7 @@ int main(int argc, char *argv[] ) {
exit( 1 );
}
while( !feof( stream_out ) ) {
- if( fgets( psBuffer, 512, stream_out ) != NULL ){
+ if( fgets( psBuffer, psBuffer_len, stream_out ) != NULL ){
REPORT( "Error (step 2): stdout should be empty\n" );
exit( 1 );
}
@@ -195,7 +204,7 @@ int main(int argc, char *argv[] ) {
}
while( !feof( stream_err ) ) {
- if( fgets( psBuffer, 512, stream_err ) != NULL ){
+ if( fgets( psBuffer, psBuffer_len, stream_err ) != NULL ){
if (strstr( psBuffer, "TBBmalloc: " )) {
// TBB allocator might or might not be here, ignore it
continue;
@@ -228,7 +237,7 @@ int main(int argc, char *argv[] ) {
}
REPORT("done\n");
#endif //__TBB_MPI_INTEROP
-#endif //__TBB_MIC
+#endif //__TBB_MIC_OFFLOAD
return 0;
}
@@ -236,8 +245,8 @@ int main(int argc, char *argv[] ) {
// Fill dictionary with version strings for platforms
void initialize_strings_vector(std::vector <string_pair>* vector)
{
- vector->push_back(string_pair("TBB: VERSION\t\t4.0", required)); // check TBB_VERSION
- vector->push_back(string_pair("TBB: INTERFACE VERSION\t6005", required)); // check TBB_INTERFACE_VERSION
+ vector->push_back(string_pair("TBB: VERSION\t\t4.1", required)); // check TBB_VERSION
+ vector->push_back(string_pair("TBB: INTERFACE VERSION\t6104", required)); // check TBB_INTERFACE_VERSION
vector->push_back(string_pair("TBB: BUILD_DATE", required));
vector->push_back(string_pair("TBB: BUILD_HOST", required));
vector->push_back(string_pair("TBB: BUILD_OS", required));
@@ -254,13 +263,22 @@ void initialize_strings_vector(std::vector <string_pair>* vector)
vector->push_back(string_pair("TBB: BUILD_KERNEL", required));
vector->push_back(string_pair("TBB: BUILD_SUNCC", required));
vector->push_back(string_pair("TBB: BUILD_COMPILER", optional)); //if( getenv("COMPILER_VERSION") )
-#else //We use version_info_linux.sh for unsupported OSes
+#else // We use version_info_linux.sh for unsupported OSes
+#if __ANDROID__
+ vector->push_back(string_pair("TBB: BUILD_TARGET_OS", required));
+ vector->push_back(string_pair("TBB: BUILD_TARGET_KERNEL", required));
+#else
vector->push_back(string_pair("TBB: BUILD_KERNEL", required));
+#endif // !__ANDROID__
vector->push_back(string_pair("TBB: BUILD_GCC", required));
vector->push_back(string_pair("TBB: BUILD_COMPILER", optional)); //if( getenv("COMPILER_VERSION") )
- vector->push_back(string_pair("TBB: BUILD_GLIBC", required));
+#if __ANDROID__
+ vector->push_back(string_pair("TBB: BUILD_NDK", optional));
+#else
+ vector->push_back(string_pair("TBB: BUILD_LIBC", required));
+#endif // !__ANDROID__
vector->push_back(string_pair("TBB: BUILD_LD", required));
-#endif
+#endif // OS
vector->push_back(string_pair("TBB: BUILD_TARGET", required));
vector->push_back(string_pair("TBB: BUILD_COMMAND", required));
vector->push_back(string_pair("TBB: TBB_USE_DEBUG", required));
@@ -281,3 +299,4 @@ void initialize_strings_vector(std::vector <string_pair>* vector)
vector->push_back(string_pair("TBB: Tools support", required));
return;
}
+#endif /* __TBB_WIN8UI_SUPPORT */
diff --git a/src/test/test_thread.h b/src/test/test_thread.h
index ef0ee61..659b5dd 100644
--- a/src/test/test_thread.h
+++ b/src/test/test_thread.h
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -91,28 +91,29 @@ public:
real_ids[num] = THIS_THREAD::get_id();
const double WAIT = .1;
- const double SHORT_TOLERANCE = 1e-8;
#if _WIN32 || _WIN64
const double LONG_TOLERANCE = 0.120; // maximal scheduling quantum for Windows Server
#else
const double LONG_TOLERANCE = 0.200; // reasonable upper bound
#endif
+ tbb::tick_count::interval_t test_interval(WAIT);
tbb::tick_count t0 = tbb::tick_count::now();
- tbb::this_tbb_thread::sleep( tbb::tick_count::interval_t(WAIT) );
+ THIS_THREAD_SLEEP ( test_interval );
tbb::tick_count t1 = tbb::tick_count::now();
- double delta = (t1-t0).seconds() - WAIT;
- if(delta+SHORT_TOLERANCE <= 0.0)
- REPORT("ERROR: Sleep interval too short (%g outside short tolerance(%g))\n", (t1-t0).seconds(), WAIT - SHORT_TOLERANCE);
+ double delta = ((t1-t0)-test_interval).seconds();
+ if(delta < 0.0)
+ REPORT("ERROR: Sleep interval too short (%g < %g)\n",
+ (t1-t0).seconds(), test_interval.seconds() );
if(delta > LONG_TOLERANCE)
- REPORT("Warning: Sleep interval too long (%g outside long tolerance(%g))\n", (t1-t0).seconds(), WAIT + LONG_TOLERANCE);
-
+ REPORT("Warning: Sleep interval too long (%g outside long tolerance(%g))\n",
+ (t1-t0).seconds(), test_interval.seconds() + LONG_TOLERANCE);
init_barrier.wait();
sum.fetch_and_add(num);
sum.fetch_and_add(dx.value);
}
void operator()(Data<0> d) {
- tbb::this_tbb_thread::sleep( tbb::tick_count::interval_t(d.value*1.) );
+ THIS_THREAD_SLEEP ( tbb::tick_count::interval_t(d.value*1.) );
}
};
@@ -234,8 +235,15 @@ void RunTests() {
for (int i=0; i<THRDS; i++)
thrs[i].join();
+
+#if !__TBB_WIN8UI_SUPPORT
+ // TODO: to find out the way to find thread_id without GetThreadId and other
+ // desktop functions.
+ // Now tbb_thread does have its own thread_id that stores std::thread object
+ // Test will fail in case it is run in desktop mode against New Windows*8 UI library
for (int i=0; i<THRDS; i++)
ASSERT( real_ids[i] == uniq_ids[i], NULL );
+#endif
int current_sum = sum;
ASSERT( current_sum == 104, NULL );
diff --git a/src/test/test_tick_count.cpp b/src/test/test_tick_count.cpp
index 4a07f89..f7e63fb 100644
--- a/src/test/test_tick_count.cpp
+++ b/src/test/test_tick_count.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -133,6 +133,26 @@ void TestTickCountDifference( int n ) {
}
}
+void TestResolution() {
+ static double target_value = 0.314159265358979323846264338327950288419;
+ static double step_value = 0.00027182818284590452353602874713526624977572;
+ static int range_value = 100;
+ double avg_diff = 0.0;
+ double max_diff = 0.0;
+ for( int i = -range_value; i <= range_value; ++i ) {
+ double my_time = target_value + step_value * i;
+ tbb::tick_count::interval_t t0(my_time);
+ double interval_time = t0.seconds();
+ avg_diff += (my_time - interval_time);
+ if ( max_diff < my_time-interval_time) max_diff = my_time-interval_time;
+ // time always truncates
+ ASSERT(interval_time >= 0 && my_time - interval_time < tbb::tick_count::resolution(), "tick_count resolution out of range");
+ }
+ avg_diff = (avg_diff/(2*range_value+1))/tbb::tick_count::resolution();
+ max_diff /= tbb::tick_count::resolution();
+ REMARK("avg_diff = %g ticks, max_diff = %g ticks\n", avg_diff, max_diff);
+}
+
int TestMain () {
tbb::tick_count t0 = tbb::tick_count::now();
TestSimpleDelay(/*ntrial=*/1000000,/*duration=*/0, /*tolerance=*/2E-6);
@@ -141,6 +161,8 @@ int TestMain () {
tbb::tick_count t2 = tbb::tick_count::now();
TestArithmetic(t0,t1,t2);
+ TestResolution();
+
for( int n=MinThread; n<=MaxThread; ++n ) {
TestTickCountDifference(n);
}
diff --git a/src/test/test_tuple.cpp b/src/test/test_tuple.cpp
index 03d7fd1..095598e 100644
--- a/src/test/test_tuple.cpp
+++ b/src/test/test_tuple.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
@@ -26,25 +26,25 @@
the GNU General Public License.
*/
-// tbb::tuple
+// tbb::flow::tuple (implementation used in tbb::flow)
+// if <tuple> is available on the compiler/platform, that version should be the
+// one tested.
#include "harness.h"
// this test should match that in graph.h, so we test whatever tuple is
// being used by the join_node.
-#if !__SUNPRO_CC
-#if TBB_IMPLEMENT_CPP0X && (!defined(_MSC_VER) || _MSC_VER < 1600)
-#define __TESTING_STD_TUPLE__ 0
-#define TBB_PREVIEW_TUPLE 1
-#include "tbb/compat/tuple"
-#else
+#if __TBB_CPP11_TUPLE_PRESENT
#define __TESTING_STD_TUPLE__ 1
#include <tuple>
-#endif
+using namespace std;
+#else
+#define __TESTING_STD_TUPLE__ 0
+#include "tbb/compat/tuple"
+using namespace tbb::flow;
+#endif /*!__TBB_CPP11_TUPLE_PRESENT*/
#include <string>
#include <iostream>
-using namespace std;
-
class non_trivial {
public:
non_trivial() {}
@@ -59,6 +59,33 @@ private:
float my_float;
};
+template<typename T1, typename T2, typename T3, typename U1, typename U2, typename U3>
+void RunOneComparisonTest() {
+ typedef tuple<T1,T2,T3> t_tuple;
+ typedef tuple<U1,U2,U3> u_tuple;
+
+ ASSERT(t_tuple((T1)1,(T2)1,(T3)1) == u_tuple((U1)1,(U2)1,(U3)1),NULL);
+ ASSERT(t_tuple((T1)1,(T2)0,(T3)1) < u_tuple((U1)1,(U2)1,(U3)1),NULL);
+ ASSERT(t_tuple((T1)1,(T2)1,(T3)1) > u_tuple((U1)1,(U2)1,(U3)0),NULL);
+ ASSERT(t_tuple((T1)1,(T2)0,(T3)1) != u_tuple((U1)1,(U2)1,(U3)1),NULL);
+ ASSERT(t_tuple((T1)1,(T2)0,(T3)1) <= u_tuple((U1)1,(U2)1,(U3)0),NULL);
+ ASSERT(t_tuple((T1)1,(T2)0,(T3)0) <= u_tuple((U1)1,(U2)0,(U3)0),NULL);
+ ASSERT(t_tuple((T1)1,(T2)1,(T3)1) >= u_tuple((U1)1,(U2)0,(U3)1),NULL);
+ ASSERT(t_tuple((T1)0,(T2)1,(T3)1) >= u_tuple((U1)0,(U2)1,(U3)1),NULL);
+
+ ASSERT(!(t_tuple((T1)2,(T2)1,(T3)1) == u_tuple((U1)1,(U2)1,(U3)1)),NULL);
+ ASSERT(!(t_tuple((T1)1,(T2)2,(T3)1) == u_tuple((U1)1,(U2)1,(U3)1)),NULL);
+ ASSERT(!(t_tuple((T1)1,(T2)1,(T3)2) == u_tuple((U1)1,(U2)1,(U3)1)),NULL);
+
+ ASSERT(!(t_tuple((T1)1,(T2)1,(T3)1) < u_tuple((U1)1,(U2)1,(U3)1)),NULL);
+ ASSERT(!(t_tuple((T1)1,(T2)1,(T3)1) > u_tuple((U1)1,(U2)1,(U3)1)),NULL);
+ ASSERT(!(t_tuple((T1)1,(T2)1,(T3)1) != u_tuple((U1)1,(U2)1,(U3)1)),NULL);
+
+ ASSERT(t_tuple((T1)1,(T2)1,(T3)1) <= u_tuple((U1)1,(U2)1,(U3)1),NULL);
+ ASSERT(t_tuple((T1)1,(T2)1,(T3)1) >= u_tuple((U1)1,(U2)1,(U3)1),NULL);
+
+}
+
void RunTests() {
#if __TESTING_STD_TUPLE__
@@ -138,8 +165,10 @@ void RunTests() {
ASSERT(int_tuple_type(0,0,1) <= int_tuple_type(0,0,1),NULL);
ASSERT(int_tuple_type(1,1,1) >= int_tuple_type(1,0,0),NULL);
ASSERT(int_tuple_type(0,1,1) >= int_tuple_type(0,1,1),NULL);
+
typedef tuple<int,float,double,char> mixed_tuple_left;
typedef tuple<float,int,char,double> mixed_tuple_right;
+
ASSERT(mixed_tuple_left(1,1.f,1,1) == mixed_tuple_right(1.f,1,1,1),NULL);
ASSERT(mixed_tuple_left(1,0.f,1,1) < mixed_tuple_right(1.f,1,1,1),NULL);
ASSERT(mixed_tuple_left(1,1.f,1,1) > mixed_tuple_right(1.f,1,0,1),NULL);
@@ -149,16 +178,31 @@ void RunTests() {
ASSERT(mixed_tuple_left(1,1.f,1,0) >= mixed_tuple_right(1.f,0,1,1),NULL);
ASSERT(mixed_tuple_left(0,1.f,1,0) >= mixed_tuple_right(0.f,1,1,0),NULL);
+ ASSERT(!(mixed_tuple_left(2,1.f,1,1) == mixed_tuple_right(1.f,1,1,1)),NULL);
+ ASSERT(!(mixed_tuple_left(1,2.f,1,1) == mixed_tuple_right(1.f,1,1,1)),NULL);
+ ASSERT(!(mixed_tuple_left(1,1.f,2,1) == mixed_tuple_right(1.f,1,1,1)),NULL);
+ ASSERT(!(mixed_tuple_left(1,1.f,1,2) == mixed_tuple_right(1.f,1,1,1)),NULL);
+
+ ASSERT(!(mixed_tuple_left(1,1.f,1,1) < mixed_tuple_right(1.f,1,1,1)),NULL);
+ ASSERT(!(mixed_tuple_left(1,1.f,1,1) > mixed_tuple_right(1.f,1,1,1)),NULL);
+ ASSERT(!(mixed_tuple_left(1,1.f,1,1) != mixed_tuple_right(1.f,1,1,1)),NULL);
+
+ ASSERT(mixed_tuple_left(1,1.f,1,1) <= mixed_tuple_right(1.f,1,1,1),NULL);
+ ASSERT(mixed_tuple_left(1,1.f,1,1) >= mixed_tuple_right(1.f,1,1,1),NULL);
+
+ RunOneComparisonTest<int,float,char,float,char,int>();
+ RunOneComparisonTest<double,float,char,float,double,int>();
+ RunOneComparisonTest<int,float,char,short,char,short>();
+ RunOneComparisonTest<double,float,short,float,char,int>();
+
+
+ // the following should result in a syntax error
+ // typedef tuple<float,float> mixed_short_tuple;
+ // ASSERT(mixed_tuple_left(1,1.f,1,1) != mixed_short_tuple(1.f,1.f),NULL);
+
}
int TestMain() {
RunTests();
return Harness::Done;
}
-#else // __SUNPRO_CC
-
-int TestMain() {
- return Harness::Skipped;
-}
-
-#endif // __SUNPRO_CC
diff --git a/src/test/test_write_once_node.cpp b/src/test/test_write_once_node.cpp
index 86206e3..e7132be 100644
--- a/src/test/test_write_once_node.cpp
+++ b/src/test/test_write_once_node.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
diff --git a/src/test/test_yield.cpp b/src/test/test_yield.cpp
index 65aee4b..179fe62 100644
--- a/src/test/test_yield.cpp
+++ b/src/test/test_yield.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2005-2012 Intel Corporation. All Rights Reserved.
+ Copyright 2005-2013 Intel Corporation. All Rights Reserved.
This file is part of Threading Building Blocks.
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/tbb.git
More information about the debian-science-commits
mailing list